@camox/api-contract 0.24.0 → 0.25.0

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/index.d.ts CHANGED
@@ -505,6 +505,40 @@ declare function createDb(d1: D1Database): import("drizzle-orm/d1").DrizzleD1Dat
505
505
  }, {}, {
506
506
  length: number | undefined;
507
507
  }>;
508
+ livePublishedCheckpointId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
509
+ name: "live_published_checkpoint_id";
510
+ tableName: "pages";
511
+ dataType: "number";
512
+ columnType: "SQLiteInteger";
513
+ data: number;
514
+ driverParam: number;
515
+ notNull: false;
516
+ hasDefault: false;
517
+ isPrimaryKey: false;
518
+ isAutoincrement: false;
519
+ hasRuntimeDefault: false;
520
+ enumValues: undefined;
521
+ baseColumn: never;
522
+ identity: undefined;
523
+ generated: undefined;
524
+ }, {}, {}>;
525
+ contentUpdatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
526
+ name: "content_updated_at";
527
+ tableName: "pages";
528
+ dataType: "number";
529
+ columnType: "SQLiteInteger";
530
+ data: number;
531
+ driverParam: number;
532
+ notNull: true;
533
+ hasDefault: false;
534
+ isPrimaryKey: false;
535
+ isAutoincrement: false;
536
+ hasRuntimeDefault: false;
537
+ enumValues: undefined;
538
+ baseColumn: never;
539
+ identity: undefined;
540
+ generated: undefined;
541
+ }, {}, {}>;
508
542
  createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
509
543
  name: "created_at";
510
544
  tableName: "pages";
@@ -542,6 +576,170 @@ declare function createDb(d1: D1Database): import("drizzle-orm/d1").DrizzleD1Dat
542
576
  };
543
577
  dialect: "sqlite";
544
578
  }>;
579
+ pageCheckpoints: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
580
+ name: "page_checkpoints";
581
+ schema: undefined;
582
+ columns: {
583
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
584
+ name: "id";
585
+ tableName: "page_checkpoints";
586
+ dataType: "number";
587
+ columnType: "SQLiteInteger";
588
+ data: number;
589
+ driverParam: number;
590
+ notNull: true;
591
+ hasDefault: true;
592
+ isPrimaryKey: true;
593
+ isAutoincrement: false;
594
+ hasRuntimeDefault: false;
595
+ enumValues: undefined;
596
+ baseColumn: never;
597
+ identity: undefined;
598
+ generated: undefined;
599
+ }, {}, {}>;
600
+ pageId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
601
+ name: "page_id";
602
+ tableName: "page_checkpoints";
603
+ dataType: "number";
604
+ columnType: "SQLiteInteger";
605
+ data: number;
606
+ driverParam: number;
607
+ notNull: true;
608
+ hasDefault: false;
609
+ isPrimaryKey: false;
610
+ isAutoincrement: false;
611
+ hasRuntimeDefault: false;
612
+ enumValues: undefined;
613
+ baseColumn: never;
614
+ identity: undefined;
615
+ generated: undefined;
616
+ }, {}, {}>;
617
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
618
+ name: "kind";
619
+ tableName: "page_checkpoints";
620
+ dataType: "string";
621
+ columnType: "SQLiteText";
622
+ data: "auto-publish" | "manual" | "auto-draft";
623
+ driverParam: string;
624
+ notNull: true;
625
+ hasDefault: false;
626
+ isPrimaryKey: false;
627
+ isAutoincrement: false;
628
+ hasRuntimeDefault: false;
629
+ enumValues: [
630
+ string,
631
+ ...string[]
632
+ ];
633
+ baseColumn: never;
634
+ identity: undefined;
635
+ generated: undefined;
636
+ }, {}, {
637
+ length: undefined;
638
+ $type: "auto-publish" | "manual" | "auto-draft";
639
+ }>;
640
+ label: import("drizzle-orm/sqlite-core").SQLiteColumn<{
641
+ name: "label";
642
+ tableName: "page_checkpoints";
643
+ dataType: "string";
644
+ columnType: "SQLiteText";
645
+ data: string;
646
+ driverParam: string;
647
+ notNull: false;
648
+ hasDefault: false;
649
+ isPrimaryKey: false;
650
+ isAutoincrement: false;
651
+ hasRuntimeDefault: false;
652
+ enumValues: [
653
+ string,
654
+ ...string[]
655
+ ];
656
+ baseColumn: never;
657
+ identity: undefined;
658
+ generated: undefined;
659
+ }, {}, {
660
+ length: undefined;
661
+ }>;
662
+ snapshot: import("drizzle-orm/sqlite-core").SQLiteColumn<{
663
+ name: "snapshot";
664
+ tableName: "page_checkpoints";
665
+ dataType: "string";
666
+ columnType: "SQLiteText";
667
+ data: string;
668
+ driverParam: string;
669
+ notNull: true;
670
+ hasDefault: false;
671
+ isPrimaryKey: false;
672
+ isAutoincrement: false;
673
+ hasRuntimeDefault: false;
674
+ enumValues: [
675
+ string,
676
+ ...string[]
677
+ ];
678
+ baseColumn: never;
679
+ identity: undefined;
680
+ generated: undefined;
681
+ }, {}, {
682
+ length: undefined;
683
+ }>;
684
+ schemaVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
685
+ name: "schema_version";
686
+ tableName: "page_checkpoints";
687
+ dataType: "number";
688
+ columnType: "SQLiteInteger";
689
+ data: number;
690
+ driverParam: number;
691
+ notNull: true;
692
+ hasDefault: false;
693
+ isPrimaryKey: false;
694
+ isAutoincrement: false;
695
+ hasRuntimeDefault: false;
696
+ enumValues: undefined;
697
+ baseColumn: never;
698
+ identity: undefined;
699
+ generated: undefined;
700
+ }, {}, {}>;
701
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
702
+ name: "created_at";
703
+ tableName: "page_checkpoints";
704
+ dataType: "number";
705
+ columnType: "SQLiteInteger";
706
+ data: number;
707
+ driverParam: number;
708
+ notNull: true;
709
+ hasDefault: false;
710
+ isPrimaryKey: false;
711
+ isAutoincrement: false;
712
+ hasRuntimeDefault: false;
713
+ enumValues: undefined;
714
+ baseColumn: never;
715
+ identity: undefined;
716
+ generated: undefined;
717
+ }, {}, {}>;
718
+ createdBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{
719
+ name: "created_by";
720
+ tableName: "page_checkpoints";
721
+ dataType: "string";
722
+ columnType: "SQLiteText";
723
+ data: string;
724
+ driverParam: string;
725
+ notNull: false;
726
+ hasDefault: false;
727
+ isPrimaryKey: false;
728
+ isAutoincrement: false;
729
+ hasRuntimeDefault: false;
730
+ enumValues: [
731
+ string,
732
+ ...string[]
733
+ ];
734
+ baseColumn: never;
735
+ identity: undefined;
736
+ generated: undefined;
737
+ }, {}, {
738
+ length: number | undefined;
739
+ }>;
740
+ };
741
+ dialect: "sqlite";
742
+ }>;
545
743
  layouts: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
