@antlur/backstage 1.1.0 → 1.2.1

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.
Files changed (83) hide show
  1. package/dist/cjs/client.js +2 -0
  2. package/dist/cjs/endpoints/blocks.js +16 -0
  3. package/dist/cjs/studio/define-block.js +19 -0
  4. package/dist/cjs/studio/define-field.js +6 -0
  5. package/dist/cjs/studio/define-schema.js +6 -0
  6. package/dist/cjs/studio/index.js +20 -0
  7. package/dist/cjs/studio/types/block.js +2 -0
  8. package/dist/cjs/studio/types/field-values.js +2 -0
  9. package/dist/cjs/studio/types/field.js +11 -0
  10. package/dist/cjs/studio/types/index.js +19 -0
  11. package/dist/cjs/types/index.js +1 -0
  12. package/dist/esm/client.d.ts +2 -0
  13. package/dist/esm/client.d.ts.map +1 -1
  14. package/dist/esm/client.js +2 -0
  15. package/dist/esm/config.d.ts +2 -0
  16. package/dist/esm/config.d.ts.map +1 -1
  17. package/dist/esm/endpoints/blocks.d.ts +13 -0
  18. package/dist/esm/endpoints/blocks.d.ts.map +1 -0
  19. package/dist/esm/endpoints/blocks.js +12 -0
  20. package/dist/esm/studio/define-block.d.ts +8 -0
  21. package/dist/esm/studio/define-block.d.ts.map +1 -0
  22. package/dist/esm/studio/define-block.js +16 -0
  23. package/dist/esm/studio/define-field.d.ts +3 -0
  24. package/dist/esm/studio/define-field.d.ts.map +1 -0
  25. package/dist/esm/studio/define-field.js +3 -0
  26. package/dist/esm/studio/define-schema.d.ts +4 -0
  27. package/dist/esm/studio/define-schema.d.ts.map +1 -0
  28. package/dist/esm/studio/define-schema.js +3 -0
  29. package/dist/esm/studio/index.d.ts +5 -0
  30. package/dist/esm/studio/index.d.ts.map +1 -0
  31. package/dist/esm/studio/index.js +4 -0
  32. package/dist/esm/studio/types/block.d.ts +31 -0
  33. package/dist/esm/studio/types/block.d.ts.map +1 -0
  34. package/dist/esm/studio/types/block.js +1 -0
  35. package/dist/esm/studio/types/field-values.d.ts +8 -0
  36. package/dist/esm/studio/types/field-values.d.ts.map +1 -0
  37. package/dist/esm/studio/types/field-values.js +1 -0
  38. package/dist/esm/studio/types/field.d.ts +40 -0
  39. package/dist/esm/studio/types/field.d.ts.map +1 -0
  40. package/dist/esm/studio/types/field.js +10 -0
  41. package/dist/esm/studio/types/index.d.ts +4 -0
  42. package/dist/esm/studio/types/index.d.ts.map +1 -0
  43. package/dist/esm/studio/types/index.js +3 -0
  44. package/dist/esm/types/index.d.ts +1 -0
  45. package/dist/esm/types/index.d.ts.map +1 -1
  46. package/dist/esm/types/index.js +1 -0
  47. package/dist/types/client.d.ts +2 -0
  48. package/dist/types/client.d.ts.map +1 -1
  49. package/dist/types/config.d.ts +2 -0
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/endpoints/blocks.d.ts +13 -0
  52. package/dist/types/endpoints/blocks.d.ts.map +1 -0
  53. package/dist/types/studio/define-block.d.ts +8 -0
  54. package/dist/types/studio/define-block.d.ts.map +1 -0
  55. package/dist/types/studio/define-field.d.ts +3 -0
  56. package/dist/types/studio/define-field.d.ts.map +1 -0
  57. package/dist/types/studio/define-schema.d.ts +4 -0
  58. package/dist/types/studio/define-schema.d.ts.map +1 -0
  59. package/dist/types/studio/index.d.ts +5 -0
  60. package/dist/types/studio/index.d.ts.map +1 -0
  61. package/dist/types/studio/types/block.d.ts +31 -0
  62. package/dist/types/studio/types/block.d.ts.map +1 -0
  63. package/dist/types/studio/types/field-values.d.ts +8 -0
  64. package/dist/types/studio/types/field-values.d.ts.map +1 -0
  65. package/dist/types/studio/types/field.d.ts +40 -0
  66. package/dist/types/studio/types/field.d.ts.map +1 -0
  67. package/dist/types/studio/types/index.d.ts +4 -0
  68. package/dist/types/studio/types/index.d.ts.map +1 -0
  69. package/dist/types/types/index.d.ts +1 -0
  70. package/dist/types/types/index.d.ts.map +1 -1
  71. package/package.json +6 -1
  72. package/src/client.ts +3 -0
  73. package/src/config.ts +2 -0
  74. package/src/endpoints/blocks.ts +22 -0
  75. package/src/studio/define-block.ts +27 -0
  76. package/src/studio/define-field.ts +5 -0
  77. package/src/studio/define-schema.ts +7 -0
  78. package/src/studio/index.ts +5 -0
  79. package/src/studio/types/block.ts +33 -0
  80. package/src/studio/types/field-values.ts +7 -0
  81. package/src/studio/types/field.ts +49 -0
  82. package/src/studio/types/index.ts +4 -0
  83. package/src/types/index.ts +2 -0
