@takuhon/core 0.1.0 → 0.2.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
@@ -1,5 +1,5 @@
1
1
  var $schema = "https://json-schema.org/draft/2020-12/schema";
2
- var $id = "https://takuhon.example/schemas/0.1.0/takuhon.schema.json";
2
+ var $id = "https://takuhon.example/schemas/0.2.0/takuhon.schema.json";
3
3
  var title = "Takuhon Profile";
4
4
  var description = "Portable profile data format consumed by @takuhon/core. The canonical contract for profile content authored as takuhon.json.";
5
5
  var type = "object";
@@ -52,6 +52,69 @@ var properties = {
52
52
  $ref: "#/$defs/Skill"
53
53
  }
54
54
  },
55
+ certifications: {
56
+ type: "array",
57
+ maxItems: 50,
58
+ items: {
59
+ $ref: "#/$defs/Certification"
60
+ }
61
+ },
62
+ memberships: {
63
+ type: "array",
64
+ maxItems: 50,
65
+ items: {
66
+ $ref: "#/$defs/Membership"
67
+ }
68
+ },
69
+ volunteering: {
70
+ type: "array",
71
+ maxItems: 50,
72
+ items: {
73
+ $ref: "#/$defs/Volunteering"
74
+ }
75
+ },
76
+ honors: {
77
+ type: "array",
78
+ maxItems: 50,
79
+ items: {
80
+ $ref: "#/$defs/Honor"
81
+ }
82
+ },
83
+ education: {
84
+ type: "array",
85
+ maxItems: 30,
86
+ items: {
87
+ $ref: "#/$defs/Education"
88
+ }
89
+ },
90
+ publications: {
91
+ type: "array",
92
+ maxItems: 100,
93
+ items: {
94
+ $ref: "#/$defs/Publication"
95
+ }
96
+ },
97
+ languages: {
98
+ type: "array",
99
+ maxItems: 30,
100
+ items: {
101
+ $ref: "#/$defs/Language"
102
+ }
103
+ },
104
+ courses: {
105
+ type: "array",
106
+ maxItems: 100,
107
+ items: {
108
+ $ref: "#/$defs/Course"
109
+ }
110
+ },
111
+ patents: {
112
+ type: "array",
113
+ maxItems: 50,
114
+ items: {
115
+ $ref: "#/$defs/Patent"
116
+ }
117
+ },
55
118
  contact: {
56
119
  $ref: "#/$defs/Contact"
57
120
  },
@@ -489,6 +552,9 @@ var $defs = {
489
552
  },
490
553
  contentLicense: {
491
554
  $ref: "#/$defs/ContentLicense"
555
+ },
556
+ privacy: {
557
+ $ref: "#/$defs/MetaPrivacy"
492
558
  }
493
559
  }
494
560
  },
@@ -529,262 +595,1067 @@ var $defs = {
529
595
  description: "Free-form rights statement (used when spdxId='Proprietary' or for additional notices)."
530
596
  }
531
597
  }
