@antlur/backstage 1.12.11 → 1.12.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/endpoints/website.d.ts +2 -2
- package/dist/endpoints/website.d.ts.map +1 -1
- package/dist/endpoints/website.js +10 -8
- package/dist/studio/types/block.d.ts +9 -2
- package/dist/studio/types/block.d.ts.map +1 -1
- package/dist/studio/types/field.d.ts +10 -1
- package/dist/studio/types/field.d.ts.map +1 -1
- package/dist/studio/types/layout.d.ts +9 -2
- package/dist/studio/types/layout.d.ts.map +1 -1
- package/package.json +1 -1
- package/readme.md +55 -0
- package/src/endpoints/website.ts +10 -8
- package/src/studio/types/block.ts +13 -4
- package/src/studio/types/field.ts +15 -4
- package/src/studio/types/layout.ts +13 -4
|
@@ -12,9 +12,9 @@ export interface UpdateWebsiteParams {
|
|
|
12
12
|
}
|
|
13
13
|
export declare class WebsiteService extends BaseService {
|
|
14
14
|
getWebsites(options?: RequestInit): Promise<Website[]>;
|
|
15
|
-
getWebsite(
|
|
15
|
+
getWebsite(options?: RequestInit): Promise<Website>;
|
|
16
16
|
createWebsite(params: CreateWebsiteParams, options?: RequestInit): Promise<Website>;
|
|
17
17
|
updateWebsite(id: string, params: UpdateWebsiteParams, options?: RequestInit): Promise<Website>;
|
|
18
|
-
routes(
|
|
18
|
+
routes(options?: RequestInit): Promise<string[]>;
|
|
19
19
|
}
|
|
20
20
|
//# sourceMappingURL=website.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"website.d.ts","sourceRoot":"","sources":["../../src/endpoints/website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4C,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,cAAe,SAAQ,WAAW;IACvC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAKtD,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"website.d.ts","sourceRoot":"","sources":["../../src/endpoints/website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4C,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,cAAe,SAAQ,WAAW;IACvC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAKtD,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnD,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnF,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/F,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKvD"}
|
|
@@ -4,11 +4,12 @@ export class WebsiteService extends BaseService {
|
|
|
4
4
|
const { data } = await this.client.get("/websites", options);
|
|
5
5
|
return data;
|
|
6
6
|
}
|
|
7
|
-
async getWebsite(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
async getWebsite(options) {
|
|
8
|
+
// Handle case where id might be an object (e.g., RequestInit passed as first param)
|
|
9
|
+
// if (id && typeof id === "string") {
|
|
10
|
+
// const { data } = await this.client.get<ApiSingleResponse<Website>>(`/websites/${id}`, options);
|
|
11
|
+
// return data;
|
|
12
|
+
// }
|
|
12
13
|
const res = await this.client.get("/websites", options);
|
|
13
14
|
return res.data[0];
|
|
14
15
|
}
|
|
@@ -20,8 +21,9 @@ export class WebsiteService extends BaseService {
|
|
|
20
21
|
const { data } = await this.client.put(`/websites/${id}`, params, options);
|
|
21
22
|
return data;
|
|
22
23
|
}
|
|
23
|
-
async routes(
|
|
24
|
-
const id = websiteId || (await this.getWebsite()).id;
|
|
25
|
-
|
|
24
|
+
async routes(options) {
|
|
25
|
+
// const id = websiteId || (await this.getWebsite()).id;
|
|
26
|
+
const website = await this.getWebsite();
|
|
27
|
+
return this.client.get(`/websites/${website.id}/routes`, options);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { Field, FieldType, FieldTypeToValue } from "./field";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
3
|
+
type Nullable<T> = T | null;
|
|
2
4
|
type FieldValues<T extends readonly Field[]> = {
|
|
3
5
|
[K in T[number]["slug"]]: Extract<T[number], {
|
|
4
6
|
slug: K;
|
|
5
|
-
}> extends {
|
|
7
|
+
}> extends infer FieldDef ? FieldDef extends {
|
|
8
|
+
type: 'reference';
|
|
9
|
+
is_multiple: true;
|
|
10
|
+
} ? Nullable<Entry[]> : FieldDef extends {
|
|
11
|
+
type: 'reference';
|
|
12
|
+
} ? Nullable<Entry> : FieldDef extends {
|
|
6
13
|
type: infer Type;
|
|
7
|
-
} ? Type extends FieldType ? FieldTypeToValue[Type] : never : never;
|
|
14
|
+
} ? Type extends FieldType ? FieldTypeToValue[Type] : never : never : never;
|
|
8
15
|
};
|
|
9
16
|
export interface BlockSchema<TFields extends readonly Field[]> {
|
|
10
17
|
fields: TFields;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../src/studio/types/block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../src/studio/types/block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAG5B,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,IAAI;KAC5C,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,SAAS,MAAM,QAAQ,GAC5E,QAAQ,SAAS;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,GACvD,QAAQ,CAAC,KAAK,EAAE,CAAC,GACjB,QAAQ,SAAS;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,GACpC,QAAQ,CAAC,KAAK,CAAC,GACf,QAAQ,SAAS;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GACnC,IAAI,SAAS,SAAS,GACpB,gBAAgB,CAAC,IAAI,CAAC,GACtB,KAAK,GACP,KAAK,GACX,KAAK;CACV,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,OAAO,SAAS,SAAS,KAAK,EAAE;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,SAAS,KAAK,EAAE;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,WAAW,CAAC,SAAS,KAAK,EAAE,CAAC;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,WAAW,CAAC,SAAS,KAAK,EAAE,CAAC;IAChF,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACpG;AAED,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,WAAW,CAAC,SAAS,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC,aAAa,CAC7F,mBAAmB,CAAC,OAAO,CAAC,CAC7B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MediaItem } from "../../types";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
2
3
|
type Nullable<T> = T | null;
|
|
3
4
|
export type FieldTypeToValue = {
|
|
4
5
|
boolean: Nullable<boolean>;
|
|
@@ -11,8 +12,10 @@ export type FieldTypeToValue = {
|
|
|
11
12
|
menu_select: Nullable<string>;
|
|
12
13
|
number: Nullable<number>;
|
|
13
14
|
press_select: Nullable<string>;
|
|
15
|
+
reference: Nullable<Entry | Entry[]>;
|
|
14
16
|
repeater: Nullable<any[]>;
|
|
15
17
|
rich_text: Nullable<string>;
|
|
18
|
+
select: Nullable<string>;
|
|
16
19
|
separator: never;
|
|
17
20
|
spacer: never;
|
|
18
21
|
text: Nullable<string>;
|
|
@@ -32,10 +35,16 @@ export type BaseField = {
|
|
|
32
35
|
label: string;
|
|
33
36
|
value: any;
|
|
34
37
|
}>;
|
|
38
|
+
allowed_references?: string[];
|
|
39
|
+
is_multiple?: boolean;
|
|
35
40
|
fields?: Field[];
|
|
36
41
|
};
|
|
37
42
|
export type Field = {
|
|
38
|
-
[K in FieldType]: BaseField & {
|
|
43
|
+
[K in FieldType]: K extends 'reference' ? BaseField & {
|
|
44
|
+
type: K;
|
|
45
|
+
value?: FieldTypeToValue[K];
|
|
46
|
+
is_multiple?: boolean;
|
|
47
|
+
} : BaseField & {
|
|
39
48
|
type: K;
|
|
40
49
|
value?: FieldTypeToValue[K];
|
|
41
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/studio/types/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/studio/types/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtB,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC/C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;KACjB,CAAC,IAAI,SAAS,GAAG,CAAC,SAAS,WAAW,GACnC,SAAS,GAAG;QACV,IAAI,EAAE,CAAC,CAAC;QACR,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,GACD,SAAS,GAAG;QACV,IAAI,EAAE,CAAC,CAAC;QACR,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;KAC7B;CACN,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { Field, FieldType, FieldTypeToValue } from "./field";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
3
|
+
type Nullable<T> = T | null;
|
|
2
4
|
type FieldValues<T extends readonly Field[]> = {
|
|
3
5
|
[K in T[number]["slug"]]: Extract<T[number], {
|
|
4
6
|
slug: K;
|
|
5
|
-
}> extends {
|
|
7
|
+
}> extends infer FieldDef ? FieldDef extends {
|
|
8
|
+
type: 'reference';
|
|
9
|
+
is_multiple: true;
|
|
10
|
+
} ? Nullable<Entry[]> : FieldDef extends {
|
|
11
|
+
type: 'reference';
|
|
12
|
+
} ? Nullable<Entry> : FieldDef extends {
|
|
6
13
|
type: infer Type;
|
|
7
|
-
} ? Type extends FieldType ? FieldTypeToValue[Type] : never : never;
|
|
14
|
+
} ? Type extends FieldType ? FieldTypeToValue[Type] : never : never : never;
|
|
8
15
|
};
|
|
9
16
|
export interface LayoutSchema<TFields extends readonly Field[]> {
|
|
10
17
|
fields: TFields;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/studio/types/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/studio/types/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAG5B,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,IAAI;KAC5C,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,SAAS,MAAM,QAAQ,GAC5E,QAAQ,SAAS;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,GACvD,QAAQ,CAAC,KAAK,EAAE,CAAC,GACjB,QAAQ,SAAS;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,GACpC,QAAQ,CAAC,KAAK,CAAC,GACf,QAAQ,SAAS;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GACnC,IAAI,SAAS,SAAS,GACpB,gBAAgB,CAAC,IAAI,CAAC,GACtB,KAAK,GACP,KAAK,GACX,KAAK;CACV,CAAC;AAEF,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,SAAS,KAAK,EAAE;IAC5D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,SAAS,KAAK,EAAE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,oBAAoB,CAAC,OAAO,SAAS,YAAY,CAAC,SAAS,KAAK,EAAE,CAAC;IAClF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACrG"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -143,6 +143,59 @@ export const heroBlock = defineBlock({
|
|
|
143
143
|
});
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
## Using Reference Fields
|
|
147
|
+
|
|
148
|
+
Reference fields allow you to link to entries from specific blueprints. You can constrain which blueprints are allowed:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// blocks/testimonials/schema.ts
|
|
152
|
+
import { defineBlockSchema, defineField } from "@antlur/backstage/studio";
|
|
153
|
+
|
|
154
|
+
const testimonialFields = [
|
|
155
|
+
defineField({
|
|
156
|
+
name: "Customers",
|
|
157
|
+
slug: "customers",
|
|
158
|
+
type: "reference",
|
|
159
|
+
description: "Select customer entries",
|
|
160
|
+
allowed_references: ["customers"], // Only allow entries from the "customers" blueprint
|
|
161
|
+
is_multiple: true, // Allow multiple customer selections
|
|
162
|
+
required: true,
|
|
163
|
+
}),
|
|
164
|
+
defineField({
|
|
165
|
+
name: "Quote",
|
|
166
|
+
slug: "quote",
|
|
167
|
+
type: "textarea",
|
|
168
|
+
description: "The testimonial quote",
|
|
169
|
+
required: true,
|
|
170
|
+
}),
|
|
171
|
+
];
|
|
172
|
+
|
|
173
|
+
export const schema = defineBlockSchema({
|
|
174
|
+
fields: testimonialFields,
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
In your component, the reference field will contain the full entry data:
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// blocks/testimonials/component.tsx
|
|
182
|
+
import type { BlockComponentProps } from "@antlur/backstage/studio";
|
|
183
|
+
import schema from "./schema";
|
|
184
|
+
|
|
185
|
+
export default function Testimonials({ block }: BlockComponentProps<typeof schema>) {
|
|
186
|
+
const { customers, quote } = block.fields;
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<div className="testimonial">
|
|
190
|
+
<blockquote>"{quote}"</blockquote>
|
|
191
|
+
<cite>
|
|
192
|
+
- {customers.map(customer => customer.name).join(", ")}
|
|
193
|
+
</cite> {/* Access entry properties */}
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
146
199
|
## CLI Commands
|
|
147
200
|
|
|
148
201
|
Sync your blocks and layouts to Backstage CMS:
|
|
@@ -197,6 +250,8 @@ Supported field types for blocks and layouts:
|
|
|
197
250
|
- `rich_text` - Rich text editor
|
|
198
251
|
- `number` - Numeric input
|
|
199
252
|
- `boolean` - Checkbox
|
|
253
|
+
- `select` - Select from predefined options
|
|
254
|
+
- `reference` - Reference to entries from specific blueprints (supports `is_multiple` for multiple selections)
|
|
200
255
|
- `url` - URL input
|
|
201
256
|
- `image` - Single image picker
|
|
202
257
|
- `image_list` - Multiple image picker
|
package/src/endpoints/website.ts
CHANGED
|
@@ -19,11 +19,12 @@ export class WebsiteService extends BaseService {
|
|
|
19
19
|
return data;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
async getWebsite(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
async getWebsite(options?: RequestInit): Promise<Website> {
|
|
23
|
+
// Handle case where id might be an object (e.g., RequestInit passed as first param)
|
|
24
|
+
// if (id && typeof id === "string") {
|
|
25
|
+
// const { data } = await this.client.get<ApiSingleResponse<Website>>(`/websites/${id}`, options);
|
|
26
|
+
// return data;
|
|
27
|
+
// }
|
|
27
28
|
const res = await this.client.get<ApiCollectionResponse<Website>>("/websites", options);
|
|
28
29
|
return res.data[0];
|
|
29
30
|
}
|
|
@@ -38,8 +39,9 @@ export class WebsiteService extends BaseService {
|
|
|
38
39
|
return data;
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
async routes(
|
|
42
|
-
const id = websiteId || (await this.getWebsite()).id;
|
|
43
|
-
|
|
42
|
+
async routes(options?: RequestInit): Promise<string[]> {
|
|
43
|
+
// const id = websiteId || (await this.getWebsite()).id;
|
|
44
|
+
const website = await this.getWebsite();
|
|
45
|
+
return this.client.get<string[]>(`/websites/${website.id}/routes`, options);
|
|
44
46
|
}
|
|
45
47
|
}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { Field, FieldType, FieldTypeToValue } from "./field";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
3
|
+
|
|
4
|
+
type Nullable<T> = T | null;
|
|
2
5
|
|
|
3
6
|
// Type for field values from array-based fields
|
|
4
7
|
type FieldValues<T extends readonly Field[]> = {
|
|
5
|
-
[K in T[number]["slug"]]: Extract<T[number], { slug: K }> extends
|
|
6
|
-
?
|
|
7
|
-
?
|
|
8
|
-
:
|
|
8
|
+
[K in T[number]["slug"]]: Extract<T[number], { slug: K }> extends infer FieldDef
|
|
9
|
+
? FieldDef extends { type: 'reference'; is_multiple: true }
|
|
10
|
+
? Nullable<Entry[]>
|
|
11
|
+
: FieldDef extends { type: 'reference' }
|
|
12
|
+
? Nullable<Entry>
|
|
13
|
+
: FieldDef extends { type: infer Type }
|
|
14
|
+
? Type extends FieldType
|
|
15
|
+
? FieldTypeToValue[Type]
|
|
16
|
+
: never
|
|
17
|
+
: never
|
|
9
18
|
: never;
|
|
10
19
|
};
|
|
11
20
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MediaItem } from "../../types";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
2
3
|
|
|
3
4
|
type Nullable<T> = T | null;
|
|
4
5
|
|
|
@@ -13,8 +14,10 @@ export type FieldTypeToValue = {
|
|
|
13
14
|
menu_select: Nullable<string>;
|
|
14
15
|
number: Nullable<number>;
|
|
15
16
|
press_select: Nullable<string>;
|
|
17
|
+
reference: Nullable<Entry | Entry[]>;
|
|
16
18
|
repeater: Nullable<any[]>;
|
|
17
19
|
rich_text: Nullable<string>;
|
|
20
|
+
select: Nullable<string>;
|
|
18
21
|
separator: never;
|
|
19
22
|
spacer: never;
|
|
20
23
|
text: Nullable<string>;
|
|
@@ -32,14 +35,22 @@ export type BaseField = {
|
|
|
32
35
|
placeholder?: string;
|
|
33
36
|
required?: boolean;
|
|
34
37
|
options?: Array<{ label: string; value: any }>;
|
|
38
|
+
allowed_references?: string[];
|
|
39
|
+
is_multiple?: boolean;
|
|
35
40
|
fields?: Field[];
|
|
36
41
|
};
|
|
37
42
|
|
|
38
43
|
export type Field = {
|
|
39
|
-
[K in FieldType]:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
[K in FieldType]: K extends 'reference'
|
|
45
|
+
? BaseField & {
|
|
46
|
+
type: K;
|
|
47
|
+
value?: FieldTypeToValue[K];
|
|
48
|
+
is_multiple?: boolean;
|
|
49
|
+
}
|
|
50
|
+
: BaseField & {
|
|
51
|
+
type: K;
|
|
52
|
+
value?: FieldTypeToValue[K];
|
|
53
|
+
};
|
|
43
54
|
}[FieldType];
|
|
44
55
|
|
|
45
56
|
// export interface Field<T extends FieldType = FieldType> {
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { Field, FieldType, FieldTypeToValue } from "./field";
|
|
2
|
+
import { Entry } from "../../types/entry";
|
|
3
|
+
|
|
4
|
+
type Nullable<T> = T | null;
|
|
2
5
|
|
|
3
6
|
// Type for field values from array-based fields
|
|
4
7
|
type FieldValues<T extends readonly Field[]> = {
|
|
5
|
-
[K in T[number]["slug"]]: Extract<T[number], { slug: K }> extends
|
|
6
|
-
?
|
|
7
|
-
?
|
|
8
|
-
:
|
|
8
|
+
[K in T[number]["slug"]]: Extract<T[number], { slug: K }> extends infer FieldDef
|
|
9
|
+
? FieldDef extends { type: 'reference'; is_multiple: true }
|
|
10
|
+
? Nullable<Entry[]>
|
|
11
|
+
: FieldDef extends { type: 'reference' }
|
|
12
|
+
? Nullable<Entry>
|
|
13
|
+
: FieldDef extends { type: infer Type }
|
|
14
|
+
? Type extends FieldType
|
|
15
|
+
? FieldTypeToValue[Type]
|
|
16
|
+
: never
|
|
17
|
+
: never
|
|
9
18
|
: never;
|
|
10
19
|
};
|
|
11
20
|
|