Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
336fdbc
feat(page-builder): add main Content page components
antony-lambdacurry Mar 8, 2025
f980596
feat(page-builder): simplify content page and create data table compo…
antony-lambdacurry Mar 11, 2025
15eebfc
feat(page-builder): rename models for consistency and introduce commo…
antony-lambdacurry Mar 13, 2025
0395d14
feat(page-builder): add pageBuilderModuleEvents for post creation events
antony-lambdacurry Mar 13, 2025
b07d71b
feat(page-builder): update post model and migration for handle column
antony-lambdacurry Mar 13, 2025
900e7f3
feat(page-builder): implement create post workflow and related types
antony-lambdacurry Mar 13, 2025
1d0f0d6
feat(page-builder): add admin post routes and middlewares
antony-lambdacurry Mar 13, 2025
41c70ac
feat(page-builder): implement ExtendedMedusaSDK and resource classes
antony-lambdacurry Mar 13, 2025
16469e8
feat(page-builder): add sdk.ts for ExtendedMedusaSDK initialization
antony-lambdacurry Mar 13, 2025
3b6ad24
fix(page-builder): replace fragment shorthand with Fragment component…
antony-lambdacurry Mar 13, 2025
3988c99
feat(page-builder): implement post creation and listing hooks
antony-lambdacurry Mar 13, 2025
09ce659
feat(page-builder): implement post update workflow and related types
antony-lambdacurry Mar 13, 2025
6881701
feat(page-builder): add post update functionality and related types
antony-lambdacurry Mar 13, 2025
51cfeaf
feat(page-builder): enhance post managemen
antony-lambdacurry Mar 17, 2025
d2c8d8e
feat(page-builder): add update and delete post functionality
antony-lambdacurry Mar 17, 2025
fea918a
feat(page-builder): add post update and delete hooks
antony-lambdacurry Mar 17, 2025
36c8582
feat(page-builder): implement duplicate post workflow and related steps
antony-lambdacurry Mar 19, 2025
daadc42
feat(page-builder): add duplicate post functionality and related types
antony-lambdacurry Mar 19, 2025
087769a
feat(page-builder): add POST route for duplicating posts
antony-lambdacurry Mar 19, 2025
3925212
feat(page-builder): add duplicate post functionality to posts data …
antony-lambdacurry Mar 19, 2025
e8921f1
refactor(page-builder): remove unused PostSection import in duplicate…
antony-lambdacurry Mar 19, 2025
b6c60a1
refactor(page-builder): change imports to type imports in posts route
antony-lambdacurry Mar 19, 2025
3626b2a
feat(page-builder): make post fields searchable in PostModel
antony-lambdacurry Mar 19, 2025
72e2490
feat(page-builder): implement useQueryParams hook and refactor PostsD…
antony-lambdacurry Mar 19, 2025
dd75ef0
feat(page-builder-types): add initial type definitions and package co…
antony-lambdacurry Mar 24, 2025
37933b6
feat(plugins-sdk): update version and add page builder resources
antony-lambdacurry Mar 24, 2025
f132a75
feat(page-builder): refactor post management and update dependencies
antony-lambdacurry Mar 24, 2025
6e6cd86
refactor(page-builder): update SDK imports and type definitions
antony-lambdacurry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/page-builder-types/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
node_modules
18 changes: 18 additions & 0 deletions packages/page-builder-types/package.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
{
"name": "@lambdacurry/medusa-page-builder-types",
"version": "0.0.4",
"packageManager": "yarn@4.6.0",
"types": "./src/index.d.ts",
"devDependencies": {
"typescript": "5.7.3"
},
"exports": {
".": "./src/index.d.ts"
},
"installConfig": {
"hoistingLimits": "workspaces"
},
"files": [
"src"
]
}
78 changes: 78 additions & 0 deletions packages/page-builder-types/src/admins.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
import type { Post } from './models'

// Response Types
export interface PaginatedResponse {
count: number
offset: number
limit: number
}