546
744
  name: "layouts";
547
745
  schema: undefined;
@@ -641,6 +839,40 @@ declare function createDb(d1: D1Database): import("drizzle-orm/d1").DrizzleD1Dat
641
839
  }, {}, {
642
840
  length: undefined;
643
841
  }>;
842
+ livePublishedCheckpointId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
843
+ name: "live_published_checkpoint_id";
844
+ tableName: "layouts";
845
+ dataType: "number";
846
+ columnType: "SQLiteInteger";
847
+ data: number;
848
+ driverParam: number;
849
+ notNull: false;
850
+ hasDefault: false;
851
+ isPrimaryKey: false;
852
+ isAutoincrement: false;
853
+ hasRuntimeDefault: false;
854
+ enumValues: undefined;
855
+ baseColumn: never;
856
+ identity: undefined;
857
+ generated: undefined;
858
+ }, {}, {}>;
859
+ contentUpdatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
860
+ name: "content_updated_at";
861
+ tableName: "layouts";
862
+ dataType: "number";
863
+ columnType: "SQLiteInteger";
864
+ data: number;
865
+ driverParam: number;
866
+ notNull: true;
867
+ hasDefault: false;
868
+ isPrimaryKey: false;
869
+ isAutoincrement: false;
870
+ hasRuntimeDefault: false;
871
+ enumValues: undefined;
872
+ baseColumn: never;
873
+ identity: undefined;
874
+ generated: undefined;
875
+ }, {}, {}>;
644
876
  createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
645
877
  name: "created_at";
646
878
  tableName: "layouts";
@@ -678,6 +910,170 @@ declare function createDb(d1: D1Database): import("drizzle-orm/d1").DrizzleD1Dat
678
910
  };
679
911
  dialect: "sqlite";
680
912
  }>;
913
+ layoutCheckpoints: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
914
+ name: "layout_checkpoints";
915
+ schema: undefined;
916
+ columns: {
917
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
918
+ name: "id";
919
+ tableName: "layout_checkpoints";
920
+ dataType: "number";
921
+ columnType: "SQLiteInteger";
922
+ data: number;
923
+ driverParam: number;
924
+ notNull: true;
925
+ hasDefault: true;
926
+ isPrimaryKey: true;
927
+ isAutoincrement: false;
928
+ hasRuntimeDefault: false;
929
+ enumValues: undefined;
930
+ baseColumn: never;
931
+ identity: undefined;
932
+ generated: undefined;
933
+ }, {}, {}>;
934
+ layoutId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
935
+ name: "layout_id";
936
+ tableName: "layout_checkpoints";
937
+ dataType: "number";
938
+ columnType: "SQLiteInteger";
939
+ data: number;
940
+ driverParam: number;
941
+ notNull: true;
942
+ hasDefault: false;
943
+ isPrimaryKey: false;
944
+ isAutoincrement: false;
945
+ hasRuntimeDefault: false;
946
+ enumValues: undefined;
947
+ baseColumn: never;
948
+ identity: undefined;
949
+ generated: undefined;
950
+ }, {}, {}>;
951
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
952
+ name: "kind";
953
+ tableName: "layout_checkpoints";
954
+ dataType: "string";
955
+ columnType: "SQLiteText";
956
+ data: "auto-publish" | "manual" | "auto-draft";
957
+ driverParam: string;
958
+ notNull: true;
959
+ hasDefault: false;
960
+ isPrimaryKey: false;
961
+ isAutoincrement: false;
962
+ hasRuntimeDefault: false;
963
+ enumValues: [
964
+ string,
965
+ ...string[]
966
+ ];
967
+ baseColumn: never;
968
+ identity: undefined;
969
+ generated: undefined;
970
+ }, {}, {
971
+ length: undefined;
972
+ $type: "auto-publish" | "manual" | "auto-draft";
973
+ }>;
974
+ label: import("drizzle-orm/sqlite-core").SQLiteColumn<{
975
+ name: "label";
976
+ tableName: "layout_checkpoints";
977
+ dataType: "string";
978
+ columnType: "SQLiteText";
979
+ data: string;
980
+ driverParam: string;
981
+ notNull: false;
982
+ hasDefault: false;
983
+ isPrimaryKey: false;
984
+ isAutoincrement: false;
985
+ hasRuntimeDefault: false;
986
+ enumValues: [
987
+ string,
988
+ ...string[]
989
+ ];
990
+ baseColumn: never;
991
+ identity: undefined;
992
+ generated: undefined;
993
+ }, {}, {
994
+ length: undefined;
995
+ }>;
996
+ snapshot: import("drizzle-orm/sqlite-core").SQLiteColumn<{
997
+ name: "snapshot";
998
+ tableName: "layout_checkpoints";
999
+ dataType: "string";
1000
+ columnType: "SQLiteText";
1001
+ data: string;
1002
+ driverParam: string;
1003
+ notNull: true;
1004
+ hasDefault: false;
1005
+ isPrimaryKey: false;
1006
+ isAutoincrement: false;
1007
+ hasRuntimeDefault: false;
1008
+ enumValues: [
1009
+ string,
1010
+ ...string[]
1011
+ ];
1012
+ baseColumn: never;
1013
+ identity: undefined;
1014
+ generated: undefined;
1015
+ }, {}, {
1016
+ length: undefined;
1017
+ }>;
1018
+ schemaVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1019
+ name: "schema_version";
1020
+ tableName: "layout_checkpoints";
1021
+ dataType: "number";
1022
+ columnType: "SQLiteInteger";
1023
+ data: number;
1024
+ driverParam: number;
1025
+ notNull: true;
1026
+ hasDefault: false;
1027
+ isPrimaryKey: false;
1028
+ isAutoincrement: false;
1029
+ hasRuntimeDefault: false;
1030
+ enumValues: undefined;
1031
+ baseColumn: never;
1032
+ identity: undefined;
1033
+ generated: undefined;
1034
+ }, {}, {}>;
1035
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1036
+ name: "created_at";
1037
+ tableName: "layout_checkpoints";
1038
+ dataType: "number";
1039
+ columnType: "SQLiteInteger";
1040
+ data: number;
1041
+ driverParam: number;
1042
+ notNull: true;
1043
+ hasDefault: false;
1044
+ isPrimaryKey: false;
1045
+ isAutoincrement: false;
1046
+ hasRuntimeDefault: false;
1047
+ enumValues: undefined;
1048
+ baseColumn: never;
1049
+ identity: undefined;
1050
+ generated: undefined;
1051
+ }, {}, {}>;
1052
+ createdBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1053
+ name: "created_by";
1054
+ tableName: "layout_checkpoints";
1055
+ dataType: "string";
1056
+ columnType: "SQLiteText";
1057
+ data: string;
1058
+ driverParam: string;
1059
+ notNull: false;
1060
+ hasDefault: false;
1061
+ isPrimaryKey: false;
1062
+ isAutoincrement: false;
1063
+ hasRuntimeDefault: false;
1064
+ enumValues: [
1065
+ string,
1066
+ ...string[]
1067
+ ];
1068
+ baseColumn: never;
1069
+ identity: undefined;
1070
+ generated: undefined;
1071
+ }, {}, {
1072
+ length: number | undefined;
1073
+ }>;
1074
+ };
1075
+ dialect: "sqlite";
1076
+ }>;
681
1077
  blocks: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