@@ -7,6 +7,7 @@ exports.BackstageClient = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
8
  const config_1 = require("./config");
9
9
  const alerts_1 = require("./endpoints/alerts");
10
+ const blocks_1 = require("./endpoints/blocks");
10
11
  const events_1 = require("./endpoints/events");
11
12
  const locations_1 = require("./endpoints/locations");
12
13
  const menus_1 = require("./endpoints/menus");
@@ -64,6 +65,7 @@ class BackstageClient {
64
65
  });
65
66
  // Initialize service instances
66
67
  this.alerts = new alerts_1.AlertService(this);
68
+ this.blocks = new blocks_1.BlocksService(this);
67
69
  this.events = new events_1.EventService(this);
68
70
  this.locations = new locations_1.LocationService(this);
69
71
  this.menus = new menus_1.MenuService(this);
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlocksService = void 0;
4
+ const base_1 = require("./base");
5
+ class BlocksService extends base_1.BaseService {
6
+ async all() { }
7
+ async create({ name, slug, schema }) {
8
+ const res = await this.client.post("/blocks", { name, slug, schema });
9
+ return res.data;
10
+ }
11
+ async update(id, { name, slug, schema }) {
12
+ const res = await this.client.put(`/blocks/${id}`, { name, slug, schema });
13
+ return res.data;
14
+ }
15
+ }
16
+ exports.BlocksService = BlocksService;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineBlock = defineBlock;
4
+ function defineBlock(options) {
5
+ // Runtime validation
6
+ if (!options.name || typeof options.name !== "string") {
7
+ throw new Error("Block name is required and must be a string");
8
+ }
9
+ if (!options.slug || typeof options.slug !== "string") {
10
+ throw new Error("Block slug is required and must be a string");
11
+ }
12
+ if (!options.schema || typeof options.schema !== "object") {
13
+ throw new Error("Block schema is required and must be an object");
14
+ }
15
+ if (!options.component) {
16
+ throw new Error("Block component is required");
17
+ }
18
+ return options;
19
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineField = defineField;
4
+ function defineField(field) {
5
+ return field;
6
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineSchema = defineSchema;
4
+ function defineSchema(schema) {
5
+ return schema;
6
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./define-block"), exports);
19
+ __exportStar(require("./define-field"), exports);
20
+ __exportStar(require("./define-schema"), exports);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // export interface Field<T extends FieldType = FieldType> {
4
+ // name: string;
5
+ // slug: string;
6
+ // type: FieldType;
7
+ // value?: FieldTypeToValue[T];
8
+ // placeholder?: string;
9
+ // required?: boolean;
10
+ // options?: Array<{ label: string; value: any }>;
11
+ // }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./block"), exports);
18
+ __exportStar(require("./field"), exports);
19
+ __exportStar(require("./field-values"), exports);
@@ -27,3 +27,4 @@ __exportStar(require("./navigation"), exports);
27
27
  __exportStar(require("./page"), exports);
28
28
  __exportStar(require("./press"), exports);
29
29
  __exportStar(require("./website"), exports);
30
+ __exportStar(require("../studio/types/index"), exports);
@@ -1,6 +1,7 @@
1
1
  import { AxiosInstance, AxiosRequestConfig } from "axios";
2
2
  import { BackstageUserConfig } from "./config";
3
3
  import { AlertService } from "./endpoints/alerts";
4
+ import { BlocksService } from "./endpoints/blocks";
4
5
  import { EventService } from "./endpoints/events";
5
6
  import { LocationService } from "./endpoints/locations";
6
7
  import { MenuService } from "./endpoints/menus";
@@ -11,6 +12,7 @@ import { WebsiteService } from "./endpoints/website";
11
12
  export declare class BackstageClient {
12
13
  private instance;
13
14
  readonly alerts: AlertService;
15
+ readonly blocks: BlocksService;
14
16
  readonly events: EventService;
15
17
  readonly locations: LocationService;
16
18
  readonly menus: MenuService;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAC5F,OAAO,EAAmB,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAGhC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,iBAAiB,CAAC;IAC9C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,SAAgB,OAAO,EAAE,cAAc,CAAC;gBAE5B,MAAM,CAAC,EAAE,mBAAmB;IAoE3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKvF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/E,gBAAgB,IAAI,aAAa;CAGzC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAC5F,OAAO,EAAmB,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAGhC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,MAAM,EAAE,aAAa,CAAC;IACtC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,iBAAiB,CAAC;IAC9C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,SAAgB,OAAO,EAAE,cAAc,CAAC;gBAE5B,MAAM,CAAC,EAAE,mBAAmB;IAqE3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKvF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/E,gBAAgB,IAAI,aAAa;CAGzC"}
@@ -1,6 +1,7 @@
1
1
  import axios from "axios";
2
2
  import { getGlobalConfig } from "./config";
3
3
  import { AlertService } from "./endpoints/alerts";
4
+ import { BlocksService } from "./endpoints/blocks";
4
5
  import { EventService } from "./endpoints/events";
5
6
  import { LocationService } from "./endpoints/locations";
6
7
  import { MenuService } from "./endpoints/menus";
@@ -58,6 +59,7 @@ export class BackstageClient {
58
59
  });
59
60
  // Initialize service instances
60
61
  this.alerts = new AlertService(this);
62
+ this.blocks = new BlocksService(this);
61
63
  this.events = new EventService(this);
62
64
  this.locations = new LocationService(this);
63
65
  this.menus = new MenuService(this);
@@ -1,8 +1,10 @@
1
1
  import { AxiosError } from "axios";
2
+ import type { BlockDefinition } from "./studio/types";
2
3
  export interface BackstageUserConfig {
3
4
  accountId?: string | undefined;
4
5
  token?: string | undefined;
5
6
  baseURL?: string;
7
+ blocks?: BlockDefinition<any>[] | undefined;
6
8
  onError?: (error: AxiosError) => void;
7
9
  }
8
10
  export declare function defineConfig(config: BackstageUserConfig): BackstageUserConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMnC,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CAGrD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CAGrD"}
@@ -0,0 +1,13 @@
1
+ import { BaseService } from "./base";
2
+ interface BlockParams {
3
+ name: string;
4
+ slug: string;
5
+ schema: any;
6
+ }
7
+ export declare class BlocksService extends BaseService {
8
+ all(): Promise<void>;
9
+ create({ name, slug, schema }: BlockParams): Promise<BlockParams>;
10
+ update(id: string, { name, slug, schema }: BlockParams): Promise<BlockParams>;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../src/endpoints/blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,aAAc,SAAQ,WAAW;IACtC,GAAG;IAEH,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;IAK1C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;CAI7D"}
@@ -0,0 +1,12 @@
1
+ import { BaseService } from "./base";
2
+ export class BlocksService extends BaseService {
3
+ async all() { }
4
+ async create({ name, slug, schema }) {
5
+ const res = await this.client.post("/blocks", { name, slug, schema });
6
+ return res.data;
7
+ }
8
+ async update(id, { name, slug, schema }) {
9
+ const res = await this.client.put(`/blocks/${id}`, { name, slug, schema });
10
+ return res.data;
11
+ }
12
+ }
@@ -0,0 +1,8 @@
1
+ import { BlockSchema, BlockDefinition, BlockComponentProps } from "./types";
2
+ export declare function defineBlock(options: {
3
+ name: string;
4
+ slug: string;
5
+ schema: BlockSchema<any>;
6
+ component: React.ComponentType<BlockComponentProps<typeof options.schema>>;
7
+ }): BlockDefinition<typeof options.schema.fields>;
8
+ //# sourceMappingURL=define-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block.d.ts","sourceRoot":"","sources":["../../../src/studio/define-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE5E,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5E,GAAG,eAAe,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAmBhD"}
@@ -0,0 +1,16 @@
1
+ export function defineBlock(options) {
2
+ // Runtime validation
3
+ if (!options.name || typeof options.name !== "string") {
4
+ throw new Error("Block name is required and must be a string");
5
+ }
6
+ if (!options.slug || typeof options.slug !== "string") {
7
+ throw new Error("Block slug is required and must be a string");
8
+ }
9
+ if (!options.schema || typeof options.schema !== "object") {
10
+ throw new Error("Block schema is required and must be an object");
11
+ }
12
+ if (!options.component) {
13
+ throw new Error("Block component is required");
14
+ }
15
+ return options;
16
+ }
@@ -0,0 +1,3 @@
1
+ import { Field } from "./types";
2
+ export declare function defineField<T extends Field>(field: T): T;
3
+ //# sourceMappingURL=define-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-field.d.ts","sourceRoot":"","sources":["../../../src/studio/define-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wBAAgB,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAExD"}
@@ -0,0 +1,3 @@
1
+ export function defineField(field) {
2
+ return field;
3
+ }
@@ -0,0 +1,4 @@
1
+ import { BlockSchema, Field } from "./types";
2
+ export type SchemaFields = Record<string, Field>;
3
+ export declare function defineSchema<T extends SchemaFields>(schema: BlockSchema<T>): BlockSchema<T>;
4
+ //# sourceMappingURL=define-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-schema.d.ts","sourceRoot":"","sources":["../../../src/studio/define-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEjD,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,kBAE1E"}
@@ -0,0 +1,3 @@
1
+ export function defineSchema(schema) {
2
+ return schema;
3
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./types";
2
+ export * from "./define-block";
3
+ export * from "./define-field";
4
+ export * from "./define-schema";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/studio/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AAExB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./types";
2
+ export * from "./define-block";
3
+ export * from "./define-field";
4
+ export * from "./define-schema";
@@ -0,0 +1,31 @@
1
+ import { Field, FieldType, FieldTypeToValue } from "./field";
2
+ type FieldValues<T extends Record<string, Field>> = {
3
+ [K in keyof T]: T[K] extends {
4
+ type: infer Type;
5
+ } ? (Type extends FieldType ? FieldTypeToValue[Type] : never) : never;
6
+ };
7
+ export interface BlockSchema<TFields extends Record<string, Field>> {
8
+ fields: TFields;
9
+ properties?: BlockProperties;
10
+ }
11
+ export interface BlockDefinition<TFields extends Record<string, Field>> {
12
+ name: string;
13
+ slug: string;
14
+ schema: BlockSchema<TFields>;
15
+ component: React.ComponentType<BlockComponentProps<any>>;
16
+ }
17
+ export interface BlockProperties {
18
+ customClassName?: string;
19
+ }
20
+ export interface BuilderBlock<TSchema extends BlockSchema<Record<string, Field>>> {
21
+ id: string;
22
+ type: string;
23
+ fields: FieldValues<TSchema["fields"]>;
24
+ properties?: BlockProperties;
25
+ }
26
+ export interface BlockComponentProps<TSchema extends BlockSchema<Record<string, Field>>> {
27
+ block: BuilderBlock<TSchema>;
28
+ onFieldChange: (blockId: string, fieldName: keyof TSchema["fields"], value: any) => void;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +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;AAE7D,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;KACjD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,CAAC,IAAI,SAAS,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;CACtH,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9E,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,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrF,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1F"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ export interface Media {
2
+ id: string;
3
+ url: string;
4
+ width: number;
5
+ height: number;
6
+ alt: string;
7
+ }
8
+ //# sourceMappingURL=field-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-values.d.ts","sourceRoot":"","sources":["../../../../src/studio/types/field-values.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { MediaItem } from "../../types";
2
+ type Nullable<T> = T | null;
3
+ export type FieldTypeToValue = {
4
+ boolean: Nullable<boolean>;
5
+ event_select: Nullable<string>;
6
+ form_select: Nullable<string>;
7
+ image: Nullable<MediaItem>;
8
+ image_list: Nullable<MediaItem[]>;
9
+ list_array: Nullable<string[]>;
10
+ media: Nullable<MediaItem>;
11
+ menu_select: Nullable<string>;
12
+ number: Nullable<number>;
13
+ press_select: Nullable<string>;
14
+ repeater: Nullable<any[]>;
15
+ rich_text: Nullable<string>;
16
+ separator: never;
17
+ spacer: never;
18
+ text: Nullable<string>;
19
+ textarea: Nullable<string>;
20
+ url: Nullable<string>;
21
+ };
22
+ export type FieldType = keyof FieldTypeToValue;
23
+ export type BaseField = {
24
+ name: string;
25
+ slug: string;
26
+ placeholder?: string;
27
+ required?: boolean;
28
+ options?: Array<{
29
+ label: string;
30
+ value: any;
31
+ }>;
32
+ };
33
+ export type Field = {
34
+ [K in FieldType]: BaseField & {
35
+ type: K;
36
+ value?: FieldTypeToValue[K];
37
+ };
38
+ }[FieldType];
39
+ export {};
40
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +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;AAExC,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,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,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;CACvB,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,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;KACjB,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG;QAC5B,IAAI,EAAE,CAAC,CAAC;QACR,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;KAC7B;CACF,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export {};
2
+ // export interface Field<T extends FieldType = FieldType> {
3
+ // name: string;
4
+ // slug: string;
5
+ // type: FieldType;
6
+ // value?: FieldTypeToValue[T];
7
+ // placeholder?: string;
8
+ // required?: boolean;
9
+ // options?: Array<{ label: string; value: any }>;
10
+ // }
@@ -0,0 +1,4 @@
1
+ export * from "./block";
2
+ export * from "./field";
3
+ export * from "./field-values";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/studio/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAExB,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./block";
2
+ export * from "./field";
3
+ export * from "./field-values";
@@ -11,4 +11,5 @@ export * from "./navigation";
11
11
  export * from "./page";
12
12
  export * from "./press";
13
13
  export * from "./website";
14
+ export * from "../studio/types/index";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAE1B,cAAc,uBAAuB,CAAC"}
@@ -11,3 +11,4 @@ export * from "./navigation";
11
11
  export * from "./page";
12
12
  export * from "./press";
13
13
  export * from "./website";
14
+ export * from "../studio/types/index";
@@ -1,6 +1,7 @@
1
1
  import { AxiosInstance, AxiosRequestConfig } from "axios";
2
2
  import { BackstageUserConfig } from "./config";
3
3
  import { AlertService } from "./endpoints/alerts";
4
+ import { BlocksService } from "./endpoints/blocks";
4
5
  import { EventService } from "./endpoints/events";
5
6
  import { LocationService } from "./endpoints/locations";
6
7
  import { MenuService } from "./endpoints/menus";
@@ -11,6 +12,7 @@ import { WebsiteService } from "./endpoints/website";
11
12
  export declare class BackstageClient {
12
13
  private instance;
13
14
  readonly alerts: AlertService;
15
+ readonly blocks: BlocksService;
14
16
  readonly events: EventService;
15
17
  readonly locations: LocationService;
16
18
  readonly menus: MenuService;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAC5F,OAAO,EAAmB,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAGhC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,iBAAiB,CAAC;IAC9C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,SAAgB,OAAO,EAAE,cAAc,CAAC;gBAE5B,MAAM,CAAC,EAAE,mBAAmB;IAoE3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKvF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/E,gBAAgB,IAAI,aAAa;CAGzC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAC5F,OAAO,EAAmB,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAGhC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,MAAM,EAAE,aAAa,CAAC;IACtC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,iBAAiB,CAAC;IAC9C,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,SAAgB,OAAO,EAAE,cAAc,CAAC;gBAE5B,MAAM,CAAC,EAAE,mBAAmB;IAqE3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKvF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/E,gBAAgB,IAAI,aAAa;CAGzC"}
@@ -1,8 +1,10 @@
1
1
  import { AxiosError } from "axios";
2
+ import type { BlockDefinition } from "./studio/types";
2
3
  export interface BackstageUserConfig {
3
4
  accountId?: string | undefined;
4
5
  token?: string | undefined;
5
6
  baseURL?: string;
7
+ blocks?: BlockDefinition<any>[] | undefined;
6
8
  onError?: (error: AxiosError) => void;
7
9
  }
8
10
  export declare function defineConfig(config: BackstageUserConfig): BackstageUserConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMnC,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CAGrD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAM7E;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CAGrD"}
@@ -0,0 +1,13 @@
1
+ import { BaseService } from "./base";
2
+ interface BlockParams {
3
+ name: string;
4
+ slug: string;
5
+ schema: any;
6
+ }
7
+ export declare class BlocksService extends BaseService {
8
+ all(): Promise<void>;
9
+ create({ name, slug, schema }: BlockParams): Promise<BlockParams>;
10
+ update(id: string, { name, slug, schema }: BlockParams): Promise<BlockParams>;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../src/endpoints/blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,aAAc,SAAQ,WAAW;IACtC,GAAG;IAEH,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;IAK1C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;CAI7D"}
@@ -0,0 +1,8 @@
1
+ import { BlockSchema, BlockDefinition, BlockComponentProps } from "./types";
2
+ export declare function defineBlock(options: {
3
+ name: string;
4
+ slug: string;
5
+ schema: BlockSchema<any>;
6
+ component: React.ComponentType<BlockComponentProps<typeof options.schema>>;
7
+ }): BlockDefinition<typeof options.schema.fields>;
8
+ //# sourceMappingURL=define-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block.d.ts","sourceRoot":"","sources":["../../../src/studio/define-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE5E,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5E,GAAG,eAAe,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAmBhD"}
@@ -0,0 +1,3 @@
1
+ import { Field } from "./types";
2
+ export declare function defineField<T extends Field>(field: T): T;
3
+ //# sourceMappingURL=define-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-field.d.ts","sourceRoot":"","sources":["../../../src/studio/define-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wBAAgB,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAExD"}
@@ -0,0 +1,4 @@
1
+ import { BlockSchema, Field } from "./types";
2
+ export type SchemaFields = Record<string, Field>;
3
+ export declare function defineSchema<T extends SchemaFields>(schema: BlockSchema<T>): BlockSchema<T>;
4
+ //# sourceMappingURL=define-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-schema.d.ts","sourceRoot":"","sources":["../../../src/studio/define-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEjD,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,kBAE1E"}
@@ -0,0 +1,5 @@
1
+ export * from "./types";
2
+ export * from "./define-block";
3
+ export * from "./define-field";
4
+ export * from "./define-schema";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/studio/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AAExB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Field, FieldType, FieldTypeToValue } from "./field";
2
+ type FieldValues<T extends Record<string, Field>> = {
3
+ [K in keyof T]: T[K] extends {
4
+ type: infer Type;
5
+ } ? (Type extends FieldType ? FieldTypeToValue[Type] : never) : never;
6
+ };
7
+ export interface BlockSchema<TFields extends Record<string, Field>> {
8
+ fields: TFields;
9
+ properties?: BlockProperties;
10
+ }
11
+ export interface BlockDefinition<TFields extends Record<string, Field>> {
12
+ name: string;
13
+ slug: string;
14
+ schema: BlockSchema<TFields>;
15
+ component: React.ComponentType<BlockComponentProps<any>>;
16
+ }
17
+ export interface BlockProperties {
18
+ customClassName?: string;
19
+ }
20
+ export interface BuilderBlock<TSchema extends BlockSchema<Record<string, Field>>> {
21
+ id: string;
22
+ type: string;
23
+ fields: FieldValues<TSchema["fields"]>;
24
+ properties?: BlockProperties;
25
+ }
26
+ export interface BlockComponentProps<TSchema extends BlockSchema<Record<string, Field>>> {
27
+ block: BuilderBlock<TSchema>;
28
+ onFieldChange: (blockId: string, fieldName: keyof TSchema["fields"], value: any) => void;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +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;AAE7D,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;KACjD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,CAAC,IAAI,SAAS,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;CACtH,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9E,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,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrF,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1F"}
@@ -0,0 +1,8 @@
1
+ export interface Media {
2
+ id: string;
3
+ url: string;
4
+ width: number;
5
+ height: number;
6
+ alt: string;
7
+ }
8
+ //# sourceMappingURL=field-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-values.d.ts","sourceRoot":"","sources":["../../../../src/studio/types/field-values.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,40 @@
1
+ import { MediaItem } from "../../types";
2
+ type Nullable<T> = T | null;
3
+ export type FieldTypeToValue = {
4
+ boolean: Nullable<boolean>;
5
+ event_select: Nullable<string>;
6
+ form_select: Nullable<string>;
7
+ image: Nullable<MediaItem>;
8
+ image_list: Nullable<MediaItem[]>;
9
+ list_array: Nullable<string[]>;
10
+ media: Nullable<MediaItem>;
11
+ menu_select: Nullable<string>;
12
+ number: Nullable<number>;
13
+ press_select: Nullable<string>;
14
+ repeater: Nullable<any[]>;
15
+ rich_text: Nullable<string>;
16
+ separator: never;
17
+ spacer: never;
18
+ text: Nullable<string>;
19
+ textarea: Nullable<string>;
20
+ url: Nullable<string>;
21
+ };
22
+ export type FieldType = keyof FieldTypeToValue;
23
+ export type BaseField = {
24
+ name: string;
25
+ slug: string;
26
+ placeholder?: string;
27
+ required?: boolean;
28
+ options?: Array<{
29
+ label: string;
30
+ value: any;
31
+ }>;
32
+ };
33
+ export type Field = {
34
+ [K in FieldType]: BaseField & {
35
+ type: K;
36
+ value?: FieldTypeToValue[K];
37
+ };
38
+ }[FieldType];
39
+ export {};
40
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +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;AAExC,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,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,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;CACvB,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,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;KACjB,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG;QAC5B,IAAI,EAAE,CAAC,CAAC;QACR,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;KAC7B;CACF,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./block";
2
+ export * from "./field";
3
+ export * from "./field-values";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/studio/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAExB,cAAc,gBAAgB,CAAC"}
@@ -11,4 +11,5 @@ export * from "./navigation";
11
11
  export * from "./page";
12
12
  export * from "./press";
13
13
  export * from "./website";
14
+ export * from "../studio/types/index";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAE1B,cAAc,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@antlur/backstage",
3
3
  "author": "Anthony Holmes",
4
- "version": "1.1.0",
4
+ "version": "1.2.1",
5
5
  "description": "A simple client for Backstage CMS",
6
6
  "main": "./dist/cjs/index.js",
7
7
  "module": "./dist/esm/index.js",
@@ -17,6 +17,11 @@
17
17
  "import": "./dist/esm/types/index.js",
18
18
  "types": "./dist/types/types/*.d.ts"
19
19
  },
20
+ "./studio": {
21
+ "require": "./dist/cjs/studio/index.js",
22
+ "import": "./dist/esm/studio/index.js",
23
+ "types": "./dist/types/studio/*.d.ts"
24
+ },
20
25
  "./*": {
21
26
  "require": "./dist/cjs/*.js",
22
27
  "import": "./dist/esm/*.js",
package/src/client.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from "axios";
2
2
  import { getGlobalConfig, BackstageUserConfig } from "./config";
3
3
  import { AlertService } from "./endpoints/alerts";
4
+ import { BlocksService } from "./endpoints/blocks";
4
5
  import { EventService } from "./endpoints/events";
5
6
  import { LocationService } from "./endpoints/locations";
6
7
  import { MenuService } from "./endpoints/menus";
@@ -14,6 +15,7 @@ export class BackstageClient {
14
15
 
15
16
  // Service Instances
16
17
  public readonly alerts: AlertService;
18
+ public readonly blocks: BlocksService;
17
19
  public readonly events: EventService;
18
20
  public readonly locations: LocationService;
19
21
  public readonly menus: MenuService;
@@ -81,6 +83,7 @@ export class BackstageClient {
81
83
 
82
84
  // Initialize service instances
83
85
  this.alerts = new AlertService(this);
86
+ this.blocks = new BlocksService(this);
84
87
  this.events = new EventService(this);
85
88
  this.locations = new LocationService(this);
86
89
  this.menus = new MenuService(this);
package/src/config.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AxiosError } from "axios";
2
+ import type { BlockDefinition } from "./studio/types";
2
3
 
3
4
  const ROOT = process.cwd();
4
5
  const CONFIG_PATH = process.env.BACKSTAGE_CONFIG_PATH || "./backstage.config";
@@ -8,6 +9,7 @@ export interface BackstageUserConfig {
8
9
  accountId?: string | undefined;
9
10
  token?: string | undefined;
10
11
  baseURL?: string;
12
+ blocks?: BlockDefinition<any>[] | undefined;
11
13
  onError?: (error: AxiosError) => void;
12
14
  }
13
15
 
@@ -0,0 +1,22 @@
1
+ import { ApiSingleResponse } from "../types";
2
+ import { BaseService } from "./base";
3
+
4
+ interface BlockParams {
5
+ name: string;
6
+ slug: string;
7
+ schema: any;
8
+ }
9
+
10
+ export class BlocksService extends BaseService {
11
+ async all() {}
12
+
13
+ async create({ name, slug, schema }: BlockParams) {
14
+ const res = await this.client.post<ApiSingleResponse<BlockParams>>("/blocks", { name, slug, schema });
15
+ return res.data;
16
+ }
17
+
18
+ async update(id: string, { name, slug, schema }: BlockParams) {
19
+ const res = await this.client.put<ApiSingleResponse<BlockParams>>(`/blocks/${id}`, { name, slug, schema });
20
+ return res.data;
21
+ }
22
+ }
@@ -0,0 +1,27 @@
1
+ import { BlockSchema, BlockDefinition, BlockComponentProps } from "./types";
2
+
3
+ export function defineBlock(options: {
4
+ name: string;
5
+ slug: string;
6
+ schema: BlockSchema<any>;
7
+ component: React.ComponentType<BlockComponentProps<typeof options.schema>>;
8
+ }): BlockDefinition<typeof options.schema.fields> {
9
+ // Runtime validation
10
+ if (!options.name || typeof options.name !== "string") {
11
+ throw new Error("Block name is required and must be a string");
12
+ }
13
+
14
+ if (!options.slug || typeof options.slug !== "string") {
15
+ throw new Error("Block slug is required and must be a string");
16
+ }
17
+
18
+ if (!options.schema || typeof options.schema !== "object") {
19
+ throw new Error("Block schema is required and must be an object");
20
+ }
21
+
22
+ if (!options.component) {
23
+ throw new Error("Block component is required");
24
+ }
25
+
26
+ return options;
27
+ }
@@ -0,0 +1,5 @@
1
+ import { Field } from "./types";
2
+
3
+ export function defineField<T extends Field>(field: T): T {
4
+ return field;
5
+ }
@@ -0,0 +1,7 @@
1
+ import { BlockSchema, Field } from "./types";
2
+
3
+ export type SchemaFields = Record<string, Field>;
4
+
5
+ export function defineSchema<T extends SchemaFields>(schema: BlockSchema<T>) {
6
+ return schema;
7
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./types";
2
+
3
+ export * from "./define-block";
4
+ export * from "./define-field";
5
+ export * from "./define-schema";
@@ -0,0 +1,33 @@
1
+ import { Field, FieldType, FieldTypeToValue } from "./field";
2
+
3
+ type FieldValues<T extends Record<string, Field>> = {
4
+ [K in keyof T]: T[K] extends { type: infer Type } ? (Type extends FieldType ? FieldTypeToValue[Type] : never) : never;
5
+ };
6
+
7
+ export interface BlockSchema<TFields extends Record<string, Field>> {
8
+ fields: TFields;
9
+ properties?: BlockProperties;
10
+ }
11
+
12
+ export interface BlockDefinition<TFields extends Record<string, Field>> {
13
+ name: string;
14
+ slug: string;
15
+ schema: BlockSchema<TFields>;
16
+ component: React.ComponentType<BlockComponentProps<any>>;
17
+ }
18
+
19
+ export interface BlockProperties {
20
+ customClassName?: string;
21
+ }
22
+
23
+ export interface BuilderBlock<TSchema extends BlockSchema<Record<string, Field>>> {
24
+ id: string;
25
+ type: string;
26
+ fields: FieldValues<TSchema["fields"]>;
27
+ properties?: BlockProperties;
28
+ }
29
+
30
+ export interface BlockComponentProps<TSchema extends BlockSchema<Record<string, Field>>> {
31
+ block: BuilderBlock<TSchema>;
32
+ onFieldChange: (blockId: string, fieldName: keyof TSchema["fields"], value: any) => void;
33
+ }
@@ -0,0 +1,7 @@
1
+ export interface Media {
2
+ id: string;
3
+ url: string;
4
+ width: number;
5
+ height: number;
6
+ alt: string;
7
+ }
@@ -0,0 +1,49 @@
1
+ import { MediaItem } from "../../types";
2
+
3
+ type Nullable<T> = T | null;
4
+
5
+ export type FieldTypeToValue = {
6
+ boolean: Nullable<boolean>;
7
+ event_select: Nullable<string>;
8
+ form_select: Nullable<string>;
9
+ image: Nullable<MediaItem>;
10
+ image_list: Nullable<MediaItem[]>;
11
+ list_array: Nullable<string[]>;
12
+ media: Nullable<MediaItem>;
13
+ menu_select: Nullable<string>;
14
+ number: Nullable<number>;
15
+ press_select: Nullable<string>;
16
+ repeater: Nullable<any[]>;
17
+ rich_text: Nullable<string>;
18
+ separator: never;
19
+ spacer: never;
20
+ text: Nullable<string>;
21
+ textarea: Nullable<string>;
22
+ url: Nullable<string>;
23
+ };
24
+ export type FieldType = keyof FieldTypeToValue;
25
+
26
+ export type BaseField = {
27
+ name: string;
28
+ slug: string;
29
+ placeholder?: string;
30
+ required?: boolean;
31
+ options?: Array<{ label: string; value: any }>;
32
+ };
33
+
34
+ export type Field = {
35
+ [K in FieldType]: BaseField & {
36
+ type: K;
37
+ value?: FieldTypeToValue[K];
38
+ };
39
+ }[FieldType];
40
+
41
+ // export interface Field<T extends FieldType = FieldType> {
42
+ // name: string;
43
+ // slug: string;
44
+ // type: FieldType;
45
+ // value?: FieldTypeToValue[T];
46
+ // placeholder?: string;
47
+ // required?: boolean;
48
+ // options?: Array<{ label: string; value: any }>;
49
+ // }
@@ -0,0 +1,4 @@
1
+ export * from "./block";
2
+ export * from "./field";
3
+
4
+ export * from "./field-values";
@@ -11,3 +11,5 @@ export * from "./navigation";
11
11
  export * from "./page";
12
12
  export * from "./press";
13
13
  export * from "./website";
14
+
15
+ export * from "../studio/types/index";