export type AdminPageBuilderListPostsQuery = {
offset?: number
limit?: number
q?: string
id?: string | string[]
title?: string
handle?: string
status?: PostStatus | PostStatus[]
type?: PostType | PostType[]
content_mode?: PostContentMode | PostContentMode[]
is_home_page?: boolean
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
published_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
archived_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
created_at?: any
// biome-ignore lint/suspicious/noExplicitAny: medusa infered type
updated_at?: any
order?: string
fields?: string
}

export interface AdminPageBuilderListPostsResponse extends PaginatedResponse {
posts: Post[]
}

export type AdminPageBuilderCreatePostBody = {
title: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderCreatePostResponse {
post: Post
}

export type AdminPageBuilderUpdatePostBody = {
id: string
title?: string
handle?: string
excerpt?: string
content?: Record<string, unknown>
status?: PostStatus
type?: PostType
content_mode?: PostContentMode
seo?: Record<string, unknown>
is_home_page?: boolean
}

export interface AdminPageBuilderUpdatePostResponse {
post: Post
}

export interface AdminPageBuilderDeletePostResponse {
id: string
object: string
deleted: boolean
}

export interface AdminPageBuilderDuplicatePostResponse {
post: Post
}
39 changes: 39 additions & 0 deletions packages/page-builder-types/src/common.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
/**
* Common type declarations for page builder
*/

export type PostStatus = 'draft' | 'published' | 'archived'

export type PostType = 'page' | 'post'

export type PostContentMode = 'basic' | 'advanced'

// These would be defined in the implementation file
export declare const postStatuses: readonly PostStatus[]
export declare const postTypes: readonly PostType[]
export declare const postContentModes: readonly PostContentMode[]

export interface SortOptions {
sort?: string
order?: 'ASC' | 'DESC'
}

export interface PaginationOptions {
limit?: number
offset?: number
}

export interface FilterOptions {
q?: string
[key: string]: unknown
}

export type QueryOptions = SortOptions & PaginationOptions & FilterOptions

export interface FindConfig<T> extends QueryOptions {
select?: (keyof T)[]
relations?: string[]
where?: { [K in keyof T]?: T[K] | T[K][] } & {
[key: string]: unknown
}
}
4 changes: 4 additions & 0 deletions packages/page-builder-types/src/index.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
export * from './admins'
export * from './common'
export * from './models'
export * from './storefronts'
92 changes: 92 additions & 0 deletions packages/page-builder-types/src/models.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
/**
* Type declarations for page builder models
*/

import type { PostContentMode, PostStatus, PostType } from './common'

export interface Base {
id: string
created_at: string
updated_at: string | undefined
}

export interface Post extends Base {
title: string
handle?: string | null
excerpt?: string | null
content?: Record<string, unknown> | null
status: PostStatus
type: PostType
content_mode: PostContentMode
seo?: Record<string, unknown> | null
is_home_page: boolean
published_at?: string | null
archived_at?: string | null
featured_image_id?: string
featured_image?: Image
authors?: PostAuthor[]
tags?: PostTag[]
sections?: PostSection[]
root_id?: string
root?: PostTemplate
}

export interface Image extends Base {
url: string
alt?: string
width?: number
height?: number
mime_type?: string
file_size?: number
metadata?: Record<string, unknown>
}

export interface NavigationItem extends Base {
title: string
url: string
parent_id?: string
parent?: NavigationItem
children?: NavigationItem[]
}

export interface PostAuthor extends Base {
name: string
bio?: string
posts?: Post[]
}

export interface PostSection extends Base {
name: string
data?: Record<string, unknown>
order: number
post_id?: string
post?: Post
parent_section_id?: string
parent_section?: PostSection
child_sections?: PostSection[]
}

export interface PostTag extends Base {
name: string
posts?: Post[]
}

export interface PostTemplate extends Base {
name: string
data?: Record<string, unknown>
posts?: Post[]
}

export interface SiteSettings extends Base {
site_name: string
site_url?: string
logo_id?: string
logo?: Image
favicon_id?: string
favicon?: Image
social_links?: Record<string, string>
navigation?: Record<string, NavigationItem[]>
custom_css?: string
custom_js?: string
meta_defaults?: Record<string, unknown>
}
49 changes: 49 additions & 0 deletions packages/page-builder-types/src/storefronts.d.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
/**
* Storefront type declarations for page builder
*/

import type { Post, PostAuthor, PostTag, SiteSettings } from './models'

export interface StorefrontGetPostParams {
handle: string
}

export interface StorefrontGetPostResponse {
post: Post
}

export interface StorefrontListPostsParams {
limit?: number
offset?: number
type?: string
tag?: string
author?: string
sort?: string
order?: 'asc' | 'desc'
}

export interface StorefrontListPostsResponse {
posts: Post[]
count: number
offset: number
limit: number
}

export interface StorefrontGetTagsResponse {
tags: PostTag[]
}

export interface StorefrontGetAuthorsResponse {
authors: PostAuthor[]
}

export interface StorefrontGetSiteSettingsResponse {
settings: SiteSettings
}

export interface StorefrontRenderOptions {
cacheControl?: string
handle?: string
language?: string
preview?: boolean
}
7 changes: 4 additions & 3 deletions packages/plugins-sdk/package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "@lambdacurry/medusa-plugins-sdk",
"version": "0.0.5",
"version": "0.0.6-beta.3",
"description": "SDK for Medusa plugins",
"author": "Lambda Curry (https://lambdacurry.dev)",
"license": "MIT",
Expand DownExpand Up@@ -38,15 +38,16 @@
"dev:publish": "yalc publish"
},
"devDependencies": {
"@medusajs/types": "^2.5.0",
"@medusajs/types": "^2.6.1",
"prettier": "^3.2.5",
"rimraf": "^6.0.1",
"tsup": "^8.0.2",
"typescript": "^5.7.2",
"yalc": "^1.0.0-pre.53"
},
"dependencies": {
"@medusajs/js-sdk": "^2.5.0",
"@lambdacurry/medusa-page-builder-types": "0.0.4",
"@medusajs/js-sdk": "^2.6.1",
"@types/express": "^5.0.0",
"@types/multer": "^1.4.12",
"form-data": "^4.0.2"
Expand Down
63 changes: 63 additions & 0 deletions packages/plugins-sdk/src/sdk/admin/admin-page-builder.ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
import type { Client } from '@medusajs/js-sdk'
import type {
AdminPageBuilderCreatePostBody,
AdminPageBuilderCreatePostResponse,
AdminPageBuilderListPostsQuery,
AdminPageBuilderListPostsResponse,
AdminPageBuilderDeletePostResponse,
AdminPageBuilderUpdatePostBody,
AdminPageBuilderUpdatePostResponse,
AdminPageBuilderDuplicatePostResponse,
} from '@lambdacurry/medusa-page-builder-types'

export class AdminPageBuilderResource {
constructor(private client: Client) {}

async listPosts(query: AdminPageBuilderListPostsQuery) {
return this.client.fetch<AdminPageBuilderListPostsResponse>(
'/admin/content/posts',
{
method: 'GET',
query,
},
)
}

async createPost(data: AdminPageBuilderCreatePostBody) {
return this.client.fetch<AdminPageBuilderCreatePostResponse>(
'/admin/content/posts',
{
method: 'POST',
body: data,
},
)
}

async updatePost(id: string, data: AdminPageBuilderUpdatePostBody) {
return this.client.fetch<AdminPageBuilderUpdatePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'PUT',
body: data,
},
)
}

async deletePost(id: string) {
return this.client.fetch<AdminPageBuilderDeletePostResponse>(
`/admin/content/posts/${id}`,
{
method: 'DELETE',
},
)
}

async duplicatePost(id: string) {
return this.client.fetch<AdminPageBuilderDuplicatePostResponse>(
`/admin/content/posts/${id}/duplicate`,
{
method: 'POST',
},
)
}
}
Loading