682
1078
  name: "blocks";
683
1079
  schema: undefined;
@@ -3350,6 +3746,21 @@ export type BaseContext = {
3350
3746
  telemetryDisabled: boolean;
3351
3747
  waitUntil: (promise: Promise<unknown>) => void;
3352
3748
  };
3749
+ export type PageStatus = "draft" | "published" | "modified";
3750
+ export type ModifiedReason = {
3751
+ reason: "self";
3752
+ } | {
3753
+ reason: "layout";
3754
+ layoutId: number;
3755
+ layoutHandle: string;
3756
+ affectedPagesCount: number;
3757
+ } | {
3758
+ reason: "both";
3759
+ layoutId: number;
3760
+ layoutHandle: string;
3761
+ affectedPagesCount: number;
3762
+ };
3763
+ export type LayoutStatus = "draft" | "published" | "modified";
3353
3764
  export type CompatibilityReason = {
3354
3765
  kind: "block-definition-missing-in-source";
3355
3766
  blockId: string;
@@ -3796,23 +4207,34 @@ declare const router: {
3796
4207
  getByPath: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
3797
4208
  projectSlug: import("zod").ZodString;
3798
4209
  path: import("zod").ZodString;
4210
+ source: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodUnion<readonly [
4211
+ import("zod").ZodLiteral<"live">,
4212
+ import("zod").ZodLiteral<"draft">,
4213
+ import("zod").ZodObject<{
4214
+ checkpointId: import("zod").ZodNumber;
4215
+ }, import("better-auth").$strip>
4216
+ ]>>>;
3799
4217
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
3800
4218
  page: {
4219
+ status: PageStatus;
4220
+ modifiedReason: ModifiedReason | null;
3801
4221
  blockIds: number[];
3802
4222
  id: number;
4223
+ createdAt: number;
4224
+ updatedAt: number;
3803
4225
  projectId: number;
3804
4226
  environmentId: number;
4227
+ layoutId: number;
4228
+ livePublishedCheckpointId: number | null;
4229
+ contentUpdatedAt: number;
3805
4230
  pathSegment: string;
3806
4231
  fullPath: string;
3807
4232
  parentPageId: number | null;
3808
- layoutId: number;
3809
4233
  metaTitle: string | null;
3810
4234
  metaDescription: string | null;
3811
4235
  aiSeoEnabled: boolean | null;
3812
4236
  customOgImageBlobId: string | null;
3813
4237
  customOgImageUrl: string | null;
3814
- createdAt: number;
3815
- updatedAt: number;
3816
4238
  };
3817
4239
  projectName: string;
3818
4240
  project: {
@@ -3854,24 +4276,42 @@ declare const router: {
3854
4276
  parentItemId: number | null;
3855
4277
  fieldName: string;
3856
4278
  }[];
3857
- files: any[];
4279
+ files: {
4280
+ id: number;
4281
+ createdAt: number;
4282
+ updatedAt: number;
4283
+ projectId: number | null;
4284
+ environmentId: number;
4285
+ url: string;
4286
+ alt: string;
4287
+ filename: string;
4288
+ mimeType: string;
4289
+ size: number;
4290
+ blobId: string;
4291
+ path: string;
4292
+ aiMetadataEnabled: boolean | null;
4293
+ }[];
3858
4294
  }, {
3859
4295
  page: {
4296
+ status: PageStatus;
4297
+ modifiedReason: ModifiedReason | null;
3860
4298
  blockIds: number[];
3861
4299
  id: number;
4300
+ createdAt: number;
4301
+ updatedAt: number;
3862
4302
  projectId: number;
3863
4303
  environmentId: number;
4304
+ layoutId: number;
4305
+ livePublishedCheckpointId: number | null;
4306
+ contentUpdatedAt: number;
3864
4307
  pathSegment: string;
3865
4308
  fullPath: string;
3866
4309
  parentPageId: number | null;
3867
- layoutId: number;
3868
4310
  metaTitle: string | null;
3869
4311
  metaDescription: string | null;
3870
4312
  aiSeoEnabled: boolean | null;
3871
4313
  customOgImageBlobId: string | null;
3872
4314
  customOgImageUrl: string | null;
3873
- createdAt: number;
3874
- updatedAt: number;
3875
4315
  };
3876
4316
  projectName: string;
3877
4317
  project: {
@@ -3913,13 +4353,36 @@ declare const router: {
3913
4353
  parentItemId: number | null;
3914
4354
  fieldName: string;
3915
4355
  }[];
3916
- files: any[];
4356
+ files: {
4357
+ id: number;
4358
+ createdAt: number;
4359
+ updatedAt: number;
4360
+ projectId: number | null;
4361
+ environmentId: number;
4362
+ url: string;
4363
+ alt: string;
4364
+ filename: string;
4365
+ mimeType: string;
4366
+ size: number;
4367
+ blobId: string;
4368
+ path: string;
4369
+ aiMetadataEnabled: boolean | null;
4370
+ }[];
3917
4371
  }>, Record<never, never>, Record<never, never>>;
3918
4372
  getStructure: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
3919
4373
  projectSlug: import("zod").ZodString;
3920
4374
  path: import("zod").ZodString;
4375
+ source: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodUnion<readonly [
4376
+ import("zod").ZodLiteral<"live">,
4377
+ import("zod").ZodLiteral<"draft">,
4378
+ import("zod").ZodObject<{
4379
+ checkpointId: import("zod").ZodNumber;
4380
+ }, import("better-auth").$strip>
4381
+ ]>>>;
3921
4382
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
3922
4383
  page: {
4384
+ status: PageStatus;
4385
+ modifiedReason: ModifiedReason | null;
3923
4386
  blockIds: number[];
3924
4387
  id: number;
3925
4388
  projectId: number;
@@ -3933,6 +4396,8 @@ declare const router: {
3933
4396
  aiSeoEnabled: boolean | null;
3934
4397
  customOgImageBlobId: string | null;
3935
4398
  customOgImageUrl: string | null;
4399
+ livePublishedCheckpointId: number | null;
4400
+ contentUpdatedAt: number;
3936
4401
  createdAt: number;
3937
4402
  updatedAt: number;
3938
4403
  };
@@ -3949,6 +4414,8 @@ declare const router: {
3949
4414
  } | null;
3950
4415
  }, {
3951
4416
  page: {
4417
+ status: PageStatus;
4418
+ modifiedReason: ModifiedReason | null;
3952
4419
  blockIds: number[];
3953
4420
  id: number;
3954
4421
  projectId: number;
@@ -3962,6 +4429,8 @@ declare const router: {
3962
4429
  aiSeoEnabled: boolean | null;
3963
4430
  customOgImageBlobId: string | null;
3964
4431
  customOgImageUrl: string | null;
4432
+ livePublishedCheckpointId: number | null;
4433
+ contentUpdatedAt: number;
3965
4434
  createdAt: number;
3966
4435
  updatedAt: number;
3967
4436
  };
@@ -3980,6 +4449,8 @@ declare const router: {
3980
4449
  list: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
3981
4450
  projectId: import("zod").ZodNumber;
3982
4451
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
4452
+ status: PageStatus;
4453
+ modifiedReason: ModifiedReason | null;
3983
4454
  id: number;
3984
4455
  projectId: number;
3985
4456
  environmentId: number;
@@ -3992,9 +4463,13 @@ declare const router: {
3992
4463
  aiSeoEnabled: boolean | null;
3993
4464
  customOgImageBlobId: string | null;
3994
4465
  customOgImageUrl: string | null;
4466
+ livePublishedCheckpointId: number | null;
4467
+ contentUpdatedAt: number;
3995
4468
  createdAt: number;
3996
4469
  updatedAt: number;
3997
4470
  }[], {
4471
+ status: PageStatus;
4472
+ modifiedReason: ModifiedReason | null;
3998
4473
  id: number;
3999
4474
  projectId: number;
4000
4475
  environmentId: number;
@@ -4007,12 +4482,16 @@ declare const router: {
4007
4482
  aiSeoEnabled: boolean | null;
4008
4483
  customOgImageBlobId: string | null;
4009
4484
  customOgImageUrl: string | null;
4485
+ livePublishedCheckpointId: number | null;
4486
+ contentUpdatedAt: number;
4010
4487
  createdAt: number;
4011
4488
  updatedAt: number;
4012
4489
  }[]>, Record<never, never>, Record<never, never>>;
4013
4490
  listBySlug: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
4014
4491
  projectSlug: import("zod").ZodString;
4015
4492
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
4493
+ status: PageStatus;
4494
+ modifiedReason: ModifiedReason | null;
4016
4495
  id: number;
4017
4496
  projectId: number;
4018
4497
  environmentId: number;
@@ -4025,9 +4504,13 @@ declare const router: {
4025
4504
  aiSeoEnabled: boolean | null;
4026
4505
  customOgImageBlobId: string | null;
4027
4506
  customOgImageUrl: string | null;
4507
+ livePublishedCheckpointId: number | null;
4508
+ contentUpdatedAt: number;
4028
4509
  createdAt: number;
4029
4510
  updatedAt: number;
4030
4511
  }[], {
4512
+ status: PageStatus;
4513
+ modifiedReason: ModifiedReason | null;
4031
4514
  id: number;
4032
4515
  projectId: number;
4033
4516
  environmentId: number;
@@ -4040,6 +4523,8 @@ declare const router: {
4040
4523
  aiSeoEnabled: boolean | null;
4041
4524
  customOgImageBlobId: string | null;
4042
4525
  customOgImageUrl: string | null;
4526
+ livePublishedCheckpointId: number | null;
4527
+ contentUpdatedAt: number;
4043
4528
  createdAt: number;
4044
4529
  updatedAt: number;
4045
4530
  }[]>, Record<never, never>, Record<never, never>>;
@@ -4064,6 +4549,8 @@ declare const router: {
4064
4549
  aiSeoEnabled: boolean | null;
4065
4550
  customOgImageBlobId: string | null;
4066
4551
  customOgImageUrl: string | null;
4552
+ livePublishedCheckpointId: number | null;
4553
+ contentUpdatedAt: number;
4067
4554
  createdAt: number;
4068
4555
  updatedAt: number;
4069
4556
  }, {
@@ -4079,6 +4566,8 @@ declare const router: {
4079
4566
  aiSeoEnabled: boolean | null;
4080
4567
  customOgImageBlobId: string | null;
4081
4568
  customOgImageUrl: string | null;
4569
+ livePublishedCheckpointId: number | null;
4570
+ contentUpdatedAt: number;
4082
4571
  createdAt: number;
4083
4572
  updatedAt: number;
4084
4573
  }>, Record<never, never>, Record<never, never>>;
@@ -4125,6 +4614,8 @@ declare const router: {
4125
4614
  projectId: number;
4126
4615
  environmentId: number;
4127
4616
  layoutId: number;
4617
+ livePublishedCheckpointId: number | null;
4618
+ contentUpdatedAt: number;
4128
4619
  pathSegment: string;
4129
4620
  fullPath: string;
4130
4621
  parentPageId: number | null;
@@ -4143,6 +4634,8 @@ declare const router: {
4143
4634
  projectId: number;
4144
4635
  environmentId: number;
4145
4636
  layoutId: number;
4637
+ livePublishedCheckpointId: number | null;
4638
+ contentUpdatedAt: number;
4146
4639
  pathSegment: string;
4147
4640
  fullPath: string;
4148
4641
  parentPageId: number | null;
@@ -4194,6 +4687,8 @@ declare const router: {
4194
4687
  projectId: number;
4195
4688
  environmentId: number;
4196
4689
  layoutId: number;
4690
+ livePublishedCheckpointId: number | null;
4691
+ contentUpdatedAt: number;
4197
4692
  pathSegment: string;
4198
4693
  fullPath: string;
4199
4694
  parentPageId: number | null;
@@ -4209,6 +4704,8 @@ declare const router: {
4209
4704
  projectId: number;
4210
4705
  environmentId: number;
4211
4706
  layoutId: number;
4707
+ livePublishedCheckpointId: number | null;
4708
+ contentUpdatedAt: number;
4212
4709
  pathSegment: string;
4213
4710
  fullPath: string;
4214
4711
  parentPageId: number | null;
@@ -4256,6 +4753,8 @@ declare const router: {
4256
4753
  projectId: number;
4257
4754
  environmentId: number;
4258
4755
  layoutId: number;
4756
+ livePublishedCheckpointId: number | null;
4757
+ contentUpdatedAt: number;
4259
4758
  pathSegment: string;
4260
4759
  fullPath: string;
4261
4760
  parentPageId: number | null;
@@ -4271,6 +4770,8 @@ declare const router: {
4271
4770
  projectId: number;
4272
4771
  environmentId: number;
4273
4772
  layoutId: number;
4773
+ livePublishedCheckpointId: number | null;
4774
+ contentUpdatedAt: number;
4274
4775
  pathSegment: string;
4275
4776
  fullPath: string;
4276
4777
  parentPageId: number | null;
@@ -4319,6 +4820,8 @@ declare const router: {
4319
4820
  projectId: number;
4320
4821
  environmentId: number;
4321
4822
  layoutId: number;
4823
+ livePublishedCheckpointId: number | null;
4824
+ contentUpdatedAt: number;
4322
4825
  pathSegment: string;
4323
4826
  fullPath: string;
4324
4827
  parentPageId: number | null;
@@ -4334,6 +4837,8 @@ declare const router: {
4334
4837
  projectId: number;
4335
4838
  environmentId: number;
4336
4839
  layoutId: number;
4840
+ livePublishedCheckpointId: number | null;
4841
+ contentUpdatedAt: number;
4337
4842
  pathSegment: string;
4338
4843
  fullPath: string;
4339
4844
  parentPageId: number | null;
@@ -4382,6 +4887,8 @@ declare const router: {
4382
4887
  projectId: number;
4383
4888
  environmentId: number;
4384
4889
  layoutId: number;
4890
+ livePublishedCheckpointId: number | null;
4891
+ contentUpdatedAt: number;
4385
4892
  pathSegment: string;
4386
4893
  fullPath: string;
4387
4894
  parentPageId: number | null;
@@ -4397,6 +4904,8 @@ declare const router: {
4397
4904
  projectId: number;
4398
4905
  environmentId: number;
4399
4906
  layoutId: number;
4907
+ livePublishedCheckpointId: number | null;
4908
+ contentUpdatedAt: number;
4400
4909
  pathSegment: string;
4401
4910
  fullPath: string;
4402
4911
  parentPageId: number | null;
@@ -4445,6 +4954,8 @@ declare const router: {
4445
4954
  projectId: number;
4446
4955
  environmentId: number;
4447
4956
  layoutId: number;
4957
+ livePublishedCheckpointId: number | null;
4958
+ contentUpdatedAt: number;
4448
4959
  pathSegment: string;
4449
4960
  fullPath: string;
4450
4961
  parentPageId: number | null;
@@ -4460,6 +4971,8 @@ declare const router: {
4460
4971
  projectId: number;
4461
4972
  environmentId: number;
4462
4973
  layoutId: number;
4974
+ livePublishedCheckpointId: number | null;
4975
+ contentUpdatedAt: number;
4463
4976
  pathSegment: string;
4464
4977
  fullPath: string;
4465
4978
  parentPageId: number | null;
@@ -4508,6 +5021,8 @@ declare const router: {
4508
5021
  projectId: number;
4509
5022
  environmentId: number;
4510
5023
  layoutId: number;
5024
+ livePublishedCheckpointId: number | null;
5025
+ contentUpdatedAt: number;
4511
5026
  pathSegment: string;
4512
5027
  fullPath: string;
4513
5028
  parentPageId: number | null;
@@ -4523,6 +5038,8 @@ declare const router: {
4523
5038
  projectId: number;
4524
5039
  environmentId: number;
4525
5040
  layoutId: number;
5041
+ livePublishedCheckpointId: number | null;
5042
+ contentUpdatedAt: number;
4526
5043
  pathSegment: string;
4527
5044
  fullPath: string;
4528
5045
  parentPageId: number | null;
@@ -4576,6 +5093,8 @@ declare const router: {
4576
5093
  aiSeoEnabled: boolean | null;
4577
5094
  customOgImageBlobId: string | null;
4578
5095
  customOgImageUrl: string | null;
5096
+ livePublishedCheckpointId: number | null;
5097
+ contentUpdatedAt: number;
4579
5098
  createdAt: number;
4580
5099
  updatedAt: number;
4581
5100
  } | undefined, {
@@ -4591,13 +5110,155 @@ declare const router: {
4591
5110
  aiSeoEnabled: boolean | null;
4592
5111
  customOgImageBlobId: string | null;
4593
5112
  customOgImageUrl: string | null;
5113
+ livePublishedCheckpointId: number | null;
5114
+ contentUpdatedAt: number;
4594
5115
  createdAt: number;
4595
5116
  updatedAt: number;
4596
5117
  } | undefined>, Record<never, never>, Record<never, never>>;
5118
+ publish: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>>, import("@orpc/server").MergedCurrentContext<import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, {
5119
+ user: {
5120
+ id: string;
5121
+ createdAt: Date;
5122
+ updatedAt: Date;
5123
+ email: string;
5124
+ emailVerified: boolean;
5125
+ name: string;
5126
+ image?: string | null | undefined;
5127
+ };
5128
+ session: {
5129
+ id: string;
5130
+ createdAt: Date;
5131
+ updatedAt: Date;
5132
+ userId: string;
5133
+ expiresAt: Date;
5134
+ token: string;
5135
+ ipAddress?: string | null | undefined;
5136
+ userAgent?: string | null | undefined;
5137
+ activeOrganizationId?: string | null | undefined;
5138
+ activeTeamId?: string | null | undefined;
5139
+ };
5140
+ env: Bindings;
5141
+ headers: Headers;
5142
+ db: Database;
5143
+ environmentName: string;
5144
+ client: string;
5145
+ telemetryDisabled: boolean;
5146
+ waitUntil: (promise: Promise<unknown>) => void;
5147
+ }>, import("zod").ZodObject<{
5148
+ id: import("zod").ZodNumber;
5149
+ alsoPublishLayout: import("zod").ZodOptional<import("zod").ZodBoolean>;
5150
+ }, import("better-auth").$strip>, import("@orpc/server").Schema<{
5151
+ id: number;
5152
+ createdAt: number;
5153
+ updatedAt: number;
5154
+ projectId: number;
5155
+ environmentId: number;
5156
+ layoutId: number;
5157
+ livePublishedCheckpointId: number | null;
5158
+ contentUpdatedAt: number;
5159
+ pathSegment: string;
5160
+ fullPath: string;
5161
+ parentPageId: number | null;
5162
+ metaTitle: string | null;
5163
+ metaDescription: string | null;
5164
+ aiSeoEnabled: boolean | null;
5165
+ customOgImageBlobId: string | null;
5166
+ customOgImageUrl: string | null;
5167
+ }, {
5168
+ id: number;
5169
+ createdAt: number;
5170
+ updatedAt: number;
5171
+ projectId: number;
5172
+ environmentId: number;
5173
+ layoutId: number;
5174
+ livePublishedCheckpointId: number | null;
5175
+ contentUpdatedAt: number;
5176
+ pathSegment: string;
5177
+ fullPath: string;
5178
+ parentPageId: number | null;
5179
+ metaTitle: string | null;
5180
+ metaDescription: string | null;
5181
+ aiSeoEnabled: boolean | null;
5182
+ customOgImageBlobId: string | null;
5183
+ customOgImageUrl: string | null;
5184
+ }>, Record<never, never>, Record<never, never>>;
5185
+ unpublish: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>>, import("@orpc/server").MergedCurrentContext<import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, {
5186
+ user: {
5187
+ id: string;
5188
+ createdAt: Date;
5189
+ updatedAt: Date;
5190
+ email: string;
5191
+ emailVerified: boolean;
5192
+ name: string;
5193
+ image?: string | null | undefined;
5194
+ };
5195
+ session: {
5196
+ id: string;
5197
+ createdAt: Date;
5198
+ updatedAt: Date;
5199
+ userId: string;
5200
+ expiresAt: Date;
5201
+ token: string;
5202
+ ipAddress?: string | null | undefined;
5203
+ userAgent?: string | null | undefined;
5204
+ activeOrganizationId?: string | null | undefined;
5205
+ activeTeamId?: string | null | undefined;
5206
+ };
5207
+ env: Bindings;
5208
+ headers: Headers;
5209
+ db: Database;
5210
+ environmentName: string;
5211
+ client: string;
5212
+ telemetryDisabled: boolean;
5213
+ waitUntil: (promise: Promise<unknown>) => void;
5214
+ }>, import("zod").ZodObject<{
5215
+ id: import("zod").ZodNumber;
5216
+ }, import("better-auth").$strip>, import("@orpc/server").Schema<{
5217
+ id: number;
5218
+ createdAt: number;
5219
+ updatedAt: number;
5220
+ projectId: number;
5221
+ environmentId: number;
5222
+ layoutId: number;
5223
+ livePublishedCheckpointId: number | null;
5224
+ contentUpdatedAt: number;
5225
+ pathSegment: string;
5226
+ fullPath: string;
5227
+ parentPageId: number | null;
5228
+ metaTitle: string | null;
5229
+ metaDescription: string | null;
5230
+ aiSeoEnabled: boolean | null;
5231
+ customOgImageBlobId: string | null;
5232
+ customOgImageUrl: string | null;
5233
+ }, {
5234
+ id: number;
5235
+ createdAt: number;
5236
+ updatedAt: number;
5237
+ projectId: number;
5238
+ environmentId: number;
5239
+ layoutId: number;
5240
+ livePublishedCheckpointId: number | null;
5241
+ contentUpdatedAt: number;
5242
+ pathSegment: string;
5243
+ fullPath: string;
5244
+ parentPageId: number | null;
5245
+ metaTitle: string | null;
5246
+ metaDescription: string | null;
5247
+ aiSeoEnabled: boolean | null;
5248
+ customOgImageBlobId: string | null;
5249
+ customOgImageUrl: string | null;
5250
+ }>, Record<never, never>, Record<never, never>>;
4597
5251
  };
4598
5252
  blocks: {
4599
5253
  get: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
4600
5254
  id: import("zod").ZodNumber;
5255
+ source: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodUnion<readonly [
5256
+ import("zod").ZodLiteral<"live">,
5257
+ import("zod").ZodLiteral<"draft">,
5258
+ import("zod").ZodObject<{
5259
+ checkpointId: import("zod").ZodNumber;
5260
+ }, import("better-auth").$strip>
5261
+ ]>>>;
4601
5262
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
4602
5263
  block: {
4603
5264
  content: {
@@ -5180,19 +5841,27 @@ declare const router: {
5180
5841
  list: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
5181
5842
  projectId: import("zod").ZodNumber;
5182
5843
  }, import("better-auth").$strip>, import("@orpc/server").Schema<{
5844
+ status: LayoutStatus;
5845
+ affectedPagesCount: number;
5183
5846
  id: number;
5184
5847
  projectId: number;
5185
5848
  environmentId: number;
5186
5849
  layoutId: string;
5187
5850
  description: string | null;
5851
+ livePublishedCheckpointId: number | null;
5852
+ contentUpdatedAt: number;
5188
5853
  createdAt: number;
5189
5854
  updatedAt: number;
5190
5855
  }[], {
5856
+ status: LayoutStatus;
5857
+ affectedPagesCount: number;
5191
5858
  id: number;
5192
5859
  projectId: number;
5193
5860
  environmentId: number;
5194
5861
  layoutId: string;
5195
5862
  description: string | null;
5863
+ livePublishedCheckpointId: number | null;
5864
+ contentUpdatedAt: number;
5196
5865
  createdAt: number;
5197
5866
  updatedAt: number;
5198
5867
  }[]>, Record<never, never>, Record<never, never>>;
@@ -5230,6 +5899,8 @@ declare const router: {
5230
5899
  environmentId: number;
5231
5900
  layoutId: string;
5232
5901
  description: string | null;
5902
+ livePublishedCheckpointId: number | null;
5903
+ contentUpdatedAt: number;
5233
5904
  };
5234
5905
  wasExisting: boolean;
5235
5906
  createdBlockTypes: string[];
@@ -5252,6 +5923,8 @@ declare const router: {
5252
5923
  environmentId: number;
5253
5924
  layoutId: string;
5254
5925
  description: string | null;
5926
+ livePublishedCheckpointId: number | null;
5927
+ contentUpdatedAt: number;
5255
5928
  };
5256
5929
  wasExisting: boolean;
5257
5930
  createdBlockTypes: string[];
@@ -5265,6 +5938,110 @@ declare const router: {
5265
5938
  }[];
5266
5939
  deletedDefinitionTypes: string[];
5267
5940
  }>, Record<never, never>, Record<never, never>>;
5941
+ publish: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>>, import("@orpc/server").MergedCurrentContext<import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, {
5942
+ user: {
5943
+ id: string;
5944
+ createdAt: Date;
5945
+ updatedAt: Date;
5946
+ email: string;
5947
+ emailVerified: boolean;
5948
+ name: string;
5949
+ image?: string | null | undefined;
5950
+ };
5951
+ session: {
5952
+ id: string;
5953
+ createdAt: Date;
5954
+ updatedAt: Date;
5955
+ userId: string;
5956
+ expiresAt: Date;
5957
+ token: string;
5958
+ ipAddress?: string | null | undefined;
5959
+ userAgent?: string | null | undefined;
5960
+ activeOrganizationId?: string | null | undefined;
5961
+ activeTeamId?: string | null | undefined;
5962
+ };
5963
+ env: Bindings;
5964
+ headers: Headers;
5965
+ db: Database;
5966
+ environmentName: string;
5967
+ client: string;
5968
+ telemetryDisabled: boolean;
5969
+ waitUntil: (promise: Promise<unknown>) => void;
5970
+ }>, import("zod").ZodObject<{
5971
+ id: import("zod").ZodNumber;
5972
+ }, import("better-auth").$strip>, import("@orpc/server").Schema<{
5973
+ id: number;
5974
+ projectId: number;
5975
+ environmentId: number;
5976
+ layoutId: string;
5977
+ description: string | null;
5978
+ livePublishedCheckpointId: number | null;
5979
+ contentUpdatedAt: number;
5980
+ createdAt: number;
5981
+ updatedAt: number;
5982
+ } | undefined, {
5983
+ id: number;
5984
+ projectId: number;
5985
+ environmentId: number;
5986
+ layoutId: string;
5987
+ description: string | null;
5988
+ livePublishedCheckpointId: number | null;
5989
+ contentUpdatedAt: number;
5990
+ createdAt: number;
5991
+ updatedAt: number;
5992
+ } | undefined>, Record<never, never>, Record<never, never>>;
5993
+ unpublish: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>>, import("@orpc/server").MergedCurrentContext<import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, {
5994
+ user: {
5995
+ id: string;
5996
+ createdAt: Date;
5997
+ updatedAt: Date;
5998
+ email: string;
5999
+ emailVerified: boolean;
6000
+ name: string;
6001
+ image?: string | null | undefined;
6002
+ };
6003
+ session: {
6004
+ id: string;
6005
+ createdAt: Date;
6006
+ updatedAt: Date;
6007
+ userId: string;
6008
+ expiresAt: Date;
6009
+ token: string;
6010
+ ipAddress?: string | null | undefined;
6011
+ userAgent?: string | null | undefined;
6012
+ activeOrganizationId?: string | null | undefined;
6013
+ activeTeamId?: string | null | undefined;
6014
+ };
6015
+ env: Bindings;
6016
+ headers: Headers;
6017
+ db: Database;
6018
+ environmentName: string;
6019
+ client: string;
6020
+ telemetryDisabled: boolean;
6021
+ waitUntil: (promise: Promise<unknown>) => void;
6022
+ }>, import("zod").ZodObject<{
6023
+ id: import("zod").ZodNumber;
6024
+ }, import("better-auth").$strip>, import("@orpc/server").Schema<{
6025
+ id: number;
6026
+ createdAt: number;
6027
+ updatedAt: number;
6028
+ projectId: number;
6029
+ environmentId: number;
6030
+ layoutId: string;
6031
+ description: string | null;
6032
+ livePublishedCheckpointId: number | null;
6033
+ contentUpdatedAt: number;
6034
+ }, {
6035
+ id: number;
6036
+ createdAt: number;
6037
+ updatedAt: number;
6038
+ projectId: number;
6039
+ environmentId: number;
6040
+ layoutId: string;
6041
+ description: string | null;
6042
+ livePublishedCheckpointId: number | null;
6043
+ contentUpdatedAt: number;
6044
+ }>, Record<never, never>, Record<never, never>>;
5268
6045
  };
5269
6046
  files: {
5270
6047
  list: import("@orpc/server").DecoratedProcedure<import("@orpc/server").MergedInitialContext<BaseContext & Record<never, never>, BaseContext, BaseContext>, import("@orpc/server").MergedCurrentContext<BaseContext, Record<never, never>>, import("zod").ZodObject<{
@@ -4,10 +4,23 @@
4
4
  * so we ensure there won't be any key collisions.
5
5
  */
6
6
  export type QueryKey = [first: "camox", ...rest: Array<string | number>];
7
+ /**
8
+ * Source axis on read query keys. `'live'` reads the page's live published
9
+ * checkpoint snapshot; `'draft'` reads the live editor rows. The two render
10
+ * through the same component — only the cache slot differs, so toggling the
11
+ * source select is instant once both have been seeded.
12
+ *
13
+ * Block / page-read query keys include the source as the trailing key segment.
14
+ * Omitting it on `invalidateQueries` is a prefix invalidation that hits every
15
+ * source — used for navigation events and other source-agnostic invalidations.
16
+ * Edit-time invalidations (which only touch draft data) pass `'draft'`
17
+ * explicitly so the `'live'` cache stays untouched.
18
+ */
19
+ export type ReadSource = "draft" | "live";
7
20
  export declare const queryKeys: {
8
21
  pages: {
9
22
  list: ["camox", string, string];
10
- getByPath: (path: string) => ["camox", string, string, string];
23
+ getByPath: (path: string, source?: ReadSource) => ["camox", string, string, string, ReadSource] | ["camox", string, string, string];
11
24
  getByPathAll: ["camox", string, string];
12
25
  getById: (id: number) => ["camox", string, string, number];
13
26
  };
@@ -16,7 +29,7 @@ export declare const queryKeys: {
16
29
  get: (id: number) => ["camox", string, string, number];
17
30
  };
18
31
  blocks: {
19
- get: (id: number) => ["camox", string, string, number];
32
+ get: (id: number, source?: ReadSource) => ["camox", string, string, number] | ["camox", string, string, number, ReadSource];
20
33
  getUsageCounts: ["camox", string, string];
21
34
  getPageMarkdown: (pageId: number) => ["camox", string, string, number];
22
35
  };
@@ -1,7 +1,9 @@
1
1
  export const queryKeys = {
2
2
  pages: {
3
3
  list: ["camox", "pages", "list"],
4
- getByPath: (path) => ["camox", "pages", "getByPath", path],
4
+ getByPath: (path, source) => source
5
+ ? ["camox", "pages", "getByPath", path, source]
6
+ : ["camox", "pages", "getByPath", path],
5
7
  getByPathAll: ["camox", "pages", "getByPath"],
6
8
  getById: (id) => ["camox", "pages", "getById", id],
7
9
  },
@@ -10,7 +12,7 @@ export const queryKeys = {
10
12
  get: (id) => ["camox", "files", "get", id],
11
13
  },
12
14
  blocks: {
13
- get: (id) => ["camox", "blocks", "get", id],
15
+ get: (id, source) => source ? ["camox", "blocks", "get", id, source] : ["camox", "blocks", "get", id],
14
16
  getUsageCounts: ["camox", "blocks", "getUsageCounts"],
15
17
  getPageMarkdown: (pageId) => ["camox", "blocks", "getPageMarkdown", pageId],
16
18
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camox/api-contract",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "files": [
5
5
  "src",
6
6
  "dist"
package/src/query-keys.ts CHANGED
@@ -6,10 +6,27 @@
6
6
  export type QueryKey = [first: "camox", ...rest: Array<string | number>];
7
7
  type QueryKeyGroup = Record<string, QueryKey | ((...args: any[]) => QueryKey)>;
8
8
 
9
+ /**
10
+ * Source axis on read query keys. `'live'` reads the page's live published
11
+ * checkpoint snapshot; `'draft'` reads the live editor rows. The two render
12
+ * through the same component — only the cache slot differs, so toggling the
13
+ * source select is instant once both have been seeded.
14
+ *
15
+ * Block / page-read query keys include the source as the trailing key segment.
16
+ * Omitting it on `invalidateQueries` is a prefix invalidation that hits every
17
+ * source — used for navigation events and other source-agnostic invalidations.
18
+ * Edit-time invalidations (which only touch draft data) pass `'draft'`
19
+ * explicitly so the `'live'` cache stays untouched.
20
+ */
21
+ export type ReadSource = "draft" | "live";
22
+
9
23
  export const queryKeys = {
10
24
  pages: {
11
25
  list: ["camox", "pages", "list"],
12
- getByPath: (path: string) => ["camox", "pages", "getByPath", path],
26
+ getByPath: (path: string, source?: ReadSource) =>
27
+ source
28
+ ? ["camox", "pages", "getByPath", path, source]
29
+ : ["camox", "pages", "getByPath", path],
13
30
  getByPathAll: ["camox", "pages", "getByPath"],
14
31
  getById: (id: number) => ["camox", "pages", "getById", id],
15
32
  },
@@ -18,7 +35,8 @@ export const queryKeys = {
18
35
  get: (id: number) => ["camox", "files", "get", id],
19
36
  },
20
37
  blocks: {
21
- get: (id: number) => ["camox", "blocks", "get", id],
38
+ get: (id: number, source?: ReadSource) =>
39
+ source ? ["camox", "blocks", "get", id, source] : ["camox", "blocks", "get", id],
22
40
  getUsageCounts: ["camox", "blocks", "getUsageCounts"],
23
41
  getPageMarkdown: (pageId: number) => ["camox", "blocks", "getPageMarkdown", pageId],
24
42
  },