@optolith/database-schema 0.83.0 → 0.85.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/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [0.85.0](https://github.com/Optolith/database-schema/compare/v0.84.0...v0.85.0) (2026-10-07)
6
+
7
+ ### ⚠ BREAKING CHANGES
8
+
9
+ * missing mundane profession group translations
10
+
11
+ ### Bug Fixes
12
+
13
+ * missing mundane profession group translations ([7e60131](https://github.com/Optolith/database-schema/commit/7e60131bcd55d18db03803bcc9f1954d4efb5650))
14
+
15
+ ## [0.84.0](https://github.com/Optolith/database-schema/compare/v0.83.0...v0.84.0) (2026-10-07)
16
+
17
+ ### ⚠ BREAKING CHANGES
18
+
19
+ * include professions by mundane profession group
20
+
21
+ ### Features
22
+
23
+ * associate profession with magical tradition subgroup ([f0a2838](https://github.com/Optolith/database-schema/commit/f0a28389c00c5b522c43197f6d278e121e391692))
24
+ * include professions by mundane profession group ([a147553](https://github.com/Optolith/database-schema/commit/a147553a72f050b4905b7b640fb781161f7888bc))
25
+ * magical tradition subgroup child entity ([577fdb6](https://github.com/Optolith/database-schema/commit/577fdb6455e69cec086349209dc3e610a2d8d865))
26
+
5
27
  ## [0.83.0](https://github.com/Optolith/database-schema/compare/v0.82.0...v0.83.0) (2026-10-06)
6
28
 
7
29
  ### ⚠ BREAKING CHANGES
package/gen/types.d.ts CHANGED
@@ -117,6 +117,7 @@ export type EntityMap = {
117
117
  MagicalSign: MagicalSign
118
118
  MagicalSpecialAbility: MagicalSpecialAbility
119
119
  MagicalTradition: MagicalTradition
120
+ MagicalTraditionSubgroup: MagicalTraditionSubgroup
120
121
  MagicStyleSpecialAbility: MagicStyleSpecialAbility
121
122
  MetaCondition: MetaCondition
122
123
  MusicalInstrument: MusicalInstrument
@@ -204,6 +205,7 @@ export type ChildEntityMap = {
204
205
  LanguageSpecialization: [LanguageSpecialization, "parent", LanguageSpecialization["parent"]]
205
206
  LessonPackage: [LessonPackage, "curriculum", LessonPackage["curriculum"]]
206
207
  MagicalRuneOption: [MagicalRuneOption, "parent", MagicalRuneOption["parent"]]
208
+ MagicalTraditionSubgroup: [MagicalTraditionSubgroup, "parent", MagicalTraditionSubgroup["parent"]]
207
209
  NewSkillApplication: [NewSkillApplication, "parent", NewSkillApplication["parent"]]
208
210
  PactDomain: [PactDomain, "parent", PactDomain["parent"]]
209
211
  PactType: [PactType, "parent", PactType["parent"]]
@@ -2801,6 +2803,9 @@ export interface Locale {
2801
2803
  "for example, {$examples}": string & { __params: { "examples": string } }
2802
2804
  "all but {$excludedProfessions :list type=conjunction}": string & { __params: { "excludedProfessions": string[] } }
2803
2805
  "Mundane Professions": string
2806
+ "Profane Professions": string
2807
+ "Fighter Professions": string
2808
+ "Religious Professions": string
2804
2809
  "Magic Professions": string
2805
2810
  "Blessed Professions": string
2806
2811
  "rare": string
@@ -8685,7 +8690,7 @@ export interface MagicalTradition {
8685
8690
  use_arcane_spellworks_from_tradition?: MagicalTradition_ID
8686
8691
 
8687
8692
  /**
8688
- * The influences for the traditions. Influences are enabled by Focus Rules.
8693
+ * The influences for the tradition. Influences are enabled by Focus Rules.
8689
8694
  */
8690
8695
  influences?: Influence_ID[]
8691
8696
 
@@ -8903,6 +8908,11 @@ export interface MagicalProfessionGroup {
8903
8908
  * The curriculum/academy associated with this magical profession, if any.
8904
8909
  */
8905
8910
  curriculum?: Curriculum_ID
8911
+
8912
+ /**
8913
+ * The tradition’s subgroup associated with this magical profession, if any.
8914
+ */
8915
+ subgroup?: Curriculum_ID
8906
8916
  }
8907
8917
 
8908
8918
  /**
@@ -10028,6 +10038,10 @@ export type MundaneCommonProfessionConstraint =
10028
10038
  kind: "Profession"
10029
10039
  Profession: ProfessionConstraint
10030
10040
  }
10041
+ | {
10042
+ kind: "Group"
10043
+ Group: MundaneProfessionGroup
10044
+ }
10031
10045
 
10032
10046
  export interface ProfessionConstraint {
10033
10047
  /**
@@ -20964,6 +20978,32 @@ export interface InfluenceEffect {
20964
20978
  text: string
20965
20979
  }
20966
20980
 
20981
+ export interface MagicalTraditionSubgroup {
20982
+ /**
20983
+ * The magical tradition this subgroup belongs to.
20984
+ */
20985
+ parent: MagicalTradition_ID
20986
+
20987
+ /**
20988
+ * All translations for the entry, identified by IETF language tag (BCP47).
20989
+ */
20990
+ translations: {
20991
+ [localeId: string]: MagicalTraditionSubgroupTranslation
20992
+ }
20993
+ }
20994
+
20995
+ /**
20996
+ * The entity’s identifier. A UUID or a locale code if it is registered as the locale entity.
20997
+ */
20998
+ export type MagicalTraditionSubgroup_ID = string
20999
+
21000
+ export interface MagicalTraditionSubgroupTranslation {
21001
+ /**
21002
+ * The name of the ceremonial item. This should be the heading used in the respective publication.
21003
+ */
21004
+ name: string
21005
+ }
21006
+
20967
21007
  /**
20968
21008
  * Defines how to determine the AP cost of an enhancement.
20969
21009
  */
package/lib/main.js CHANGED
@@ -109,6 +109,7 @@ export const schema = new Schema([
109
109
  Types.MagicalSign,
110
110
  Types.MagicalSpecialAbility,
111
111
  Types.MagicalTradition,
112
+ Types.MagicalTraditionSubgroup,
112
113
  Types.MagicStyleSpecialAbility,
113
114
  Types.MetaCondition,
114
115
  Types.MusicalInstrument,
@@ -3,6 +3,7 @@ import { CommonnessRatedAdvantageDisadvantage } from "./_CommonnessRatedAdvantag
3
3
  import { AdvantageIdentifier, BlessedTraditionIdentifier, DisadvantageIdentifier, LanguageIdentifier, LanguageSpecializationIdentifier, MagicalTraditionIdentifier, ProfessionIdentifier, ProfessionVariantIdentifier, ScriptIdentifier, SkillIdentifier, SocialStatusIdentifier, } from "./_Identifier.js";
4
4
  import { BinarySex } from "./_Sex.js";
5
5
  import { NestedTranslationMap } from "./Locale.js";
6
+ import { MundaneProfessionGroup } from "./Profession.js";
6
7
  import { Errata } from "./source/_Erratum.js";
7
8
  import { src } from "./source/_PublicationRef.js";
8
9
  export const Culture = DB.Entity(import.meta.url, {
@@ -247,6 +248,7 @@ const MundaneCommonProfessionConstraint = DB.Enum(import.meta.url, {
247
248
  name: "MundaneCommonProfessionConstraint",
248
249
  values: () => ({
249
250
  Profession: DB.EnumCase({ type: DB.IncludeIdentifier(ProfessionConstraint) }),
251
+ Group: DB.EnumCase({ type: DB.IncludeIdentifier(MundaneProfessionGroup) }),
250
252
  }),
251
253
  });
252
254
  const MagicCommonProfessionConstraint = DB.Enum(import.meta.url, {
@@ -1662,6 +1662,9 @@ export declare const Locale: DB.Entity<"Locale", {
1662
1662
  "for example, {$examples}": null;
1663
1663
  "all but {$excludedProfessions :list type=conjunction}": null;
1664
1664
  "Mundane Professions": null;
1665
+ "Profane Professions": null;
1666
+ "Fighter Professions": null;
1667
+ "Religious Professions": null;
1665
1668
  "Magic Professions": null;
1666
1669
  "Blessed Professions": null;
1667
1670
  rare: null;
@@ -1714,6 +1714,9 @@ export const Locale = DB.Entity(import.meta.url, {
1714
1714
  "for example, {$examples}": null,
1715
1715
  "all but {$excludedProfessions :list type=conjunction}": null,
1716
1716
  "Mundane Professions": null,
1717
+ "Profane Professions": null,
1718
+ "Fighter Professions": null,
1719
+ "Religious Professions": null,
1717
1720
  "Magic Professions": null,
1718
1721
  "Blessed Professions": null,
1719
1722
  "rare": null,
@@ -8,6 +8,7 @@ export declare const Profession: DB.Entity<"Profession", {
8
8
  }, []>>>;
9
9
  Magical: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"MagicalProfessionGroup", DB.Object<{
10
10
  curriculum: DB.MemberDecl<DB.ReferenceIdentifier, false>;
11
+ subgroup: DB.MemberDecl<DB.ReferenceIdentifier, false>;
11
12
  }>, []>>>;
12
13
  Blessed: DB.EnumCase<null>;
13
14
  }, []>>, true>;
@@ -64,6 +64,10 @@ const MagicalProfessionGroup = DB.TypeAlias(import.meta.url, {
64
64
  comment: "The curriculum/academy associated with this magical profession, if any.",
65
65
  type: CurriculumIdentifier(),
66
66
  }),
67
+ subgroup: DB.Optional({
68
+ comment: "The tradition’s subgroup associated with this magical profession, if any.",
69
+ type: CurriculumIdentifier(),
70
+ }),
67
71
  }),
68
72
  });
69
73
  export const ProfessionVersion = DB.Entity(import.meta.url, {
@@ -110,6 +110,7 @@ export declare const MagicalRuneOptionIdentifier: () => R;
110
110
  export declare const MagicalSignIdentifier: () => R;
111
111
  export declare const MagicalSpecialAbilityIdentifier: () => R;
112
112
  export declare const MagicalTraditionIdentifier: () => R;
113
+ export declare const MagicalTraditionSubgroupIdentifier: () => R;
113
114
  export declare const MagicStyleSpecialAbilityIdentifier: () => R;
114
115
  export declare const MusicalInstrumentIdentifier: () => R;
115
116
  export declare const NewspaperIdentifier: () => R;
@@ -130,6 +130,7 @@ import { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpeci
130
130
  import { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
131
131
  import { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
132
132
  import { Language, LanguageSpecialization } from "./specialAbility/sub/Language.js";
133
+ import { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.js";
133
134
  import { Script } from "./specialAbility/sub/Script.js";
134
135
  import { TradeSecret } from "./specialAbility/sub/TradeSecret.js";
135
136
  import { VampiricGift } from "./specialAbility/VampiricGift.js";
@@ -276,6 +277,7 @@ export const MagicalRuneOptionIdentifier = () => R(MagicalRuneOption);
276
277
  export const MagicalSignIdentifier = () => R(MagicalSign);
277
278
  export const MagicalSpecialAbilityIdentifier = () => R(MagicalSpecialAbility);
278
279
  export const MagicalTraditionIdentifier = () => R(MagicalTradition);
280
+ export const MagicalTraditionSubgroupIdentifier = () => R(MagicalTraditionSubgroup);
279
281
  export const MagicStyleSpecialAbilityIdentifier = () => R(MagicStyleSpecialAbility);
280
282
  export const MusicalInstrumentIdentifier = () => R(MusicalInstrument);
281
283
  export const NewspaperIdentifier = () => R(Newspaper);
@@ -134,6 +134,7 @@ export { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpeci
134
134
  export { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
135
135
  export { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
136
136
  export { Language } from "./specialAbility/sub/Language.js";
137
+ export { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.ts";
137
138
  export { Script } from "./specialAbility/sub/Script.js";
138
139
  export { TradeSecret } from "./specialAbility/sub/TradeSecret.js";
139
140
  export { VampiricGift } from "./specialAbility/VampiricGift.js";
@@ -134,6 +134,7 @@ export { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpeci
134
134
  export { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
135
135
  export { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
136
136
  export { Language } from "./specialAbility/sub/Language.js";
137
+ export { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.js";
137
138
  export { Script } from "./specialAbility/sub/Script.js";
138
139
  export { TradeSecret } from "./specialAbility/sub/TradeSecret.js";
139
140
  export { VampiricGift } from "./specialAbility/VampiricGift.js";
@@ -1134,6 +1134,12 @@ export declare const MagicalTradition: DB.Entity<"MagicalTradition", {
1134
1134
  is_magical_dilettante: DB.MemberDecl<DB.Boolean, true>;
1135
1135
  use_arcane_spellworks_from_tradition: DB.MemberDecl<DB.ReferenceIdentifier, false>;
1136
1136
  influences: DB.MemberDecl<DB.Array<DB.ReferenceIdentifier>, false>;
1137
+ subgroups: DB.MemberDecl<DB.ChildEntities<DB.Entity<"MagicalTraditionSubgroup", {
1138
+ parent: DB.MemberDecl<DB.ReferenceIdentifier, true>;
1139
+ translations: DB.MemberDecl<DB.NestedEntityMap<"MagicalTraditionSubgroupTranslation", {
1140
+ name: DB.MemberDecl<DB.String, true>;
1141
+ }>, true>;
1142
+ }, "parent">>, true>;
1137
1143
  prerequisites: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"GeneralPrerequisites", DB.IncludeIdentifier<DB.Param<string, DB.Type>[], DB.TypeAlias<"PrerequisitesForLevels", DB.Array<DB.IncludeIdentifier<DB.Param<string, DB.Type>[], DB.TypeAlias<"PrerequisiteForLevel", DB.Object<{
1138
1144
  level: DB.MemberDecl<DB.Integer, true>;
1139
1145
  prerequisite: DB.MemberDecl<DB.IncludeIdentifier<DB.Param<string, DB.Type>[], DB.Enum<"PrerequisitesElement", {
@@ -10,6 +10,7 @@ import { NestedTranslationMap } from "../Locale.js";
10
10
  import { Errata } from "../source/_Erratum.js";
11
11
  import { src } from "../source/_PublicationRef.js";
12
12
  import { SpecialRule } from "./_Tradition.js";
13
+ import { MagicalTraditionSubgroup } from "./sub/MagicalTraditionSubgroup.js";
13
14
  export const MagicalTradition = DB.Entity(import.meta.url, {
14
15
  name: "MagicalTradition",
15
16
  namePlural: "MagicalTraditions",
@@ -61,9 +62,13 @@ export const MagicalTradition = DB.Entity(import.meta.url, {
61
62
  type: MagicalTraditionIdentifier(),
62
63
  }),
63
64
  influences: DB.Optional({
64
- comment: "The influences for the traditions. Influences are enabled by Focus Rules.",
65
+ comment: "The influences for the tradition. Influences are enabled by Focus Rules.",
65
66
  type: DB.Array(InfluenceIdentifier(), { minItems: 2 }),
66
67
  }),
68
+ subgroups: DB.Required({
69
+ comment: "The subgroups of this tradition.",
70
+ type: DB.ChildEntities(MagicalTraditionSubgroup),
71
+ }),
67
72
  prerequisites: DB.Optional({
68
73
  type: DB.IncludeIdentifier(GeneralPrerequisites),
69
74
  }),
@@ -0,0 +1,7 @@
1
+ import * as DB from "tsondb/schema/dsl";
2
+ export declare const MagicalTraditionSubgroup: DB.Entity<"MagicalTraditionSubgroup", {
3
+ parent: DB.MemberDecl<DB.ReferenceIdentifier, true>;
4
+ translations: DB.MemberDecl<DB.NestedEntityMap<"MagicalTraditionSubgroupTranslation", {
5
+ name: DB.MemberDecl<DB.String, true>;
6
+ }>, true>;
7
+ }, "parent">;
@@ -0,0 +1,27 @@
1
+ import * as DB from "tsondb/schema/dsl";
2
+ import { NestedTranslationMap } from "../../Locale.js";
3
+ import { MagicalTraditionIdentifier } from "../../_Identifier.js";
4
+ export const MagicalTraditionSubgroup = DB.Entity(import.meta.url, {
5
+ name: "MagicalTraditionSubgroup",
6
+ namePlural: "MagicalTraditionSubgroups",
7
+ type: () => DB.Object({
8
+ parent: DB.Required({
9
+ comment: "The magical tradition this subgroup belongs to.",
10
+ type: MagicalTraditionIdentifier(),
11
+ }),
12
+ translations: NestedTranslationMap(DB.Required, "MagicalTraditionSubgroup", DB.Object({
13
+ name: DB.Required({
14
+ comment: "The name of the ceremonial item. This should be the heading used in the respective publication.",
15
+ type: DB.String({ minLength: 1 }),
16
+ }),
17
+ })),
18
+ }),
19
+ parentReferenceKey: "parent",
20
+ instanceDisplayName: {},
21
+ uniqueConstraints: [
22
+ {
23
+ entityMapKeyPath: "translations",
24
+ keyPathInEntityMap: "name",
25
+ },
26
+ ],
27
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optolith/database-schema",
3
- "version": "0.83.0",
3
+ "version": "0.85.0",
4
4
  "description": "Definitions and utilities for the flat-file database of Optolith, a character creation tool for the Pen and Paper RPG “The Dark Eye 5”, and its external integrations into other software.",
5
5
  "keywords": [
6
6
  "tde",