@optolith/database-schema 0.89.0 → 0.91.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/gen/types.d.ts +435 -345
  3. package/lib/cache/activatableSelectOptions.js +21 -19
  4. package/lib/cache/ancestorBloodAdvantages.js +4 -1
  5. package/lib/cache/magicalAndBlessedAdvantagesAndDisadvantages.js +21 -22
  6. package/lib/cache/newApplicationsAndUses.js +4 -1
  7. package/lib/cache/tradeSecrets.js +1 -1
  8. package/lib/test.js +1 -0
  9. package/lib/types/AnimalDisease.js +1 -1
  10. package/lib/types/Attribute.js +1 -1
  11. package/lib/types/Culture.d.ts +8 -4
  12. package/lib/types/DerivedCharacteristic.js +3 -1
  13. package/lib/types/Disease.js +1 -1
  14. package/lib/types/Lessons.js +1 -1
  15. package/lib/types/Locale.js +1 -0
  16. package/lib/types/PatronCategory.js +1 -1
  17. package/lib/types/PersonalityTrait.js +1 -1
  18. package/lib/types/Profession.d.ts +16 -8
  19. package/lib/types/Race.d.ts +16 -8
  20. package/lib/types/TargetCategory.js +1 -1
  21. package/lib/types/_ActivatableNonMundane.js +1 -1
  22. package/lib/types/_ActivatableSelectOptionCategory.js +1 -1
  23. package/lib/types/_ActivatableSelectOptions.js +1 -1
  24. package/lib/types/_ActivatableSkill.d.ts +1 -1
  25. package/lib/types/_ActivatableSkill.js +1 -1
  26. package/lib/types/_ActivatableSkillApplicationsAndUses.js +1 -1
  27. package/lib/types/_ActivatableSkillCastingTime.js +2 -2
  28. package/lib/types/_ActivatableSkillDuration.js +2 -2
  29. package/lib/types/_ActivatableSkillTargetCategory.js +1 -1
  30. package/lib/types/_ArcaneTradition.js +1 -1
  31. package/lib/types/_CommonnessRatedAdvantageDisadvantage.d.ts +2 -1
  32. package/lib/types/_CommonnessRatedAdvantageDisadvantage.js +2 -2
  33. package/lib/types/_DiseasePoison.js +1 -1
  34. package/lib/types/_Enhancements.d.ts +1 -1
  35. package/lib/types/_Enhancements.js +1 -1
  36. package/lib/types/_IdentifierGroup.d.ts +23 -0
  37. package/lib/types/_IdentifierGroup.js +9 -1
  38. package/lib/types/_Prerequisite.d.ts +1 -1
  39. package/lib/types/_Prerequisite.js +1 -1
  40. package/lib/types/_ResponsiveText.js +2 -2
  41. package/lib/types/equipment/item/Elixir.d.ts +1 -1
  42. package/lib/types/equipment/item/Elixir.js +2 -2
  43. package/lib/types/equipment/item/HerbalAid.js +2 -2
  44. package/lib/types/equipment/item/HerbalPreservation.js +3 -3
  45. package/lib/types/equipment/item/Plant.js +2 -2
  46. package/lib/types/equipment/item/Poison.js +1 -1
  47. package/lib/types/equipment/item/_Item.js +1 -1
  48. package/lib/types/equipment/item/sub/BotanicRegion.js +1 -1
  49. package/lib/types/equipment/item/sub/SubBiome.js +1 -1
  50. package/lib/types/magicalActions/AnimistPower_Tribe.js +1 -1
  51. package/lib/types/magicalActions/MagicalDance.d.ts +2 -2
  52. package/lib/types/magicalActions/MagicalMelody.d.ts +2 -2
  53. package/lib/types/magicalActions/_MusicTradition.d.ts +2 -2
  54. package/lib/types/magicalActions/_MusicTradition.js +2 -2
  55. package/lib/types/prerequisites/PrerequisiteGroups.js +7 -9
  56. package/lib/types/prerequisites/single/AnySpecialAbilityOfGroupPrerequisite.js +4 -6
  57. package/lib/types/source/Publication.js +1 -1
  58. package/lib/types/specialAbility/sub/MagicalTraditionSubgroup.js +1 -1
  59. package/lib/types/traditionArtifacts/_shared.js +1 -1
  60. package/package.json +10 -12