532
- }
533
- };
534
- var schemaJson = {
535
- $schema: $schema,
536
- $id: $id,
537
- title: title,
538
- description: description,
539
- type: type,
540
- additionalProperties: additionalProperties,
541
- required: required,
542
- properties: properties,
543
- $defs: $defs
544
- };
545
-
546
- /**
547
- * Re-exports the canonical JSON Schema for takuhon profiles.
548
- *
549
- * The schema source of truth lives at `packages/core/takuhon.schema.json`
550
- * (also distributed via the `@takuhon/core/schema.json` sub-path). This module
551
- * is the convenient ESM-side entry point for consumers that want to feed it
552
- * directly to a JSON Schema validator (e.g. Ajv) without a filesystem read.
553
- */
554
-
555
- declare const schema: {
556
- $schema: string;
557
- $id: string;
558
- title: string;
559
- description: string;
560
- type: string;
561
- additionalProperties: boolean;
562
- required: string[];
563
- properties: {
564
- schemaVersion: {
565
- type: string;
566
- pattern: string;
567
- description: string;
568
- };
569
- profile: {
570
- $ref: string;
571
- };
572
- links: {
573
- type: string;
574
- maxItems: number;
575
- items: {
576
- $ref: string;
577
- };
578
- };
579
- careers: {
580
- type: string;
581
- maxItems: number;
582
- items: {
583
- $ref: string;
584
- };
585
- };
586
- projects: {
587
- type: string;
588
- maxItems: number;
589
- items: {
590
- $ref: string;
591
- };
592
- };
593
- skills: {
594
- type: string;
595
- maxItems: number;
596
- items: {
597
- $ref: string;
598
- };
599
- };
600
- contact: {
601
- $ref: string;
602
- };
603
- settings: {
604
- $ref: string;
605
- };
606
- meta: {
607
- $ref: string;
608
- };
609
- };
610
- $defs: {
611
- LocaleTag: {
612
- type: string;
613
- minLength: number;
614
- maxLength: number;
615
- pattern: string;
616
- description: string;
617
- };
618
- Iso3166Alpha2: {
619
- type: string;
620
- pattern: string;
621
- description: string;
622
- };
623
- YearMonth: {
624
- type: string;
625
- pattern: string;
626
- description: string;
627
- };
628
- IsoDateTime: {
629
- type: string;
630
- format: string;
631
- description: string;
632
- };
633
- Url: {
634
- type: string;
635
- format: string;
636
- maxLength: number;
637
- };
638
- Email: {
639
- type: string;
640
- format: string;
641
- maxLength: number;
642
- };
643
- Slug: {
644
- type: string;
645
- minLength: number;
646
- maxLength: number;
647
- pattern: string;
648
- description: string;
649
- };
650
- LocalizedTitle: {
651
- type: string;
652
- minProperties: number;
653
- propertyNames: {
654
- type: string;
655
- pattern: string;
656
- };
657
- additionalProperties: {
658
- type: string;
659
- minLength: number;
660
- maxLength: number;
661
- };
662
- description: string;
663
- };
664
- LocalizedBody: {
665
- type: string;
666
- minProperties: number;
667
- propertyNames: {
668
- type: string;
669
- pattern: string;
670
- };
671
- additionalProperties: {
672
- type: string;
673
- minLength: number;
674
- maxLength: number;
675
- };
676
- description: string;
677
- };
678
- LinkType: {
679
- type: string;
680
- enum: string[];
681
- description: string;
682
- };
683
- Profile: {
684
- type: string;
685
- additionalProperties: boolean;
686
- required: string[];
687
- properties: {
688
- displayName: {
689
- $ref: string;
690
- };
691
- tagline: {
692
- $ref: string;
693
- };
694
- bio: {
695
- $ref: string;
696
- };
697
- avatar: {
698
- $ref: string;
699
- };
700
- location: {
701
- $ref: string;
702
- };
703
- };
704
- };
705
- Avatar: {
706
- type: string;
707
- additionalProperties: boolean;
708
- required: string[];
709
- properties: {
710
- url: {
711
- type: string;
712
- format: string;
713
- maxLength: number;
714
- description: string;
715
- };
716
- alt: {
717
- $ref: string;
718
- };
719
- };
720
- };
721
- Address: {
722
- type: string;
723
- additionalProperties: boolean;
724
- properties: {
725
- country: {
726
- $ref: string;
727
- };
728
- region: {
729
- type: string;
730
- maxLength: number;
731
- };
732
- locality: {
733
- $ref: string;
734
- };
735
- display: {
736
- $ref: string;
737
- };
738
- };
739
- };
740
- Link: {
741
- type: string;
742
- additionalProperties: boolean;
743
- required: string[];
598
+ },
599
+ MetaPrivacy: {
600
+ type: "object",
601
+ additionalProperties: true,
602
+ description: "Opt-out flags that strip personally identifying fields from public API output (GET /api/profile, /api/jsonld, /takuhon.json). Admin endpoints (PUT /api/admin/*, GET /api/export) ignore these flags. Privacy-by-default: omitting the object or individual flags is equivalent to true.",
603
+ properties: {
604
+ hideCredentialIds: {
605
+ type: "boolean",
606
+ "default": true,
607
+ description: "When true (default), strip certifications[*].credentialId from public responses."
608
+ },
609
+ hideEducationGrades: {
610
+ type: "boolean",
611
+ "default": true,
612
+ description: "When true (default), strip education[*].grade from public responses."
613
+ }
614
+ }
615
+ },
616
+ Certification: {
617
+ type: "object",
618
+ additionalProperties: true,
619
+ required: [
620
+ "id",
621
+ "title",
622
+ "issuingOrganization",
623
+ "issueDate"
624
+ ],
625
+ properties: {
626
+ id: {
627
+ $ref: "#/$defs/Slug"
628
+ },
629
+ title: {
630
+ $ref: "#/$defs/LocalizedTitle"
631
+ },
632
+ issuingOrganization: {
633
+ $ref: "#/$defs/LocalizedTitle"
634
+ },
635
+ issueDate: {
636
+ $ref: "#/$defs/YearMonth"
637
+ },
638
+ expirationDate: {
639
+ anyOf: [
640
+ {
641
+ $ref: "#/$defs/YearMonth"
642
+ },
643
+ {
644
+ type: "null"
645
+ }
646
+ ],
647
+ description: "null = explicitly 'no expiration'. Omit if unknown/unstated."
648
+ },
649
+ credentialId: {
650
+ type: "string",
651
+ minLength: 1,
652
+ maxLength: 100,
653
+ description: "License or certificate number. Public exposure controlled by meta.privacy.hideCredentialIds."
654
+ },
655
+ url: {
656
+ $ref: "#/$defs/Url"
657
+ },
658
+ order: {
659
+ type: "integer",
660
+ minimum: 0
661
+ }
662
+ }
663
+ },
664
+ Membership: {
665
+ type: "object",
666
+ additionalProperties: true,
667
+ required: [
668
+ "id",
669
+ "organization",
670
+ "startDate"
671
+ ],
672
+ properties: {
673
+ id: {
674
+ $ref: "#/$defs/Slug"
675
+ },
676
+ organization: {
677
+ $ref: "#/$defs/LocalizedTitle"
678
+ },
679
+ role: {
680
+ $ref: "#/$defs/LocalizedTitle"
681
+ },
682
+ description: {
683
+ $ref: "#/$defs/LocalizedBody"
684
+ },
685
+ startDate: {
686
+ $ref: "#/$defs/YearMonth"
687
+ },
688
+ endDate: {
689
+ anyOf: [
690
+ {
691
+ $ref: "#/$defs/YearMonth"
692
+ },
693
+ {
694
+ type: "null"
695
+ }
696
+ ],
697
+ description: "null = ongoing. Omit if unknown."
698
+ },
699
+ isCurrent: {
700
+ type: "boolean"
701
+ },
702
+ url: {
703
+ $ref: "#/$defs/Url"
704
+ },
705
+ order: {
706
+ type: "integer",
707
+ minimum: 0
708
+ }
709
+ }
710
+ },
711
+ Volunteering: {
712
+ type: "object",
713
+ additionalProperties: true,
714
+ required: [
715
+ "id",
716
+ "organization",
717
+ "role",
718
+ "startDate"
719
+ ],
720
+ properties: {
721
+ id: {
722
+ $ref: "#/$defs/Slug"
723
+ },
724
+ organization: {
725
+ $ref: "#/$defs/LocalizedTitle"
726
+ },
727
+ role: {
728
+ $ref: "#/$defs/LocalizedTitle"
729
+ },
730
+ cause: {
731
+ $ref: "#/$defs/LocalizedTitle"
732
+ },
733
+ description: {
734
+ $ref: "#/$defs/LocalizedBody"
735
+ },
736
+ startDate: {
737
+ $ref: "#/$defs/YearMonth"
738
+ },
739
+ endDate: {
740
+ anyOf: [
741
+ {
742
+ $ref: "#/$defs/YearMonth"
743
+ },
744
+ {
745
+ type: "null"
746
+ }
747
+ ]
748
+ },
749
+ isCurrent: {
750
+ type: "boolean"
751
+ },
752
+ url: {
753
+ $ref: "#/$defs/Url"
754
+ },
755
+ order: {
756
+ type: "integer",
757
+ minimum: 0
758
+ }
759
+ }
760
+ },
761
+ Honor: {
762
+ type: "object",
763
+ additionalProperties: true,
764
+ required: [
765
+ "id",
766
+ "title",
767
+ "issuer",
768
+ "date"
769
+ ],
770
+ properties: {
771
+ id: {
772
+ $ref: "#/$defs/Slug"
773
+ },
774
+ title: {
775
+ $ref: "#/$defs/LocalizedTitle"
776
+ },
777
+ issuer: {
778
+ $ref: "#/$defs/LocalizedTitle"
779
+ },
780
+ description: {
781
+ $ref: "#/$defs/LocalizedBody"
782
+ },
783
+ date: {
784
+ $ref: "#/$defs/YearMonth"
785
+ },
786
+ url: {
787
+ $ref: "#/$defs/Url"
788
+ },
789
+ order: {
790
+ type: "integer",
791
+ minimum: 0
792
+ }
793
+ }
794
+ },
795
+ Education: {
796
+ type: "object",
797
+ additionalProperties: true,
798
+ required: [
799
+ "id",
800
+ "institution",
801
+ "startDate"
802
+ ],
803
+ properties: {
804
+ id: {
805
+ $ref: "#/$defs/Slug"
806
+ },
807
+ institution: {
808
+ $ref: "#/$defs/LocalizedTitle"
809
+ },
810
+ degree: {
811
+ $ref: "#/$defs/LocalizedTitle"
812
+ },
813
+ fieldOfStudy: {
814
+ $ref: "#/$defs/LocalizedTitle"
815
+ },
816
+ description: {
817
+ $ref: "#/$defs/LocalizedBody"
818
+ },
819
+ grade: {
820
+ type: "string",
821
+ minLength: 1,
822
+ maxLength: 50,
823
+ description: "Free-form grade / class / GPA. Public exposure controlled by meta.privacy.hideEducationGrades."
824
+ },
825
+ startDate: {
826
+ $ref: "#/$defs/YearMonth"
827
+ },
828
+ endDate: {
829
+ anyOf: [
830
+ {
831
+ $ref: "#/$defs/YearMonth"
832
+ },
833
+ {
834
+ type: "null"
835
+ }
836
+ ],
837
+ description: "null = currently enrolled."
838
+ },
839
+ isCurrent: {
840
+ type: "boolean"
841
+ },
842
+ url: {
843
+ $ref: "#/$defs/Url"
844
+ },
845
+ order: {
846
+ type: "integer",
847
+ minimum: 0
848
+ }
849
+ }
850
+ },
851
+ Publication: {
852
+ type: "object",
853
+ additionalProperties: true,
854
+ required: [
855
+ "id",
856
+ "title",
857
+ "date"
858
+ ],
859
+ properties: {
860
+ id: {
861
+ $ref: "#/$defs/Slug"
862
+ },
863
+ title: {
864
+ $ref: "#/$defs/LocalizedTitle"
865
+ },
866
+ publisher: {
867
+ $ref: "#/$defs/LocalizedTitle"
868
+ },
869
+ description: {
870
+ $ref: "#/$defs/LocalizedBody"
871
+ },
872
+ date: {
873
+ $ref: "#/$defs/YearMonth"
874
+ },
875
+ url: {
876
+ $ref: "#/$defs/Url"
877
+ },
878
+ doi: {
879
+ type: "string",
880
+ minLength: 1,
881
+ maxLength: 200,
882
+ description: "DOI identifier (e.g. '10.1145/3548643.3548644'). The full URL goes in 'url'."
883
+ },
884
+ coAuthors: {
885
+ type: "array",
886
+ maxItems: 50,
887
+ items: {
888
+ type: "string",
889
+ minLength: 1,
890
+ maxLength: 100
891
+ },
892
+ description: "Co-author names in original script. Excludes the profile owner."
893
+ },
894
+ order: {
895
+ type: "integer",
896
+ minimum: 0
897
+ }
898
+ }
899
+ },
900
+ Language: {
901
+ type: "object",
902
+ additionalProperties: true,
903
+ required: [
904
+ "id",
905
+ "language",
906
+ "proficiency"
907
+ ],
908
+ properties: {
909
+ id: {
910
+ $ref: "#/$defs/Slug"
911
+ },
912
+ language: {
913
+ $ref: "#/$defs/LocaleTag"
914
+ },
915
+ displayName: {
916
+ $ref: "#/$defs/LocalizedTitle"
917
+ },
918
+ proficiency: {
919
+ type: "string",
920
+ "enum": [
921
+ "native",
922
+ "fluent",
923
+ "professional",
924
+ "intermediate",
925
+ "basic"
926
+ ],
927
+ description: "LinkedIn-compatible 5-level proficiency."
928
+ },
929
+ order: {
930
+ type: "integer",
931
+ minimum: 0
932
+ }
933
+ }
934
+ },
935
+ Course: {
936
+ type: "object",
937
+ additionalProperties: true,
938
+ required: [
939
+ "id",
940
+ "title"
941
+ ],
942
+ properties: {
943
+ id: {
944
+ $ref: "#/$defs/Slug"
945
+ },
946
+ title: {
947
+ $ref: "#/$defs/LocalizedTitle"
948
+ },
949
+ provider: {
950
+ $ref: "#/$defs/LocalizedTitle"
951
+ },
952
+ courseNumber: {
953
+ type: "string",
954
+ minLength: 1,
955
+ maxLength: 50
956
+ },
957
+ description: {
958
+ $ref: "#/$defs/LocalizedBody"
959
+ },
960
+ completionDate: {
961
+ $ref: "#/$defs/YearMonth"
962
+ },
963
+ certificateUrl: {
964
+ $ref: "#/$defs/Url"
965
+ },
966
+ relatedEducationId: {
967
+ $ref: "#/$defs/Slug",
968
+ description: "Optional reference to an education[].id (e.g. for university coursework)."
969
+ },
970
+ order: {
971
+ type: "integer",
972
+ minimum: 0
973
+ }
974
+ }
975
+ },
976
+ Patent: {
977
+ type: "object",
978
+ additionalProperties: true,
979
+ required: [
980
+ "id",
981
+ "title",
982
+ "patentNumber",
983
+ "status"
984
+ ],
985
+ properties: {
986
+ id: {
987
+ $ref: "#/$defs/Slug"
988
+ },
989
+ title: {
990
+ $ref: "#/$defs/LocalizedTitle"
991
+ },
992
+ patentNumber: {
993
+ type: "string",
994
+ minLength: 1,
995
+ maxLength: 100
996
+ },
997
+ office: {
998
+ type: "string",
999
+ maxLength: 100,
1000
+ description: "Patent office name (e.g. 'USPTO', 'JPO', 'EPO')."
1001
+ },
1002
+ status: {
1003
+ type: "string",
1004
+ "enum": [
1005
+ "pending",
1006
+ "issued",
1007
+ "expired",
1008
+ "abandoned"
1009
+ ]
1010
+ },
1011
+ description: {
1012
+ $ref: "#/$defs/LocalizedBody"
1013
+ },
1014
+ filingDate: {
1015
+ $ref: "#/$defs/YearMonth"
1016
+ },
1017
+ grantDate: {
1018
+ $ref: "#/$defs/YearMonth"
1019
+ },
1020
+ url: {
1021
+ $ref: "#/$defs/Url"
1022
+ },
1023
+ coInventors: {
1024
+ type: "array",
1025
+ maxItems: 20,
1026
+ items: {
1027
+ type: "string",
1028
+ minLength: 1,
1029
+ maxLength: 100
1030
+ }
1031
+ },
1032
+ order: {
1033
+ type: "integer",
1034
+ minimum: 0
1035
+ }
1036
+ }
1037
+ }
1038
+ };
1039
+ var schemaJson = {
1040
+ $schema: $schema,
1041
+ $id: $id,
1042
+ title: title,
1043
+ description: description,
1044
+ type: type,
1045
+ additionalProperties: additionalProperties,
1046
+ required: required,
1047
+ properties: properties,
1048
+ $defs: $defs
1049
+ };
1050
+
1051
+ /**
1052
+ * Re-exports the canonical JSON Schema for takuhon profiles.
1053
+ *
1054
+ * The schema source of truth lives at `packages/core/takuhon.schema.json`
1055
+ * (also distributed via the `@takuhon/core/schema.json` sub-path). This module
1056
+ * is the convenient ESM-side entry point for consumers that want to feed it
1057
+ * directly to a JSON Schema validator (e.g. Ajv) without a filesystem read.
1058
+ */
1059
+
1060
+ declare const schema: {
1061
+ $schema: string;
1062
+ $id: string;
1063
+ title: string;
1064
+ description: string;
1065
+ type: string;
1066
+ additionalProperties: boolean;
1067
+ required: string[];
1068
+ properties: {
1069
+ schemaVersion: {
1070
+ type: string;
1071
+ pattern: string;
1072
+ description: string;
1073
+ };
1074
+ profile: {
1075
+ $ref: string;
1076
+ };
1077
+ links: {
1078
+ type: string;
1079
+ maxItems: number;
1080
+ items: {
1081
+ $ref: string;
1082
+ };
1083
+ };
1084
+ careers: {
1085
+ type: string;
1086
+ maxItems: number;
1087
+ items: {
1088
+ $ref: string;
1089
+ };
1090
+ };
1091
+ projects: {
1092
+ type: string;
1093
+ maxItems: number;
1094
+ items: {
1095
+ $ref: string;
1096
+ };
1097
+ };
1098
+ skills: {
1099
+ type: string;
1100
+ maxItems: number;
1101
+ items: {
1102
+ $ref: string;
1103
+ };
1104
+ };
1105
+ certifications: {
1106
+ type: string;
1107
+ maxItems: number;
1108
+ items: {
1109
+ $ref: string;
1110
+ };
1111
+ };
1112
+ memberships: {
1113
+ type: string;
1114
+ maxItems: number;
1115
+ items: {
1116
+ $ref: string;
1117
+ };
1118
+ };
1119
+ volunteering: {
1120
+ type: string;
1121
+ maxItems: number;
1122
+ items: {
1123
+ $ref: string;
1124
+ };
1125
+ };
1126
+ honors: {
1127
+ type: string;
1128
+ maxItems: number;
1129
+ items: {
1130
+ $ref: string;
1131
+ };
1132
+ };
1133
+ education: {
1134
+ type: string;
1135
+ maxItems: number;
1136
+ items: {
1137
+ $ref: string;
1138
+ };
1139
+ };
1140
+ publications: {
1141
+ type: string;
1142
+ maxItems: number;
1143
+ items: {
1144
+ $ref: string;
1145
+ };
1146
+ };
1147
+ languages: {
1148
+ type: string;
1149
+ maxItems: number;
1150
+ items: {
1151
+ $ref: string;
1152
+ };
1153
+ };
1154
+ courses: {
1155
+ type: string;
1156
+ maxItems: number;
1157
+ items: {
1158
+ $ref: string;
1159
+ };
1160
+ };
1161
+ patents: {
1162
+ type: string;
1163
+ maxItems: number;
1164
+ items: {
1165
+ $ref: string;
1166
+ };
1167
+ };
1168
+ contact: {
1169
+ $ref: string;
1170
+ };
1171
+ settings: {
1172
+ $ref: string;
1173
+ };
1174
+ meta: {
1175
+ $ref: string;
1176
+ };
1177
+ };
1178
+ $defs: {
1179
+ LocaleTag: {
1180
+ type: string;
1181
+ minLength: number;
1182
+ maxLength: number;
1183
+ pattern: string;
1184
+ description: string;
1185
+ };
1186
+ Iso3166Alpha2: {
1187
+ type: string;
1188
+ pattern: string;
1189
+ description: string;
1190
+ };
1191
+ YearMonth: {
1192
+ type: string;
1193
+ pattern: string;
1194
+ description: string;
1195
+ };
1196
+ IsoDateTime: {
1197
+ type: string;
1198
+ format: string;
1199
+ description: string;
1200
+ };
1201
+ Url: {
1202
+ type: string;
1203
+ format: string;
1204
+ maxLength: number;
1205
+ };
1206
+ Email: {
1207
+ type: string;
1208
+ format: string;
1209
+ maxLength: number;
1210
+ };
1211
+ Slug: {
1212
+ type: string;
1213
+ minLength: number;
1214
+ maxLength: number;
1215
+ pattern: string;
1216
+ description: string;
1217
+ };
1218
+ LocalizedTitle: {
1219
+ type: string;
1220
+ minProperties: number;
1221
+ propertyNames: {
1222
+ type: string;
1223
+ pattern: string;
1224
+ };
1225
+ additionalProperties: {
1226
+ type: string;
1227
+ minLength: number;
1228
+ maxLength: number;
1229
+ };
1230
+ description: string;
1231
+ };
1232
+ LocalizedBody: {
1233
+ type: string;
1234
+ minProperties: number;
1235
+ propertyNames: {
1236
+ type: string;
1237
+ pattern: string;
1238
+ };
1239
+ additionalProperties: {
1240
+ type: string;
1241
+ minLength: number;
1242
+ maxLength: number;
1243
+ };
1244
+ description: string;
1245
+ };
1246
+ LinkType: {
1247
+ type: string;
1248
+ enum: string[];
1249
+ description: string;
1250
+ };
1251
+ Profile: {
1252
+ type: string;
1253
+ additionalProperties: boolean;
1254
+ required: string[];
1255
+ properties: {
1256
+ displayName: {
1257
+ $ref: string;
1258
+ };
1259
+ tagline: {
1260
+ $ref: string;
1261
+ };
1262
+ bio: {
1263
+ $ref: string;
1264
+ };
1265
+ avatar: {
1266
+ $ref: string;
1267
+ };
1268
+ location: {
1269
+ $ref: string;
1270
+ };
1271
+ };
1272
+ };
1273
+ Avatar: {
1274
+ type: string;
1275
+ additionalProperties: boolean;
1276
+ required: string[];
1277
+ properties: {
1278
+ url: {
1279
+ type: string;
1280
+ format: string;
1281
+ maxLength: number;
1282
+ description: string;
1283
+ };
1284
+ alt: {
1285
+ $ref: string;
1286
+ };
1287
+ };
1288
+ };
1289
+ Address: {
1290
+ type: string;
1291
+ additionalProperties: boolean;
1292
+ properties: {
1293
+ country: {
1294
+ $ref: string;
1295
+ };
1296
+ region: {
1297
+ type: string;
1298
+ maxLength: number;
1299
+ };
1300
+ locality: {
1301
+ $ref: string;
1302
+ };
1303
+ display: {
1304
+ $ref: string;
1305
+ };
1306
+ };
1307
+ };
1308
+ Link: {
1309
+ type: string;
1310
+ additionalProperties: boolean;
1311
+ required: string[];
1312
+ properties: {
1313
+ id: {
1314
+ $ref: string;
1315
+ };
1316
+ type: {
1317
+ $ref: string;
1318
+ };
1319
+ label: {
1320
+ $ref: string;
1321
+ };
1322
+ url: {
1323
+ $ref: string;
1324
+ };
1325
+ featured: {
1326
+ type: string;
1327
+ };
1328
+ order: {
1329
+ type: string;
1330
+ minimum: number;
1331
+ };
1332
+ iconUrl: {
1333
+ $ref: string;
1334
+ };
1335
+ };
1336
+ allOf: {
1337
+ if: {
1338
+ properties: {
1339
+ type: {
1340
+ const: string;
1341
+ };
1342
+ };
1343
+ required: string[];
1344
+ };
1345
+ then: {
1346
+ properties: {
1347
+ iconUrl: {
1348
+ $ref: string;
1349
+ };
1350
+ };
1351
+ required: string[];
1352
+ };
1353
+ }[];
1354
+ };
1355
+ Career: {
1356
+ type: string;
1357
+ additionalProperties: boolean;
1358
+ required: string[];
1359
+ properties: {
1360
+ id: {
1361
+ $ref: string;
1362
+ };
1363
+ organization: {
1364
+ $ref: string;
1365
+ };
1366
+ role: {
1367
+ $ref: string;
1368
+ };
1369
+ description: {
1370
+ $ref: string;
1371
+ };
1372
+ startDate: {
1373
+ $ref: string;
1374
+ };
1375
+ endDate: {
1376
+ anyOf: ({
1377
+ $ref: string;
1378
+ type?: undefined;
1379
+ } | {
1380
+ type: string;
1381
+ $ref?: undefined;
1382
+ })[];
1383
+ };
1384
+ isCurrent: {
1385
+ type: string;
1386
+ };
1387
+ url: {
1388
+ $ref: string;
1389
+ };
1390
+ location: {
1391
+ $ref: string;
1392
+ };
1393
+ order: {
1394
+ type: string;
1395
+ minimum: number;
1396
+ };
1397
+ };
1398
+ };
1399
+ Project: {
1400
+ type: string;
1401
+ additionalProperties: boolean;
1402
+ required: string[];
1403
+ properties: {
1404
+ id: {
1405
+ $ref: string;
1406
+ };
1407
+ title: {
1408
+ $ref: string;
1409
+ };
1410
+ description: {
1411
+ $ref: string;
1412
+ };
1413
+ url: {
1414
+ $ref: string;
1415
+ };
1416
+ tags: {
1417
+ type: string;
1418
+ maxItems: number;
1419
+ items: {
1420
+ type: string;
1421
+ minLength: number;
1422
+ maxLength: number;
1423
+ };
1424
+ };
1425
+ relatedCareerId: {
1426
+ $ref: string;
1427
+ };
1428
+ startDate: {
1429
+ $ref: string;
1430
+ };
1431
+ endDate: {
1432
+ anyOf: ({
1433
+ $ref: string;
1434
+ type?: undefined;
1435
+ } | {
1436
+ type: string;
1437
+ $ref?: undefined;
1438
+ })[];
1439
+ };
1440
+ highlighted: {
1441
+ type: string;
1442
+ };
1443
+ order: {
1444
+ type: string;
1445
+ minimum: number;
1446
+ };
1447
+ };
1448
+ };
1449
+ Skill: {
1450
+ type: string;
1451
+ additionalProperties: boolean;
1452
+ required: string[];
1453
+ properties: {
1454
+ id: {
1455
+ $ref: string;
1456
+ };
1457
+ label: {
1458
+ type: string;
1459
+ minLength: number;
1460
+ maxLength: number;
1461
+ };
1462
+ category: {
1463
+ type: string;
1464
+ minLength: number;
1465
+ maxLength: number;
1466
+ description: string;
1467
+ };
1468
+ order: {
1469
+ type: string;
1470
+ minimum: number;
1471
+ };
1472
+ };
1473
+ };
1474
+ Contact: {
1475
+ type: string;
1476
+ additionalProperties: boolean;
744
1477
  properties: {
745
- id: {
1478
+ email: {
746
1479
  $ref: string;
747
1480
  };
748
- type: {
1481
+ showEmail: {
1482
+ type: string;
1483
+ default: boolean;
1484
+ };
1485
+ formUrl: {
749
1486
  $ref: string;
750
1487
  };
751
- label: {
1488
+ };
1489
+ };
1490
+ Settings: {
1491
+ type: string;
1492
+ additionalProperties: boolean;
1493
+ required: string[];
1494
+ properties: {
1495
+ defaultLocale: {
752
1496
  $ref: string;
753
1497
  };
754
- url: {
1498
+ fallbackLocale: {
755
1499
  $ref: string;
756
1500
  };
757
- featured: {
1501
+ availableLocales: {
758
1502
  type: string;
1503
+ minItems: number;
1504
+ maxItems: number;
1505
+ uniqueItems: boolean;
1506
+ items: {
1507
+ $ref: string;
1508
+ };
759
1509
  };
760
- order: {
1510
+ theme: {
761
1511
  type: string;
762
- minimum: number;
1512
+ minLength: number;
1513
+ maxLength: number;
1514
+ description: string;
763
1515
  };
764
- iconUrl: {
1516
+ showPoweredBy: {
1517
+ type: string;
1518
+ default: boolean;
1519
+ description: string;
1520
+ };
1521
+ enableJsonLd: {
1522
+ type: string;
1523
+ default: boolean;
1524
+ description: string;
1525
+ };
1526
+ enableApi: {
1527
+ type: string;
1528
+ default: boolean;
1529
+ description: string;
1530
+ };
1531
+ enableAnalytics: {
1532
+ type: string;
1533
+ default: boolean;
1534
+ description: string;
1535
+ };
1536
+ };
1537
+ };
1538
+ Meta: {
1539
+ type: string;
1540
+ additionalProperties: boolean;
1541
+ required: string[];
1542
+ properties: {
1543
+ createdAt: {
1544
+ $ref: string;
1545
+ };
1546
+ updatedAt: {
1547
+ $ref: string;
1548
+ };
1549
+ generator: {
1550
+ type: string;
1551
+ minLength: number;
1552
+ maxLength: number;
1553
+ description: string;
1554
+ };
1555
+ contentLicense: {
1556
+ $ref: string;
1557
+ };
1558
+ privacy: {
765
1559
  $ref: string;
766
1560
  };
767
1561
  };
768
- allOf: {
769
- if: {
770
- properties: {
771
- type: {
772
- const: string;
773
- };
774
- };
775
- required: string[];
1562
+ };
1563
+ ContentLicense: {
1564
+ type: string;
1565
+ additionalProperties: boolean;
1566
+ required: string[];
1567
+ properties: {
1568
+ spdxId: {
1569
+ type: string;
1570
+ minLength: number;
1571
+ maxLength: number;
1572
+ description: string;
776
1573
  };
777
- then: {
1574
+ url: {
1575
+ $ref: string;
1576
+ };
1577
+ attribution: {
1578
+ type: string;
1579
+ additionalProperties: boolean;
778
1580
  properties: {
779
- iconUrl: {
1581
+ name: {
1582
+ type: string;
1583
+ minLength: number;
1584
+ maxLength: number;
1585
+ };
1586
+ url: {
780
1587
  $ref: string;
781
1588
  };
782
1589
  };
783
- required: string[];
784
1590
  };
785
- }[];
1591
+ rights: {
1592
+ type: string;
1593
+ minLength: number;
1594
+ maxLength: number;
1595
+ description: string;
1596
+ };
1597
+ };
786
1598
  };
787
- Career: {
1599
+ MetaPrivacy: {
1600
+ type: string;
1601
+ additionalProperties: boolean;
1602
+ description: string;
1603
+ properties: {
1604
+ hideCredentialIds: {
1605
+ type: string;
1606
+ default: boolean;
1607
+ description: string;
1608
+ };
1609
+ hideEducationGrades: {
1610
+ type: string;
1611
+ default: boolean;
1612
+ description: string;
1613
+ };
1614
+ };
1615
+ };
1616
+ Certification: {
1617
+ type: string;
1618
+ additionalProperties: boolean;
1619
+ required: string[];
1620
+ properties: {
1621
+ id: {
1622
+ $ref: string;
1623
+ };
1624
+ title: {
1625
+ $ref: string;
1626
+ };
1627
+ issuingOrganization: {
1628
+ $ref: string;
1629
+ };
1630
+ issueDate: {
1631
+ $ref: string;
1632
+ };
1633
+ expirationDate: {
1634
+ anyOf: ({
1635
+ $ref: string;
1636
+ type?: undefined;
1637
+ } | {
1638
+ type: string;
1639
+ $ref?: undefined;
1640
+ })[];
1641
+ description: string;
1642
+ };
1643
+ credentialId: {
1644
+ type: string;
1645
+ minLength: number;
1646
+ maxLength: number;
1647
+ description: string;
1648
+ };
1649
+ url: {
1650
+ $ref: string;
1651
+ };
1652
+ order: {
1653
+ type: string;
1654
+ minimum: number;
1655
+ };
1656
+ };
1657
+ };
1658
+ Membership: {
788
1659
  type: string;
789
1660
  additionalProperties: boolean;
790
1661
  required: string[];
@@ -812,6 +1683,7 @@ declare const schema: {
812
1683
  type: string;
813
1684
  $ref?: undefined;
814
1685
  })[];
1686
+ description: string;
815
1687
  };
816
1688
  isCurrent: {
817
1689
  type: string;
@@ -819,7 +1691,48 @@ declare const schema: {
819
1691
  url: {
820
1692
  $ref: string;
821
1693
  };
822
- location: {
1694
+ order: {
1695
+ type: string;
1696
+ minimum: number;
1697
+ };
1698
+ };
1699
+ };
1700
+ Volunteering: {
1701
+ type: string;
1702
+ additionalProperties: boolean;
1703
+ required: string[];
1704
+ properties: {
1705
+ id: {
1706
+ $ref: string;
1707
+ };
1708
+ organization: {
1709
+ $ref: string;
1710
+ };
1711
+ role: {
1712
+ $ref: string;
1713
+ };
1714
+ cause: {
1715
+ $ref: string;
1716
+ };
1717
+ description: {
1718
+ $ref: string;
1719
+ };
1720
+ startDate: {
1721
+ $ref: string;
1722
+ };
1723
+ endDate: {
1724
+ anyOf: ({
1725
+ $ref: string;
1726
+ type?: undefined;
1727
+ } | {
1728
+ type: string;
1729
+ $ref?: undefined;
1730
+ })[];
1731
+ };
1732
+ isCurrent: {
1733
+ type: string;
1734
+ };
1735
+ url: {
823
1736
  $ref: string;
824
1737
  };
825
1738
  order: {
@@ -828,7 +1741,7 @@ declare const schema: {
828
1741
  };
829
1742
  };
830
1743
  };
831
- Project: {
1744
+ Honor: {
832
1745
  type: string;
833
1746
  additionalProperties: boolean;
834
1747
  required: string[];
@@ -839,24 +1752,50 @@ declare const schema: {
839
1752
  title: {
840
1753
  $ref: string;
841
1754
  };
1755
+ issuer: {
1756
+ $ref: string;
1757
+ };
842
1758
  description: {
843
1759
  $ref: string;
844
1760
  };
1761
+ date: {
1762
+ $ref: string;
1763
+ };
845
1764
  url: {
846
1765
  $ref: string;
847
1766
  };
848
- tags: {
1767
+ order: {
849
1768
  type: string;
850
- maxItems: number;
851
- items: {
852
- type: string;
853
- minLength: number;
854
- maxLength: number;
855
- };
1769
+ minimum: number;
856
1770
  };
857
- relatedCareerId: {
1771
+ };
1772
+ };
1773
+ Education: {
1774
+ type: string;
1775
+ additionalProperties: boolean;
1776
+ required: string[];
1777
+ properties: {
1778
+ id: {
1779
+ $ref: string;
1780
+ };
1781
+ institution: {
1782
+ $ref: string;
1783
+ };
1784
+ degree: {
1785
+ $ref: string;
1786
+ };
1787
+ fieldOfStudy: {
1788
+ $ref: string;
1789
+ };
1790
+ description: {
858
1791
  $ref: string;
859
1792
  };
1793
+ grade: {
1794
+ type: string;
1795
+ minLength: number;
1796
+ maxLength: number;
1797
+ description: string;
1798
+ };
860
1799
  startDate: {
861
1800
  $ref: string;
862
1801
  };
@@ -868,17 +1807,21 @@ declare const schema: {
868
1807
  type: string;
869
1808
  $ref?: undefined;
870
1809
  })[];
1810
+ description: string;
871
1811
  };
872
- highlighted: {
1812
+ isCurrent: {
873
1813
  type: string;
874
1814
  };
1815
+ url: {
1816
+ $ref: string;
1817
+ };
875
1818
  order: {
876
1819
  type: string;
877
1820
  minimum: number;
878
1821
  };
879
1822
  };
880
1823
  };
881
- Skill: {
1824
+ Publication: {
882
1825
  type: string;
883
1826
  additionalProperties: boolean;
884
1827
  required: string[];
@@ -886,15 +1829,35 @@ declare const schema: {
886
1829
  id: {
887
1830
  $ref: string;
888
1831
  };
889
- label: {
1832
+ title: {
1833
+ $ref: string;
1834
+ };
1835
+ publisher: {
1836
+ $ref: string;
1837
+ };
1838
+ description: {
1839
+ $ref: string;
1840
+ };
1841
+ date: {
1842
+ $ref: string;
1843
+ };
1844
+ url: {
1845
+ $ref: string;
1846
+ };
1847
+ doi: {
890
1848
  type: string;
891
1849
  minLength: number;
892
1850
  maxLength: number;
1851
+ description: string;
893
1852
  };
894
- category: {
1853
+ coAuthors: {
895
1854
  type: string;
896
- minLength: number;
897
- maxLength: number;
1855
+ maxItems: number;
1856
+ items: {
1857
+ type: string;
1858
+ minLength: number;
1859
+ maxLength: number;
1860
+ };
898
1861
  description: string;
899
1862
  };
900
1863
  order: {
@@ -903,125 +1866,118 @@ declare const schema: {
903
1866
  };
904
1867
  };
905
1868
  };
906
- Contact: {
1869
+ Language: {
907
1870
  type: string;
908
1871
  additionalProperties: boolean;
1872
+ required: string[];
909
1873
  properties: {
910
- email: {
1874
+ id: {
911
1875
  $ref: string;
912
1876
  };
913
- showEmail: {
914
- type: string;
915
- default: boolean;
1877
+ language: {
1878
+ $ref: string;
916
1879
  };
917
- formUrl: {
1880
+ displayName: {
918
1881
  $ref: string;
919
1882
  };
1883
+ proficiency: {
1884
+ type: string;
1885
+ enum: string[];
1886
+ description: string;
1887
+ };
1888
+ order: {
1889
+ type: string;
1890
+ minimum: number;
1891
+ };
920
1892
  };
921
1893
  };
922
- Settings: {
1894
+ Course: {
923
1895
  type: string;
924
1896
  additionalProperties: boolean;
925
1897
  required: string[];
926
1898
  properties: {
927
- defaultLocale: {
1899
+ id: {
928
1900
  $ref: string;
929
1901
  };
930
- fallbackLocale: {
1902
+ title: {
931
1903
  $ref: string;
932
1904
  };
933
- availableLocales: {
934
- type: string;
935
- minItems: number;
936
- maxItems: number;
937
- uniqueItems: boolean;
938
- items: {
939
- $ref: string;
940
- };
1905
+ provider: {
1906
+ $ref: string;
941
1907
  };
942
- theme: {
1908
+ courseNumber: {
943
1909
  type: string;
944
1910
  minLength: number;
945
1911
  maxLength: number;
946
- description: string;
947
1912
  };
948
- showPoweredBy: {
949
- type: string;
950
- default: boolean;
951
- description: string;
1913
+ description: {
1914
+ $ref: string;
952
1915
  };
953
- enableJsonLd: {
954
- type: string;
955
- default: boolean;
956
- description: string;
1916
+ completionDate: {
1917
+ $ref: string;
957
1918
  };
958
- enableApi: {
959
- type: string;
960
- default: boolean;
1919
+ certificateUrl: {
1920
+ $ref: string;
1921
+ };
1922
+ relatedEducationId: {
1923
+ $ref: string;
961
1924
  description: string;
962
1925
  };
963
- enableAnalytics: {
1926
+ order: {
964
1927
  type: string;
965
- default: boolean;
966
- description: string;
1928
+ minimum: number;
967
1929
  };
968
1930
  };
969
1931
  };
970
- Meta: {
1932
+ Patent: {
971
1933
  type: string;
972
1934
  additionalProperties: boolean;
973
1935
  required: string[];
974
1936
  properties: {
975
- createdAt: {
1937
+ id: {
976
1938
  $ref: string;
977
1939
  };
978
- updatedAt: {
1940
+ title: {
979
1941
  $ref: string;
980
1942
  };
981
- generator: {
1943
+ patentNumber: {
982
1944
  type: string;
983
1945
  minLength: number;
984
1946
  maxLength: number;
985
- description: string;
986
- };
987
- contentLicense: {
988
- $ref: string;
989
1947
  };
990
- };
991
- };
992
- ContentLicense: {
993
- type: string;
994
- additionalProperties: boolean;
995
- required: string[];
996
- properties: {
997
- spdxId: {
1948
+ office: {
998
1949
  type: string;
999
- minLength: number;
1000
1950
  maxLength: number;
1001
1951
  description: string;
1002
1952
  };
1953
+ status: {
1954
+ type: string;
1955
+ enum: string[];
1956
+ };
1957
+ description: {
1958
+ $ref: string;
1959
+ };
1960
+ filingDate: {
1961
+ $ref: string;
1962
+ };
1963
+ grantDate: {
1964
+ $ref: string;
1965
+ };
1003
1966
  url: {
1004
1967
  $ref: string;
1005
1968
  };
1006
- attribution: {
1969
+ coInventors: {
1007
1970
  type: string;
1008
- additionalProperties: boolean;
1009
- properties: {
1010
- name: {
1011
- type: string;
1012
- minLength: number;
1013
- maxLength: number;
1014
- };
1015
- url: {
1016
- $ref: string;
1017
- };
1971
+ maxItems: number;
1972
+ items: {
1973
+ type: string;
1974
+ minLength: number;
1975
+ maxLength: number;
1018
1976
  };
1019
1977
  };
1020
- rights: {
1978
+ order: {
1021
1979
  type: string;
1022
- minLength: number;
1023
- maxLength: number;
1024
- description: string;
1980
+ minimum: number;
1025
1981
  };
1026
1982
  };
1027
1983
  };
@@ -1162,6 +2118,122 @@ interface Skill {
1162
2118
  category?: string;
1163
2119
  order?: number;
1164
2120
  }
2121
+ interface Certification {
2122
+ id: Slug;
2123
+ title: LocalizedTitle;
2124
+ issuingOrganization: LocalizedTitle;
2125
+ issueDate: YearMonth;
2126
+ /** `null` denotes an explicit "no expiration" (permanent credential). Omit when unknown. */
2127
+ expirationDate?: YearMonth | null;
2128
+ /**
2129
+ * License or certificate number. Public exposure is controlled by
2130
+ * {@link MetaPrivacy.hideCredentialIds} (default true).
2131
+ */
2132
+ credentialId?: string;
2133
+ url?: string;
2134
+ order?: number;
2135
+ }
2136
+ interface Membership {
2137
+ id: Slug;
2138
+ organization: LocalizedTitle;
2139
+ role?: LocalizedTitle;
2140
+ description?: LocalizedBody;
2141
+ startDate: YearMonth;
2142
+ /** `null` denotes ongoing membership; omit when unknown. */
2143
+ endDate?: YearMonth | null;
2144
+ isCurrent?: boolean;
2145
+ url?: string;
2146
+ order?: number;
2147
+ }
2148
+ interface Volunteering {
2149
+ id: Slug;
2150
+ organization: LocalizedTitle;
2151
+ role: LocalizedTitle;
2152
+ cause?: LocalizedTitle;
2153
+ description?: LocalizedBody;
2154
+ startDate: YearMonth;
2155
+ endDate?: YearMonth | null;
2156
+ isCurrent?: boolean;
2157
+ url?: string;
2158
+ order?: number;
2159
+ }
2160
+ interface Honor {
2161
+ id: Slug;
2162
+ title: LocalizedTitle;
2163
+ issuer: LocalizedTitle;
2164
+ description?: LocalizedBody;
2165
+ date: YearMonth;
2166
+ url?: string;
2167
+ order?: number;
2168
+ }
2169
+ interface Education {
2170
+ id: Slug;
2171
+ institution: LocalizedTitle;
2172
+ degree?: LocalizedTitle;
2173
+ fieldOfStudy?: LocalizedTitle;
2174
+ description?: LocalizedBody;
2175
+ /**
2176
+ * Free-form grade / class / GPA. Public exposure is controlled by
2177
+ * {@link MetaPrivacy.hideEducationGrades} (default true).
2178
+ */
2179
+ grade?: string;
2180
+ startDate: YearMonth;
2181
+ /** `null` denotes currently enrolled; omit when unknown. */
2182
+ endDate?: YearMonth | null;
2183
+ isCurrent?: boolean;
2184
+ url?: string;
2185
+ order?: number;
2186
+ }
2187
+ interface Publication {
2188
+ id: Slug;
2189
+ title: LocalizedTitle;
2190
+ publisher?: LocalizedTitle;
2191
+ description?: LocalizedBody;
2192
+ date: YearMonth;
2193
+ url?: string;
2194
+ /** DOI identifier portion (e.g. '10.1145/...'); full URL goes in `url`. */
2195
+ doi?: string;
2196
+ /** Co-author names in original script. Excludes the profile owner. */
2197
+ coAuthors?: string[];
2198
+ order?: number;
2199
+ }
2200
+ type LanguageProficiency = 'native' | 'fluent' | 'professional' | 'intermediate' | 'basic';
2201
+ interface Language {
2202
+ id: Slug;
2203
+ /** BCP-47 tag (e.g. 'ja', 'en', 'fr-CA'). */
2204
+ language: LocaleTag;
2205
+ /** Human-readable label per locale (e.g. `{ en: 'Japanese', fr: 'japonais' }`). */
2206
+ displayName?: LocalizedTitle;
2207
+ proficiency: LanguageProficiency;
2208
+ order?: number;
2209
+ }
2210
+ interface Course {
2211
+ id: Slug;
2212
+ title: LocalizedTitle;
2213
+ provider?: LocalizedTitle;
2214
+ courseNumber?: string;
2215
+ description?: LocalizedBody;
2216
+ completionDate?: YearMonth;
2217
+ certificateUrl?: string;
2218
+ /** Optional reference to an `education[].id` for university coursework. */
2219
+ relatedEducationId?: Slug;
2220
+ order?: number;
2221
+ }
2222
+ type PatentStatus = 'pending' | 'issued' | 'expired' | 'abandoned';
2223
+ interface Patent {
2224
+ id: Slug;
2225
+ title: LocalizedTitle;
2226
+ patentNumber: string;
2227
+ /** Patent office name (e.g. 'USPTO', 'JPO', 'EPO'). */
2228
+ office?: string;
2229
+ status: PatentStatus;
2230
+ description?: LocalizedBody;
2231
+ filingDate?: YearMonth;
2232
+ grantDate?: YearMonth;
2233
+ url?: string;
2234
+ coInventors?: string[];
2235
+ order?: number;
2236
+ }
1165
2237
  interface Contact {
1166
2238
  email?: string;
1167
2239
  showEmail?: boolean;
@@ -1193,14 +2265,35 @@ interface ContentLicense {
1193
2265
  attribution?: ContentLicenseAttribution;
1194
2266
  rights?: string;
1195
2267
  }
2268
+ /**
2269
+ * Privacy opt-out flags that strip personally identifying fields from public
2270
+ * API output (`GET /api/profile`, `/api/jsonld`, `/takuhon.json`). Admin
2271
+ * endpoints (`PUT /api/admin/*`, `GET /api/export`) ignore these flags.
2272
+ * Privacy-by-default: omitting the object or individual flags is equivalent
2273
+ * to `true`.
2274
+ */
2275
+ interface MetaPrivacy {
2276
+ /** When true (default), strip `certifications[*].credentialId` from public responses. */
2277
+ hideCredentialIds?: boolean;
2278
+ /** When true (default), strip `education[*].grade` from public responses. */
2279
+ hideEducationGrades?: boolean;
2280
+ }
1196
2281
  interface Meta {
1197
2282
  createdAt?: IsoDateTime;
1198
2283
  updatedAt?: IsoDateTime;
1199
2284
  /** Tool that produced this document (e.g. `'Takuhon'`, `'create-takuhon@0.1.0'`). */
1200
2285
  generator?: string;
1201
2286
  contentLicense: ContentLicense;
2287
+ privacy?: MetaPrivacy;
1202
2288
  }
1203
- /** A complete takuhon profile document. */
2289
+ /**
2290
+ * A complete takuhon profile document.
2291
+ *
2292
+ * Schema-level, the nine new arrays from 0.2.0 (`certifications` through
2293
+ * `patents`) are optional for 0.1.x back-compat. At the TypeScript layer they
2294
+ * are typed as required because `validate()` and `normalize()` defensively
2295
+ * coerce missing arrays to `[]` so downstream consumers never see `undefined`.
2296
+ */
1204
2297
  interface Takuhon {
1205
2298
  schemaVersion: string;
1206
2299
  profile: Profile;
@@ -1208,6 +2301,15 @@ interface Takuhon {
1208
2301
  careers: Career[];
1209
2302
  projects: Project[];
1210
2303
  skills: Skill[];
2304
+ certifications: Certification[];
2305
+ memberships: Membership[];
2306
+ volunteering: Volunteering[];
2307
+ honors: Honor[];
2308
+ education: Education[];
2309
+ publications: Publication[];
2310
+ languages: Language[];
2311
+ courses: Course[];
2312
+ patents: Patent[];
1211
2313
  contact: Contact;
1212
2314
  settings: Settings;
1213
2315
  meta: Meta;
@@ -1288,6 +2390,112 @@ interface LocalizedProject {
1288
2390
  highlighted?: boolean;
1289
2391
  order?: number;
1290
2392
  }
2393
+ /** Certification with localized fields collapsed to single strings. */
2394
+ interface LocalizedCertification {
2395
+ id: Slug;
2396
+ title: string;
2397
+ issuingOrganization: string;
2398
+ issueDate: YearMonth;
2399
+ expirationDate?: YearMonth | null;
2400
+ credentialId?: string;
2401
+ url?: string;
2402
+ order?: number;
2403
+ }
2404
+ /** Membership with localized fields collapsed to single strings. */
2405
+ interface LocalizedMembership {
2406
+ id: Slug;
2407
+ organization: string;
2408
+ role?: string;
2409
+ description?: string;
2410
+ startDate: YearMonth;
2411
+ endDate?: YearMonth | null;
2412
+ isCurrent?: boolean;
2413
+ url?: string;
2414
+ order?: number;
2415
+ }
2416
+ /** Volunteering with localized fields collapsed to single strings. */
2417
+ interface LocalizedVolunteering {
2418
+ id: Slug;
2419
+ organization: string;
2420
+ role: string;
2421
+ cause?: string;
2422
+ description?: string;
2423
+ startDate: YearMonth;
2424
+ endDate?: YearMonth | null;
2425
+ isCurrent?: boolean;
2426
+ url?: string;
2427
+ order?: number;
2428
+ }
2429
+ /** Honor with localized fields collapsed to single strings. */
2430
+ interface LocalizedHonor {
2431
+ id: Slug;
2432
+ title: string;
2433
+ issuer: string;
2434
+ description?: string;
2435
+ date: YearMonth;
2436
+ url?: string;
2437
+ order?: number;
2438
+ }
2439
+ /** Education with localized fields collapsed to single strings. */
2440
+ interface LocalizedEducation {
2441
+ id: Slug;
2442
+ institution: string;
2443
+ degree?: string;
2444
+ fieldOfStudy?: string;
2445
+ description?: string;
2446
+ grade?: string;
2447
+ startDate: YearMonth;
2448
+ endDate?: YearMonth | null;
2449
+ isCurrent?: boolean;
2450
+ url?: string;
2451
+ order?: number;
2452
+ }
2453
+ /** Publication with localized fields collapsed to single strings. */
2454
+ interface LocalizedPublication {
2455
+ id: Slug;
2456
+ title: string;
2457
+ publisher?: string;
2458
+ description?: string;
2459
+ date: YearMonth;
2460
+ url?: string;
2461
+ doi?: string;
2462
+ coAuthors?: string[];
2463
+ order?: number;
2464
+ }
2465
+ /** Language entry with `displayName` collapsed to a single string. */
2466
+ interface LocalizedLanguage {
2467
+ id: Slug;
2468
+ language: LocaleTag;
2469
+ displayName?: string;
2470
+ proficiency: LanguageProficiency;
2471
+ order?: number;
2472
+ }
2473
+ /** Course with localized fields collapsed to single strings. */
2474
+ interface LocalizedCourse {
2475
+ id: Slug;
2476
+ title: string;
2477
+ provider?: string;
2478
+ courseNumber?: string;
2479
+ description?: string;
2480
+ completionDate?: YearMonth;
2481
+ certificateUrl?: string;
2482
+ relatedEducationId?: Slug;
2483
+ order?: number;
2484
+ }
2485
+ /** Patent with localized fields collapsed to single strings. */
2486
+ interface LocalizedPatent {
2487
+ id: Slug;
2488
+ title: string;
2489
+ patentNumber: string;
2490
+ office?: string;
2491
+ status: PatentStatus;
2492
+ description?: string;
2493
+ filingDate?: YearMonth;
2494
+ grantDate?: YearMonth;
2495
+ url?: string;
2496
+ coInventors?: string[];
2497
+ order?: number;
2498
+ }
1291
2499
  /**
1292
2500
  * A takuhon document with every localized map flattened to a single string,
1293
2501
  * plus a `resolvedLocale` field recording which tag was actually used as the
@@ -1303,6 +2511,15 @@ interface LocalizedTakuhon {
1303
2511
  careers: LocalizedCareer[];
1304
2512
  projects: LocalizedProject[];
1305
2513
  skills: Skill[];
2514
+ certifications: LocalizedCertification[];
2515
+ memberships: LocalizedMembership[];
2516
+ volunteering: LocalizedVolunteering[];
2517
+ honors: LocalizedHonor[];
2518
+ education: LocalizedEducation[];
2519
+ publications: LocalizedPublication[];
2520
+ languages: LocalizedLanguage[];
2521
+ courses: LocalizedCourse[];
2522
+ patents: LocalizedPatent[];
1306
2523
  contact: Contact;
1307
2524
  settings: Settings;
1308
2525
  meta: Meta;
@@ -1344,7 +2561,7 @@ interface LocalizedTakuhon {
1344
2561
  * versions whose JSON Schema this package literally bundles, not the full
1345
2562
  * support window seen by end users.
1346
2563
  */
1347
- declare const SUPPORTED_SCHEMA_VERSIONS: readonly ["0.1.0"];
2564
+ declare const SUPPORTED_SCHEMA_VERSIONS: readonly ["0.1.0", "0.2.0"];
1348
2565
  /**
1349
2566
  * A single validation failure.
1350
2567
  *
@@ -1659,8 +2876,11 @@ interface Migration<From, To> {
1659
2876
  migrate(data: From): To;
1660
2877
  }
1661
2878
  /**
1662
- * Forward migrations bundled with this build of `@takuhon/core`. Empty in
1663
- * Phase 1; the first entry will land alongside the v0.2.0 schema bump.
2879
+ * Forward migrations bundled with this build of `@takuhon/core`.
2880
+ *
2881
+ * Entries are listed in the order they would chain for forward migration
2882
+ * (`0.1.0 → 0.2.0 → 0.3.0 → ...`). {@link migrateTakuhon} consults this
2883
+ * array to build the chain between a source `schemaVersion` and a target.
1664
2884
  */
1665
2885
  declare const migrations: readonly Migration<Takuhon, Takuhon>[];
1666
2886
 
@@ -1838,6 +3058,6 @@ declare class ConflictError extends StorageError {
1838
3058
  * A takuhon profile document's `schemaVersion` field must be migrate-compatible
1839
3059
  * with this version. See operational-lifecycle docs for the migration policy.
1840
3060
  */
1841
- declare const SCHEMA_VERSION = "0.1.0";
3061
+ declare const SCHEMA_VERSION = "0.2.0";
1842
3062
 
1843
- export { type Address, type AssetOptions, type AssetRecord, type Avatar, type Career, ConflictError, type Contact, type ContentLicense, type ContentLicenseAttribution, type ExportOptions, type ExportedTakuhon, ImportError, type Iso3166Alpha2, type IsoDateTime, type Link, type LinkBuiltin, type LinkCustom, type LinkType, type LocaleTag, type LocalizedAddress, type LocalizedAvatar, type LocalizedBody, type LocalizedCareer, type LocalizedLink, type LocalizedLinkBuiltin, type LocalizedLinkCustom, type LocalizedProfile, type LocalizedProject, type LocalizedTakuhon, type LocalizedTitle, type Meta, type Migration, MigrationError, type NormalizedTakuhon, NotFoundError, type Profile, type Project, SCHEMA_VERSION, SUPPORTED_SCHEMA_VERSIONS, type Schema, type Settings, type Skill, type Slug, StorageError, type Takuhon, type TakuhonAssetStorage, type TakuhonStorage, type ValidationError, type ValidationResult, type YearMonth, exportTakuhon, generateJsonLd, generatePersonJsonLd, generateProfilePageJsonLd, importTakuhon, migrateTakuhon, migrations, normalize, resolveLocale, schema, validate };
3063
+ export { type Address, type AssetOptions, type AssetRecord, type Avatar, type Career, type Certification, ConflictError, type Contact, type ContentLicense, type ContentLicenseAttribution, type Course, type Education, type ExportOptions, type ExportedTakuhon, type Honor, ImportError, type Iso3166Alpha2, type IsoDateTime, type Language, type LanguageProficiency, type Link, type LinkBuiltin, type LinkCustom, type LinkType, type LocaleTag, type LocalizedAddress, type LocalizedAvatar, type LocalizedBody, type LocalizedCareer, type LocalizedCertification, type LocalizedCourse, type LocalizedEducation, type LocalizedHonor, type LocalizedLanguage, type LocalizedLink, type LocalizedLinkBuiltin, type LocalizedLinkCustom, type LocalizedMembership, type LocalizedPatent, type LocalizedProfile, type LocalizedProject, type LocalizedPublication, type LocalizedTakuhon, type LocalizedTitle, type LocalizedVolunteering, type Membership, type Meta, type MetaPrivacy, type Migration, MigrationError, type NormalizedTakuhon, NotFoundError, type Patent, type PatentStatus, type Profile, type Project, type Publication, SCHEMA_VERSION, SUPPORTED_SCHEMA_VERSIONS, type Schema, type Settings, type Skill, type Slug, StorageError, type Takuhon, type TakuhonAssetStorage, type TakuhonStorage, type ValidationError, type ValidationResult, type Volunteering, type YearMonth, exportTakuhon, generateJsonLd, generatePersonJsonLd, generateProfilePageJsonLd, importTakuhon, migrateTakuhon, migrations, normalize, resolveLocale, schema, validate };