optolith-database-schema 0.20.5 → 0.20.6

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,13 @@
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.20.6](https://github.com/elyukai/optolith-database-schema/compare/v0.20.5...v0.20.6) (2025-11-16)
6
+
7
+
8
+ ### Features
9
+
10
+ * focus rules and optional rules can require other focus rules or optional rules to be active ([797825b](https://github.com/elyukai/optolith-database-schema/commit/797825b6da46517b1f7a9e2f00f34b21c8bae15d))
11
+
5
12
  ## [0.20.5](https://github.com/elyukai/optolith-database-schema/compare/v0.20.4...v0.20.5) (2025-11-15)
6
13
 
7
14
 
package/gen/types.d.ts CHANGED
@@ -5851,6 +5851,8 @@ export interface FocusRule {
5851
5851
  */
5852
5852
  isMissingImplementation: boolean
5853
5853
 
5854
+ prerequisites?: RulePrerequisites
5855
+
5854
5856
  /**
5855
5857
  * All translations for the entry, identified by IETF language tag (BCP47).
5856
5858
  */
@@ -5907,12 +5909,22 @@ export interface SubjectTranslation {
5907
5909
  name: string
5908
5910
  }
5909
5911
 
5912
+ export type RulePrerequisites = PlainPrerequisites<RulePrerequisiteGroup>
5913
+
5914
+ export type RulePrerequisiteGroup =
5915
+ | {
5916
+ kind: "Rule"
5917
+ Rule: RulePrerequisite
5918
+ }
5919
+
5910
5920
  export interface OptionalRule {
5911
5921
  /**
5912
5922
  * Has the optional rule not been implemented in Optolith yet? This is also true if the optional rule does not (currently) apply to any Optolith feature.
5913
5923
  */
5914
5924
  isMissingImplementation: boolean
5915
5925
 
5926
+ prerequisites?: RulePrerequisites
5927
+
5916
5928
  /**
5917
5929
  * All translations for the entry, identified by IETF language tag (BCP47).
5918
5930
  */
@@ -2,6 +2,30 @@
2
2
  * @title Prerequisites
3
3
  */
4
4
  import { Array, EnumCase, IncludeIdentifier, Integer, Object, String, TypeAlias, TypeArgument } from "tsondb/schema/def";
5
+ export declare const RulePrerequisites: TypeAlias<"RulePrerequisites", IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], TypeAlias<"PlainPrerequisites", Array<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").EnumDecl<"PrerequisitesElement", {
6
+ Single: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
7
+ Disjunction: EnumCase<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], TypeAlias<"PrerequisitesDisjunction", Object<{
8
+ list: import("tsondb/schema/def").MemberDecl<Array<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
9
+ display_option: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"DisplayOption", {
10
+ Hide: EnumCase<null>;
11
+ ReplaceWith: EnumCase<IncludeIdentifier<[], TypeAlias<"ReplacementDisplayOption", Object<{
12
+ sentence_type: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"SentenceType", {
13
+ Standalone: EnumCase<null>;
14
+ Connected: EnumCase<null>;
15
+ }, []>>, false>;
16
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"ReplacementDisplayOptionTranslation", {
17
+ replacement: import("tsondb/schema/def").MemberDecl<String, true>;
18
+ }>, true>;
19
+ }>, []>>>;
20
+ }, []>>, false>;
21
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
22
+ Group: EnumCase<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], TypeAlias<"PrerequisiteGroup", Object<{
23
+ list: import("tsondb/schema/def").MemberDecl<Array<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
24
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"PrerequisiteGroupTranslation", {
25
+ text: import("tsondb/schema/def").MemberDecl<String, true>;
26
+ }>, true>;
27
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
28
+ }, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, []>;
5
29
  export declare const DerivedCharacteristicPrerequisites: TypeAlias<"DerivedCharacteristicPrerequisites", IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], TypeAlias<"PlainPrerequisites", Array<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").EnumDecl<"PrerequisitesElement", {
6
30
  Single: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
7
31
  Disjunction: EnumCase<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], TypeAlias<"PrerequisitesDisjunction", Object<{
@@ -4,7 +4,7 @@
4
4
  import { Array, EnumCase, GenEnum, GenIncludeIdentifier, GenTypeAlias, IncludeIdentifier, Integer, Object, Optional, Param, Required, String, TypeAlias, TypeArgument, } from "tsondb/schema/def";
5
5
  import { NestedTranslationMap } from "./Locale.js";
6
6
  import { DisplayOption } from "./prerequisites/DisplayOption.js";
7
- import { AdvantageDisadvantagePrerequisiteGroup, AnimistPowerPrerequisiteGroup, ArcaneTraditionPrerequisiteGroup, DerivedCharacteristicPrerequisiteGroup, EnhancementPrerequisiteGroup, GeneralPrerequisiteGroup, GeodeRitualPrerequisiteGroup, InfluencePrerequisiteGroup, LanguagePrerequisiteGroup, LiturgyPrerequisiteGroup, PersonalityTraitPrerequisiteGroup, ProfessionPrerequisiteGroup, PublicationPrerequisiteGroup, SpellworkPrerequisiteGroup, } from "./prerequisites/PrerequisiteGroups.js";
7
+ import { AdvantageDisadvantagePrerequisiteGroup, AnimistPowerPrerequisiteGroup, ArcaneTraditionPrerequisiteGroup, DerivedCharacteristicPrerequisiteGroup, EnhancementPrerequisiteGroup, GeneralPrerequisiteGroup, GeodeRitualPrerequisiteGroup, InfluencePrerequisiteGroup, LanguagePrerequisiteGroup, LiturgyPrerequisiteGroup, PersonalityTraitPrerequisiteGroup, ProfessionPrerequisiteGroup, PublicationPrerequisiteGroup, RulePrerequisiteGroup, SpellworkPrerequisiteGroup, } from "./prerequisites/PrerequisiteGroups.js";
8
8
  const PrerequisiteGroup = GenTypeAlias(import.meta.url, {
9
9
  name: "PrerequisiteGroup",
10
10
  comment: "A prerequisite group has no influence on validation logic. It serves as a single unit for displaying purposes, where the source uses a prerequisites item that cannot be represented as a single prerequisite.",
@@ -71,6 +71,10 @@ const PrerequisitesForLevels = GenTypeAlias(import.meta.url, {
71
71
  minItems: 1,
72
72
  }),
73
73
  });
74
+ export const RulePrerequisites = TypeAlias(import.meta.url, {
75
+ name: "RulePrerequisites",
76
+ type: () => GenIncludeIdentifier(PlainPrerequisites, [IncludeIdentifier(RulePrerequisiteGroup)]),
77
+ });
74
78
  export const DerivedCharacteristicPrerequisites = TypeAlias(import.meta.url, {
75
79
  name: "DerivedCharacteristicPrerequisites",
76
80
  type: () => GenIncludeIdentifier(PlainPrerequisites, [
@@ -1,4 +1,24 @@
1
1
  import { Enum, EnumCase, IncludeIdentifier } from "tsondb/schema/def";
2
+ export declare const RulePrerequisiteGroup: Enum<"RulePrerequisiteGroup", {
3
+ Rule: EnumCase<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"RulePrerequisite", import("tsondb/schema/def").ObjectType<{
4
+ id: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"ExtensionRuleIdentifier", {
5
+ FocusRule: EnumCase<import("tsondb/schema/def").ReferenceIdentifierType>;
6
+ OptionalRule: EnumCase<import("tsondb/schema/def").ReferenceIdentifierType>;
7
+ }, []>>, true>;
8
+ display_option: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"DisplayOption", {
9
+ Hide: EnumCase<null>;
10
+ ReplaceWith: EnumCase<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"ReplacementDisplayOption", import("tsondb/schema/def").ObjectType<{
11
+ sentence_type: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"SentenceType", {
12
+ Standalone: EnumCase<null>;
13
+ Connected: EnumCase<null>;
14
+ }, []>>, false>;
15
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"ReplacementDisplayOptionTranslation", {
16
+ replacement: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").StringType, true>;
17
+ }>, true>;
18
+ }>, []>>>;
19
+ }, []>>, false>;
20
+ }>, []>>>;
21
+ }, []>;
2
22
  export declare const DerivedCharacteristicPrerequisiteGroup: Enum<"DerivedCharacteristicPrerequisiteGroup", {
3
23
  Rule: EnumCase<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"RulePrerequisite", import("tsondb/schema/def").ObjectType<{
4
24
  id: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"ExtensionRuleIdentifier", {
@@ -19,6 +19,12 @@ import { SocialStatusPrerequisite } from "./single/SocialStatusPrerequisite.js";
19
19
  import { StatePrerequisite } from "./single/StatePrerequisite.js";
20
20
  import { TextPrerequisite } from "./single/TextPrerequisite.js";
21
21
  import { BlessedTraditionPrerequisite, MagicalTraditionPrerequisite, } from "./single/TraditionPrerequisite.js";
22
+ export const RulePrerequisiteGroup = Enum(import.meta.url, {
23
+ name: "RulePrerequisiteGroup",
24
+ values: () => ({
25
+ Rule: EnumCase({ type: IncludeIdentifier(RulePrerequisite) }),
26
+ }),
27
+ });
22
28
  export const DerivedCharacteristicPrerequisiteGroup = Enum(import.meta.url, {
23
29
  name: "DerivedCharacteristicPrerequisiteGroup",
24
30
  values: () => ({
@@ -3,6 +3,30 @@ export declare const FocusRule: Entity<"FocusRule", {
3
3
  subject: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, false>;
4
4
  level: import("tsondb/schema/def").MemberDecl<Integer, true>;
5
5
  isMissingImplementation: import("tsondb/schema/def").MemberDecl<Boolean, true>;
6
+ prerequisites: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"RulePrerequisites", IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PlainPrerequisites", import("tsondb/schema/def").ArrayType<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").EnumDecl<"PrerequisitesElement", {
7
+ Single: import("tsondb/schema/def").EnumCaseDecl<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
8
+ Disjunction: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PrerequisitesDisjunction", Object<{
9
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
10
+ display_option: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"DisplayOption", {
11
+ Hide: import("tsondb/schema/def").EnumCaseDecl<null>;
12
+ ReplaceWith: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"ReplacementDisplayOption", Object<{
13
+ sentence_type: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"SentenceType", {
14
+ Standalone: import("tsondb/schema/def").EnumCaseDecl<null>;
15
+ Connected: import("tsondb/schema/def").EnumCaseDecl<null>;
16
+ }, []>>, false>;
17
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"ReplacementDisplayOptionTranslation", {
18
+ replacement: import("tsondb/schema/def").MemberDecl<String, true>;
19
+ }>, true>;
20
+ }>, []>>>;
21
+ }, []>>, false>;
22
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
23
+ Group: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PrerequisiteGroup", Object<{
24
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
25
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"PrerequisiteGroupTranslation", {
26
+ text: import("tsondb/schema/def").MemberDecl<String, true>;
27
+ }>, true>;
28
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
29
+ }, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, []>>, false>;
6
30
  src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"PublicationRefs", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"PublicationRef", Object<{
7
31
  id: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
8
32
  occurrences: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<string, {
@@ -1,5 +1,6 @@
1
1
  import { Boolean, Entity, IncludeIdentifier, Integer, Object, Optional, Required, String, } from "tsondb/schema/def";
2
2
  import { SubjectIdentifier } from "../_Identifier.js";
3
+ import { RulePrerequisites } from "../_Prerequisite.js";
3
4
  import { NestedTranslationMap } from "../Locale.js";
4
5
  import { Errata } from "../source/_Erratum.js";
5
6
  import { src } from "../source/_PublicationRef.js";
@@ -19,6 +20,9 @@ export const FocusRule = Entity(import.meta.url, {
19
20
  comment: "Has the focus rule not been implemented in Optolith yet? This is also true if the focus rule does not (currently) apply to any Optolith feature.",
20
21
  type: Boolean(),
21
22
  }),
23
+ prerequisites: Optional({
24
+ type: IncludeIdentifier(RulePrerequisites),
25
+ }),
22
26
  src,
23
27
  translations: NestedTranslationMap(Required, "FocusRule", Object({
24
28
  name: Required({
@@ -1,6 +1,30 @@
1
1
  import { Boolean, Entity, IncludeIdentifier, Object, String } from "tsondb/schema/def";
2
2
  export declare const OptionalRule: Entity<"OptionalRule", {
3
3
  isMissingImplementation: import("tsondb/schema/def").MemberDecl<Boolean, true>;
4
+ prerequisites: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"RulePrerequisites", IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PlainPrerequisites", import("tsondb/schema/def").ArrayType<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").EnumDecl<"PrerequisitesElement", {
5
+ Single: import("tsondb/schema/def").EnumCaseDecl<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
6
+ Disjunction: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PrerequisitesDisjunction", Object<{
7
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
8
+ display_option: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"DisplayOption", {
9
+ Hide: import("tsondb/schema/def").EnumCaseDecl<null>;
10
+ ReplaceWith: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"ReplacementDisplayOption", Object<{
11
+ sentence_type: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"SentenceType", {
12
+ Standalone: import("tsondb/schema/def").EnumCaseDecl<null>;
13
+ Connected: import("tsondb/schema/def").EnumCaseDecl<null>;
14
+ }, []>>, false>;
15
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"ReplacementDisplayOptionTranslation", {
16
+ replacement: import("tsondb/schema/def").MemberDecl<String, true>;
17
+ }>, true>;
18
+ }>, []>>>;
19
+ }, []>>, false>;
20
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
21
+ Group: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], import("tsondb/schema/def").TypeAliasDecl<"PrerequisiteGroup", Object<{
22
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").TypeArgumentType<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>, true>;
23
+ translations: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<"PrerequisiteGroupTranslation", {
24
+ text: import("tsondb/schema/def").MemberDecl<String, true>;
25
+ }>, true>;
26
+ }>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>;
27
+ }, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>>, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, []>>, false>;
4
28
  src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"PublicationRefs", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], import("tsondb/schema/def").TypeAliasDecl<"PublicationRef", Object<{
5
29
  id: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
6
30
  occurrences: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").NestedEntityMapType<string, {
@@ -1,4 +1,5 @@
1
1
  import { Boolean, Entity, IncludeIdentifier, Object, Optional, Required, String, } from "tsondb/schema/def";
2
+ import { RulePrerequisites } from "../_Prerequisite.js";
2
3
  import { NestedTranslationMap } from "../Locale.js";
3
4
  import { Errata } from "../source/_Erratum.js";
4
5
  import { src } from "../source/_PublicationRef.js";
@@ -10,6 +11,9 @@ export const OptionalRule = Entity(import.meta.url, {
10
11
  comment: "Has the optional rule not been implemented in Optolith yet? This is also true if the optional rule does not (currently) apply to any Optolith feature.",
11
12
  type: Boolean(),
12
13
  }),
14
+ prerequisites: Optional({
15
+ type: IncludeIdentifier(RulePrerequisites),
16
+ }),
13
17
  src,
14
18
  translations: NestedTranslationMap(Required, "OptionalRule", Object({
15
19
  name: Required({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "optolith-database-schema",
3
- "version": "0.20.5",
3
+ "version": "0.20.6",
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",