@@ -46,13 +46,6 @@ const getSkillishPrerequisites = (ps, id) => {
46
46
  }
47
47
  });
48
48
  };
49
- const getSkillishBindingCost = (bindingCost, id) => {
50
- if (bindingCost === undefined) {
51
- return undefined;
52
- }
53
- return (bindingCost.Fixed.map.find(mapping => equalsSkillishIdGroup(mapping.id, id))?.bindingCost ??
54
- bindingCost.Fixed.default);
55
- };
56
49
  const equalsSkillishIdGroup = (a, b) => {
57
50
  switch (a.kind) {
58
51
  case "Skill":
@@ -73,6 +66,13 @@ const equalsSkillishIdGroup = (a, b) => {
73
66
  return assertExhaustive(a);
74
67
  }
75
68
  };
69
+ const getSkillishBindingCost = (bindingCost, id) => {
70
+ if (bindingCost === undefined) {
71
+ return undefined;
72
+ }
73
+ return (bindingCost.Fixed.map.find(mapping => equalsSkillishIdGroup(mapping.id, id))?.bindingCost ??
74
+ bindingCost.Fixed.default);
75
+ };
76
76
  const getApValueForSkillish = (config, id, ic) => {
77
77
  if (config === undefined) {
78
78
  return undefined;
@@ -103,7 +103,7 @@ const getApValueForSkillish = (config, id, ic) => {
103
103
  }
104
104
  };
105
105
  const convertSkillApplicationOrUse = (entryId, id, applicationOrUse) => ({
106
- id: fromUniformCase(entryId) + "+" + applicationOrUse.id,
106
+ id: `${fromUniformCase(entryId)}+${applicationOrUse.id.toFixed()}`,
107
107
  content: {
108
108
  parent: entryId,
109
109
  skills: [id],
@@ -223,13 +223,13 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
223
223
  const animalShapePaths = database.getAllInstanceContainersOfEntity("AnimalShapePath");
224
224
  const animalShapeSizes = database.getAllInstanceContainersOfEntity("AnimalShapeSize");
225
225
  const animalShapes = database.getAllInstanceContainersOfEntity("AnimalShape");
226
- const pathsWithOrderedIds = animalShapePaths.reduce((acc, { id }) => ({
227
- ...acc,
228
- [id]: animalShapes
226
+ const pathsWithOrderedIds = animalShapePaths.reduce((acc, { id }) => {
227
+ acc[id] = animalShapes
229
228
  .toSorted(on(item => database.getInstanceContainerOfEntityById("AnimalShapeSize", item.content.size)
230
229
  ?.content.volume, compareNullish(compareNumber)))
231
- .map(({ id }) => id),
232
- }), {});
230
+ .map(({ id: shapeId }) => shapeId);
231
+ return acc;
232
+ }, {});
233
233
  return animalShapes.map(({ id, content }) => {
234
234
  const path = animalShapePaths.find(({ id: pathId }) => pathId === content.path);
235
235
  const size = animalShapeSizes.find(({ id: sizeId }) => sizeId === content.size);
@@ -247,6 +247,7 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
247
247
  prerequisite: Case("Single", Case("Activatable", {
248
248
  id: entryId,
249
249
  active: false,
250
+ // oxlint-disable-next-line typescript/no-non-null-assertion
250
251
  options: [Case("AnimalShape", pathsWithOrderedIds[pathId][0])],
251
252
  })),
252
253
  }))
@@ -257,6 +258,7 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
257
258
  id: entryId,
258
259
  active: true,
259
260
  options: [
261
+ // oxlint-disable-next-line typescript/no-non-null-assertion
260
262
  Case("AnimalShape", pathsWithOrderedIds[path.id][pathIndex - 1]),
261
263
  ],
262
264
  })),
@@ -404,7 +406,7 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
404
406
  }));
405
407
  case "BlessedTraditions": {
406
408
  const getPrerequisites = (blessedTradition) => {
407
- if (selectOptionCategory.BlessedTraditions.require_principles &&
409
+ if (selectOptionCategory.BlessedTraditions.require_principles === true &&
408
410
  blessedTradition.associated_principles_id !== undefined) {
409
411
  const option = database.getInstanceContainerOfEntityById("GeneralSelectOption", blessedTradition.associated_principles_id);
410
412
  if (option === undefined || option.content.parent.kind === "TradeSecret") {
@@ -454,7 +456,7 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
454
456
  newApplications: [],
455
457
  uses: [],
456
458
  });
457
- const specific = selectOptionCategory.Elements.specific;
459
+ const { specific } = selectOptionCategory.Elements;
458
460
  if (specific) {
459
461
  return database
460
462
  .getAllInstanceContainersOfEntity("Element")
@@ -720,8 +722,8 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
720
722
  newApplications: [],
721
723
  uses: [],
722
724
  });
723
- const list = selectOptionCategory.TargetCategories.list;
724
- if (list) {
725
+ const { list } = selectOptionCategory.TargetCategories;
726
+ if (list.length > 0) {
725
727
  return database
726
728
  .getAllInstanceContainersOfEntity("TargetCategory")
727
729
  .filter(({ id }) => list.some(ref => ref.id === id))
@@ -737,8 +739,8 @@ const getDerivedSelectOptions = (selectOptionCategory, entryId, database) => {
737
739
  };
738
740
  const getExplicitSelectOptions = (id, database) => database
739
741
  .getAllChildInstanceContainersForParent("GeneralSelectOption", id)
740
- .map(({ id, content }) => ({
741
- id: Case("General", id),
742
+ .map(({ id: optionid, content }) => ({
743
+ id: Case("General", optionid),
742
744
  content: {
743
745
  ...content,
744
746
  ap_value: wrapPlainApValue(content.ap_value),
@@ -1,3 +1,4 @@
1
+ import { assertExhaustive } from "@elyukai/utils/typeSafety";
1
2
  export const buildAncestorBloodAdvantagesCache = database => database
2
3
  .getAllInstanceContainersOfEntity("Advantage")
3
4
  .filter(({ content }) => content.prerequisites?.some(p => {
@@ -8,6 +9,8 @@ export const buildAncestorBloodAdvantagesCache = database => database
8
9
  return p.prerequisite.Disjunction.list.some(d => d.kind === "NoOtherAncestorBloodAdvantage");
9
10
  case "Group":
10
11
  return p.prerequisite.Group.list.some(g => g.kind === "NoOtherAncestorBloodAdvantage");
12
+ default:
13
+ return assertExhaustive(p.prerequisite);
11
14
  }
12
- }))
15
+ }) ?? false)
13
16
  .map(({ id }) => id);
@@ -69,19 +69,18 @@ const is = (settings, type, entry, getById, traversedIds) => {
69
69
  return false;
70
70
  }
71
71
  const newTraversedIds = [...traversedIds, entry.id];
72
- return (entry.content.prerequisites !== undefined &&
73
- entry.content.prerequisites.some(prerequisite => {
74
- switch (prerequisite.prerequisite.kind) {
75
- case "Single":
76
- return isPrerequisiteFor(settings, type, prerequisite.prerequisite.Single, getById, newTraversedIds);
77
- case "Disjunction":
78
- return prerequisite.prerequisite.Disjunction.list.some(p => isPrerequisiteFor(settings, type, p, getById, newTraversedIds));
79
- case "Group":
80
- return prerequisite.prerequisite.Group.list.some(p => isPrerequisiteFor(settings, type, p, getById, newTraversedIds));
81
- default:
82
- return assertExhaustive(prerequisite.prerequisite);
83
- }
84
- }));
72
+ return entry.content.prerequisites.some(prerequisite => {
73
+ switch (prerequisite.prerequisite.kind) {
74
+ case "Single":
75
+ return isPrerequisiteFor(settings, type, prerequisite.prerequisite.Single, getById, newTraversedIds);
76
+ case "Disjunction":
77
+ return prerequisite.prerequisite.Disjunction.list.some(p => isPrerequisiteFor(settings, type, p, getById, newTraversedIds));
78
+ case "Group":
79
+ return prerequisite.prerequisite.Group.list.some(p => isPrerequisiteFor(settings, type, p, getById, newTraversedIds));
80
+ default:
81
+ return assertExhaustive(prerequisite.prerequisite);
82
+ }
83
+ });
85
84
  };
86
85
  const entityKeyMap = {
87
86
  Advantage: null,
@@ -95,12 +94,12 @@ const collectIds = (entity, type, database, settings) => database
95
94
  .getAllInstanceContainersOfEntity(entity)
96
95
  .filter(entry => is(settings, type, entry, database.getInstanceContainerOfEntityById.bind(database), []))
97
96
  .map(({ id }) => id);
98
- export const buildMagicalAndBlessedAdvantagesAndDisadvantagesCache = (database, settings) => {
99
- return Object.fromEntries(Object.keys(entityKeyMap).map((entity) => [
100
- entity,
101
- Object.fromEntries(Object.keys(typeKeyMap).map((type) => [
102
- type,
103
- collectIds(entity, type, database, settings),
104
- ])),
105
- ]));
106
- };
97
+ export const buildMagicalAndBlessedAdvantagesAndDisadvantagesCache = (database, settings) => Object.fromEntries(Object.keys(entityKeyMap).map((entity) => [
98
+ entity,
99
+ Object.fromEntries(Object.keys(typeKeyMap).map(
100
+ // oxlint-disable-next-line typescript/no-duplicate-type-constituents
101
+ (type) => [
102
+ type,
103
+ collectIds(entity, type, database, settings),
104
+ ])),
105
+ ]));
@@ -1,4 +1,7 @@
1
- const groupByAffectedSkill = (entries, prev = {}) => entries.reduce((acc, entry) => entry.content.skills.reduce((acc1, skillId) => ({ ...acc1, [skillId]: [...(acc1[skillId] ?? []), entry] }), acc), prev);
1
+ const groupByAffectedSkill = (entries, prev = {}) => entries.reduce((acc, entry) => entry.content.skills.reduce((acc1, skillId) => {
2
+ acc1[skillId] = [...(acc1[skillId] ?? []), entry];
3
+ return acc1;
4
+ }, acc), prev);
2
5
  const addGeneratedEntries = (generatedSelectOptions, prev) => Object.values(generatedSelectOptions).reduce((acc, byInstance) => Object.values(byInstance).reduce((acc1, resolvedSelectOptions) => resolvedSelectOptions.reduce((acc2, selectOption) => ({
3
6
  newApplications: groupByAffectedSkill(selectOption.newApplications, acc2.newApplications),
4
7
  uses: groupByAffectedSkill(selectOption.uses, acc2.uses),
@@ -113,7 +113,7 @@ export const buildDerivedTradeSecretsCache = (database, settings) => {
113
113
  if (container.content.source_type.kind === "AlchemicalPoison") {
114
114
  addTradeSecretToHerbaryCache(entity, container, container.content.source_type.AlchemicalPoison.trade_secret);
115
115
  }
116
- else if (container.content.source_type.kind == "AnimalVenom" &&
116
+ else if (container.content.source_type.kind === "AnimalVenom" &&
117
117
  container.content.source_type.AnimalVenom.complexity?.kind === "Complex") {
118
118
  addTradeSecretToHerbaryCache(entity, container, container.content.source_type.AnimalVenom.complexity.Complex);
119
119
  }
package/lib/test.js CHANGED
@@ -1,3 +1,4 @@
1
+ // oxlint-disable no-undef
1
2
  import { stderr } from "node:process";
2
3
  import { styleText } from "node:util";
3
4
  // importing the main file will run the schema checks
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { cause, Cause, DiseaseTranslation, level, resistance } from "./_DiseasePoison.js";
4
3
  import { AnimalTypeIdentifier } from "./_Identifier.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  import { src } from "./source/_PublicationRef.js";
6
6
  export const AnimalDisease = DB.Entity(import.meta.url, {
7
7
  name: "AnimalDisease",
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { AttributeColor } from "./_Color.js";
3
+ import { NestedTranslationMap } from "./Locale.js";
4
4
  export const Attribute = DB.Entity(import.meta.url, {
5
5
  name: "Attribute",
6
6
  namePlural: "Attributes",
@@ -54,7 +54,8 @@ export declare const Culture: DB.Entity<"Culture", {
54
54
  max: DB.MemberDecl<DB.Integer, true>;
55
55
  }>>;
56
56
  }, []>>, false>;
57
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
57
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
58
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
58
59
  General: DB.EnumCase<DB.ReferenceIdentifier>;
59
60
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
60
61
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -91,7 +92,8 @@ export declare const Culture: DB.Entity<"Culture", {
91
92
  max: DB.MemberDecl<DB.Integer, true>;
92
93
  }>>;
93
94
  }, []>>, false>;
94
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
95
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
96
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
95
97
  General: DB.EnumCase<DB.ReferenceIdentifier>;
96
98
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
97
99
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -128,7 +130,8 @@ export declare const Culture: DB.Entity<"Culture", {
128
130
  max: DB.MemberDecl<DB.Integer, true>;
129
131
  }>>;
130
132
  }, []>>, false>;
131
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
133
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
134
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
132
135
  General: DB.EnumCase<DB.ReferenceIdentifier>;
133
136
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
134
137
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -165,7 +168,8 @@ export declare const Culture: DB.Entity<"Culture", {
165
168
  max: DB.MemberDecl<DB.Integer, true>;
166
169
  }>>;
167
170
  }, []>>, false>;
168
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
171
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
172
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
169
173
  General: DB.EnumCase<DB.ReferenceIdentifier>;
170
174
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
171
175
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1,11 +1,11 @@
1
1
  import { assertExhaustive } from "@elyukai/utils/typeSafety";
2
2
  import * as DB from "tsondb/schema/dsl";
3
3
  import { fromUniformCase } from "tsondb/schema/gen";
4
- import { NestedTranslationMap } from "./Locale.js";
5
4
  import { AttributeIdentifier } from "./_Identifier.js";
6
5
  import { ImprovementCost } from "./_ImprovementCost.js";
7
6
  import { MathOperation } from "./_MathExpression.js";
8
7
  import { DerivedCharacteristicPrerequisites } from "./_Prerequisite.js";
8
+ import { NestedTranslationMap } from "./Locale.js";
9
9
  import { DerivedCharacteristicModifierPrerequisiteGroup } from "./prerequisites/PrerequisiteGroups.js";
10
10
  import { src } from "./source/_PublicationRef.js";
11
11
  export const DerivedCharacteristic = DB.Entity(import.meta.url, {
@@ -155,6 +155,8 @@ export const calculationContainsRaceBase = (base) => {
155
155
  const [left, right] = fromUniformCase(base);
156
156
  return calculationContainsRaceBase(left) || calculationContainsRaceBase(right);
157
157
  }
158
+ default:
159
+ return assertExhaustive(base);
158
160
  }
159
161
  };
160
162
  const DerivedCharacteristicModifierOperation = DB.Enum(import.meta.url, {
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { cause, DiseaseTranslation, level, resistance } from "./_DiseasePoison.js";
4
3
  import { RecipeTradeSecret } from "./equipment/item/_Herbary.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  import { src } from "./source/_PublicationRef.js";
6
6
  export const Disease = DB.Entity(import.meta.url, {
7
7
  name: "Disease",
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { CurriculumIdentifier, ElementIdentifier, GuidelineIdentifier, MagicalTraditionIdentifier, PropertyIdentifier, SkillIdentifier, } from "./_Identifier.js";
4
3
  import { CombatTechniqueIdentifier, SpellworkIdentifier } from "./_IdentifierGroup.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  import { Errata } from "./source/_Erratum.js";
6
6
  import { src } from "./source/_PublicationRef.js";
7
7
  export const Guideline = DB.Entity(import.meta.url, {
@@ -21,6 +21,7 @@ export const Locale = DB.Entity(import.meta.url, {
21
21
  type: DB.IncludeIdentifier(LocaleMeasurementAdjustments),
22
22
  }),
23
23
  translations: DB.Optional({
24
+ // oxlint-disable-next-line no-warning-comments
24
25
  // TODO: Make Required again once translations are added for all locales
25
26
  comment: "The translations strings for the locale.",
26
27
  // prettier-ignore
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { CultureIdentifier } from "./_Identifier.js";
3
+ import { NestedTranslationMap } from "./Locale.js";
4
4
  export const PatronCategory = DB.Entity(import.meta.url, {
5
5
  name: "PatronCategory",
6
6
  namePlural: "PatronCategories",
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { PersonalityTraitIdentifier } from "./_Identifier.js";
4
3
  import { PersonalityTraitPrerequisites } from "./_Prerequisite.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  import { Errata } from "./source/_Erratum.js";
6
6
  import { src } from "./source/_PublicationRef.js";
7
7
  export const PersonalityTrait = DB.Entity(import.meta.url, {
@@ -675,7 +675,8 @@ export declare const Profession: DB.Entity<"Profession", {
675
675
  max: DB.MemberDecl<DB.Integer, true>;
676
676
  }>>;
677
677
  }, []>>, false>;
678
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
678
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
679
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
679
680
  General: DB.EnumCase<DB.ReferenceIdentifier>;
680
681
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
681
682
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -712,7 +713,8 @@ export declare const Profession: DB.Entity<"Profession", {
712
713
  max: DB.MemberDecl<DB.Integer, true>;
713
714
  }>>;
714
715
  }, []>>, false>;
715
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
716
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
717
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
716
718
  General: DB.EnumCase<DB.ReferenceIdentifier>;
717
719
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
718
720
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -749,7 +751,8 @@ export declare const Profession: DB.Entity<"Profession", {
749
751
  max: DB.MemberDecl<DB.Integer, true>;
750
752
  }>>;
751
753
  }, []>>, false>;
752
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
754
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
755
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
753
756
  General: DB.EnumCase<DB.ReferenceIdentifier>;
754
757
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
755
758
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -786,7 +789,8 @@ export declare const Profession: DB.Entity<"Profession", {
786
789
  max: DB.MemberDecl<DB.Integer, true>;
787
790
  }>>;
788
791
  }, []>>, false>;
789
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
792
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
793
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
790
794
  General: DB.EnumCase<DB.ReferenceIdentifier>;
791
795
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
792
796
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1542,7 +1546,8 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
1542
1546
  max: DB.MemberDecl<DB.Integer, true>;
1543
1547
  }>>;
1544
1548
  }, []>>, false>;
1545
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1549
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
1550
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
1546
1551
  General: DB.EnumCase<DB.ReferenceIdentifier>;
1547
1552
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
1548
1553
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1579,7 +1584,8 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
1579
1584
  max: DB.MemberDecl<DB.Integer, true>;
1580
1585
  }>>;
1581
1586
  }, []>>, false>;
1582
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1587
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
1588
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
1583
1589
  General: DB.EnumCase<DB.ReferenceIdentifier>;
1584
1590
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
1585
1591
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1616,7 +1622,8 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
1616
1622
  max: DB.MemberDecl<DB.Integer, true>;
1617
1623
  }>>;
1618
1624
  }, []>>, false>;
1619
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1625
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
1626
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
1620
1627
  General: DB.EnumCase<DB.ReferenceIdentifier>;
1621
1628
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
1622
1629
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1653,7 +1660,8 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
1653
1660
  max: DB.MemberDecl<DB.Integer, true>;
1654
1661
  }>>;
1655
1662
  }, []>>, false>;
1656
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1663
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
1664
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
1657
1665
  General: DB.EnumCase<DB.ReferenceIdentifier>;
1658
1666
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
1659
1667
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -150,7 +150,8 @@ export declare const Race: DB.Entity<"Race", {
150
150
  max: DB.MemberDecl<DB.Integer, true>;
151
151
  }>>;
152
152
  }, []>>, false>;
153
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
153
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
154
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
154
155
  General: DB.EnumCase<DB.ReferenceIdentifier>;
155
156
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
156
157
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -187,7 +188,8 @@ export declare const Race: DB.Entity<"Race", {
187
188
  max: DB.MemberDecl<DB.Integer, true>;
188
189
  }>>;
189
190
  }, []>>, false>;
190
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
191
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
192
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
191
193
  General: DB.EnumCase<DB.ReferenceIdentifier>;
192
194
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
193
195
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -224,7 +226,8 @@ export declare const Race: DB.Entity<"Race", {
224
226
  max: DB.MemberDecl<DB.Integer, true>;
225
227
  }>>;
226
228
  }, []>>, false>;
227
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
229
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
230
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
228
231
  General: DB.EnumCase<DB.ReferenceIdentifier>;
229
232
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
230
233
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -261,7 +264,8 @@ export declare const Race: DB.Entity<"Race", {
261
264
  max: DB.MemberDecl<DB.Integer, true>;
262
265
  }>>;
263
266
  }, []>>, false>;
264
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
267
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
268
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
265
269
  General: DB.EnumCase<DB.ReferenceIdentifier>;
266
270
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
267
271
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -488,7 +492,8 @@ export declare const RaceVariant: DB.Entity<"RaceVariant", {
488
492
  max: DB.MemberDecl<DB.Integer, true>;
489
493
  }>>;
490
494
  }, []>>, false>;
491
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
495
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
496
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
492
497
  General: DB.EnumCase<DB.ReferenceIdentifier>;
493
498
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
494
499
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -525,7 +530,8 @@ export declare const RaceVariant: DB.Entity<"RaceVariant", {
525
530
  max: DB.MemberDecl<DB.Integer, true>;
526
531
  }>>;
527
532
  }, []>>, false>;
528
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
533
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
534
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
529
535
  General: DB.EnumCase<DB.ReferenceIdentifier>;
530
536
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
531
537
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -562,7 +568,8 @@ export declare const RaceVariant: DB.Entity<"RaceVariant", {
562
568
  max: DB.MemberDecl<DB.Integer, true>;
563
569
  }>>;
564
570
  }, []>>, false>;
565
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
571
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
572
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
566
573
  General: DB.EnumCase<DB.ReferenceIdentifier>;
567
574
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
568
575
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -599,7 +606,8 @@ export declare const RaceVariant: DB.Entity<"RaceVariant", {
599
606
  max: DB.MemberDecl<DB.Integer, true>;
600
607
  }>>;
601
608
  }, []>>, false>;
602
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
609
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"CommonnessSelectOptionIdentifier", {
610
+ SkillGroup: DB.EnumCase<DB.ReferenceIdentifier>;
603
611
  General: DB.EnumCase<DB.ReferenceIdentifier>;
604
612
  Race: DB.EnumCase<DB.ReferenceIdentifier>;
605
613
  Skill: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { TargetCategoryIdentifier } from "./_Identifier.js";
3
+ import { NestedTranslationMap } from "./Locale.js";
4
4
  export const TargetCategory = DB.Entity(import.meta.url, {
5
5
  name: "TargetCategory",
6
6
  namePlural: "TargetCategories",
@@ -1,11 +1,11 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { StandaloneCostMap } from "./_ActivatableSkillCost.js";
4
3
  import { DurationUnitValue } from "./_ActivatableSkillDuration.js";
5
4
  import { ParameterMap } from "./_ActivatableSkillParameterMap.js";
6
5
  import { AspectIdentifier, PropertyIdentifier } from "./_Identifier.js";
7
6
  import { VolumePointsOptionReferenceIdentifier } from "./_IdentifierGroup.js";
8
7
  import { ResponsiveText, ResponsiveTextOptional } from "./_ResponsiveText.js";
8
+ import { NestedTranslationMap } from "./Locale.js";
9
9
  const EnchantmentCost = DB.Enum(import.meta.url, {
10
10
  name: "EnchantmentCost",
11
11
  values: () => ({
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { CeremonyIdentifier, CloseCombatTechniqueIdentifier, ElementIdentifier, LiturgicalChantIdentifier, PropertyIdentifier, RangedCombatTechniqueIdentifier, RitualIdentifier, SkillGroupIdentifier, SkillIdentifier, SpellIdentifier, TargetCategoryIdentifier, } from "./_Identifier.js";
4
3
  import { ActivatableIdentifier, CombatTechniqueIdentifier, SkillishIdentifier, } from "./_IdentifierGroup.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  export const SelectOptionCategory = DB.Enum(import.meta.url, {
6
6
  name: "SelectOptionCategory",
7
7
  values: () => ({
@@ -1,11 +1,11 @@
1
1
  import { isEmpty, isNotEmpty } from "@elyukai/utils/array/nonEmpty";
2
2
  import * as DB from "tsondb/schema/dsl";
3
3
  import { Case, fromUniformCase, } from "tsondb/schema/gen";
4
- import { NestedTranslationMap } from "./Locale.js";
5
4
  import { SelectOptionCategory } from "./_ActivatableSelectOptionCategory.js";
6
5
  import { NewSkillApplication, SkillUse } from "./_ActivatableSkillApplicationsAndUses.js";
7
6
  import { SelectOptionParentIdentifier } from "./_IdentifierGroup.js";
8
7
  import { GeneralPrerequisites } from "./_Prerequisite.js";
8
+ import { NestedTranslationMap } from "./Locale.js";
9
9
  import { Errata } from "./source/_Erratum.js";
10
10
  import { optionalSrc } from "./source/_PublicationRef.js";
11
11
  const SelectOptions = DB.TypeAlias(import.meta.url, {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @title Activatable Skill
2
+ * @module Activatable Skill
3
3
  */
4
4
  import * as DB from "tsondb/schema/dsl";
5
5
  import { MathOperation } from "./_MathExpression.ts";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @title Activatable Skill
2
+ * @module Activatable Skill
3
3
  */
4
4
  import * as DB from "tsondb/schema/dsl";
5
5
  import { FastCastingTime, SlowCastingTime } from "./_ActivatableSkillCastingTime.js";
@@ -1,7 +1,7 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { SkillIdentifier } from "./_Identifier.js";
4
3
  import { NewSkillApplicationOrUseParentIdentifier } from "./_IdentifierGroup.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
5
  export const NewSkillApplication = DB.Entity(import.meta.url, {
6
6
  name: "NewSkillApplication",
7
7
  namePlural: "NewSkillApplications",
@@ -1,8 +1,8 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
- import { SlowSkillCastingTimeUnit } from "./SkillModificationLevel.js";
4
2
  import { SkillModificationLevelIdentifier } from "./_Identifier.js";
5
3
  import { ResponsiveTextOptional } from "./_ResponsiveText.js";
4
+ import { NestedTranslationMap } from "./Locale.js";
5
+ import { SlowSkillCastingTimeUnit } from "./SkillModificationLevel.js";
6
6
  export const CastingTime = DB.GenEnum(import.meta.url, {
7
7
  name: "CastingTime",
8
8
  parameters: [DB.Param("NonModifiable")],
@@ -134,7 +134,7 @@ const CustomDurationUnit = DB.TypeAlias(import.meta.url, {
134
134
  comment: "A translation for a numeric value of the custom duration unit, e.g. ‘3 days’. The translation string can and should make use of the `$value` and `$style` variables. The `$style` variable can be either `interval` or `default`.",
135
135
  type: DB.String({
136
136
  minLength: 1,
137
- pattern: /^\.input \{\$value :number\}[\n ]\.input \{\$style :string\}/,
137
+ pattern: /^\.input \{\$value :number\}[\n ]\.input \{\$style :string\}/u,
138
138
  }),
139
139
  }),
140
140
  full: DB.Required({
@@ -151,7 +151,7 @@ const CustomDurationUnit = DB.TypeAlias(import.meta.url, {
151
151
  comment: "A translation for a numeric value of the custom duration unit for use in small spaces, e.g. ‘3 d.’. The translation string can and should make use of the `$value` and `$style` variables. The `$style` variable can be either `interval` or `default`.",
152
152
  type: DB.String({
153
153
  minLength: 1,
154
- pattern: /^\.input \{\$value :number\}[\n ]\.input \{\$style :string\}/,
154
+ pattern: /^\.input \{\$value :number\}[\n ]\.input \{\$style :string\}/u,
155
155
  }),
156
156
  }),
157
157
  compressed: DB.Required({
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { TargetCategoryIdentifier } from "./_Identifier.js";
3
+ import { NestedTranslationMap } from "./Locale.js";
4
4
  export const AffectedTargetCategories = DB.TypeAlias(import.meta.url, {
5
5
  name: "AffectedTargetCategories",
6
6
  comment: `The target category – the kind of creature or object – the skill affects.
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
- import { NestedTranslationMap } from "./Locale.js";
3
2
  import { ArcaneTraditionPrerequisites } from "./_Prerequisite.js";
3
+ import { NestedTranslationMap } from "./Locale.js";
4
4
  export const ArcaneTraditionType = (translationName) => () => DB.Object({
5
5
  prerequisites: DB.Required({
6
6
  type: DB.IncludeIdentifier(ArcaneTraditionPrerequisites),