@datasworn-community/build-tools 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.
Files changed (134) hide show
  1. package/README.md +17 -0
  2. package/dist/cli/args.d.ts +3 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +10 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/datasworn-build.d.ts +3 -0
  7. package/dist/cli/datasworn-build.d.ts.map +1 -0
  8. package/dist/cli/datasworn-build.js +33 -0
  9. package/dist/cli/datasworn-build.js.map +1 -0
  10. package/dist/cli/datasworn-migrate.d.ts +3 -0
  11. package/dist/cli/datasworn-migrate.d.ts.map +1 -0
  12. package/dist/cli/datasworn-migrate.js +26 -0
  13. package/dist/cli/datasworn-migrate.js.map +1 -0
  14. package/dist/config.d.ts +3 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +10 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +4 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +4 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/rules-package-builder.d.ts +22 -0
  23. package/dist/rules-package-builder.d.ts.map +1 -0
  24. package/dist/rules-package-builder.js +84 -0
  25. package/dist/rules-package-builder.js.map +1 -0
  26. package/dist/schema.d.ts +8 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +18 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/validators.d.ts +8 -0
  31. package/dist/validators.d.ts.map +1 -0
  32. package/dist/validators.js +35 -0
  33. package/dist/validators.js.map +1 -0
  34. package/package.json +60 -0
  35. package/schema-source/schema/Assets.ts +66 -0
  36. package/schema-source/schema/Atlas.ts +20 -0
  37. package/schema-source/schema/Defs.ts +126 -0
  38. package/schema-source/schema/DelveSites.ts +3 -0
  39. package/schema-source/schema/Entities.ts +1 -0
  40. package/schema-source/schema/Generic.ts +18 -0
  41. package/schema-source/schema/Moves.ts +1 -0
  42. package/schema-source/schema/Npcs.ts +80 -0
  43. package/schema-source/schema/Oracles.ts +20 -0
  44. package/schema-source/schema/Rarities.ts +36 -0
  45. package/schema-source/schema/Root.ts +94 -0
  46. package/schema-source/schema/Rules.ts +61 -0
  47. package/schema-source/schema/RulesPackages.ts +135 -0
  48. package/schema-source/schema/Symbols.ts +30 -0
  49. package/schema-source/schema/Truths.ts +53 -0
  50. package/schema-source/schema/Utils.ts +21 -0
  51. package/schema-source/schema/assets/Ability.ts +79 -0
  52. package/schema-source/schema/assets/Enhancement.ts +62 -0
  53. package/schema-source/schema/assets/Fields.ts +285 -0
  54. package/schema-source/schema/assets/common.ts +29 -0
  55. package/schema-source/schema/common/Fields.ts +327 -0
  56. package/schema-source/schema/common/Id.ts +64 -0
  57. package/schema-source/schema/common/Inputs.ts +374 -0
  58. package/schema-source/schema/common/Metadata.ts +142 -0
  59. package/schema-source/schema/common/Player.ts +17 -0
  60. package/schema-source/schema/common/Progress.ts +63 -0
  61. package/schema-source/schema/common/Range.ts +53 -0
  62. package/schema-source/schema/common/RollableValues.ts +152 -0
  63. package/schema-source/schema/common/Rolls.ts +108 -0
  64. package/schema-source/schema/common/Text.ts +95 -0
  65. package/schema-source/schema/common/index.ts +16 -0
  66. package/schema-source/schema/delve/DelveSite.ts +121 -0
  67. package/schema-source/schema/delve/DelveSiteDomain.ts +136 -0
  68. package/schema-source/schema/delve/DelveSiteTheme.ts +97 -0
  69. package/schema-source/schema/delve/common.ts +32 -0
  70. package/schema-source/schema/entities/EntityPrompt.ts +13 -0
  71. package/schema-source/schema/entities/index.ts +1 -0
  72. package/schema-source/schema/generic/CollectableNode.ts +75 -0
  73. package/schema-source/schema/generic/CollectionNode.ts +145 -0
  74. package/schema-source/schema/generic/Dictionary.ts +39 -0
  75. package/schema-source/schema/generic/EmbedOnlyNode.ts +19 -0
  76. package/schema-source/schema/generic/Enhance.ts +38 -0
  77. package/schema-source/schema/generic/IdNode.ts +40 -0
  78. package/schema-source/schema/generic/Mixin.ts +11 -0
  79. package/schema-source/schema/generic/NonCollectableNode.ts +38 -0
  80. package/schema-source/schema/generic/PrimaryTypeNode.ts +115 -0
  81. package/schema-source/schema/generic/SourcedNode.ts +51 -0
  82. package/schema-source/schema/index.ts +23 -0
  83. package/schema-source/schema/moves/ActionRoll.ts +152 -0
  84. package/schema-source/schema/moves/EmbeddedMove.ts +24 -0
  85. package/schema-source/schema/moves/Move.ts +26 -0
  86. package/schema-source/schema/moves/MoveCategory.ts +6 -0
  87. package/schema-source/schema/moves/MoveEnhancement.ts +29 -0
  88. package/schema-source/schema/moves/ProgressRoll.ts +184 -0
  89. package/schema-source/schema/moves/Trigger.ts +193 -0
  90. package/schema-source/schema/moves/common.ts +136 -0
  91. package/schema-source/schema/moves/index.ts +13 -0
  92. package/schema-source/schema/moves/utils.ts +132 -0
  93. package/schema-source/schema/object_type/ObjectType.ts +23 -0
  94. package/schema-source/schema/oracles/EmbeddedOracleRollable.ts +28 -0
  95. package/schema-source/schema/oracles/OracleCollection.ts +140 -0
  96. package/schema-source/schema/oracles/OracleRollable.ts +207 -0
  97. package/schema-source/schema/oracles/Table.ts +94 -0
  98. package/schema-source/schema/oracles/TableRow.ts +141 -0
  99. package/schema-source/schema/root/NiceSchema.ts +15 -0
  100. package/schema-source/schema/root/Root.ts +41 -0
  101. package/schema-source/schema/root/SchemaTransform.ts +89 -0
  102. package/schema-source/schema/root/SourceData.ts +151 -0
  103. package/schema-source/schema/rules/ConditionMeterRule.ts +25 -0
  104. package/schema-source/schema/rules/ImpactRule.ts +54 -0
  105. package/schema-source/schema/rules/SpecialTrackRule.ts +29 -0
  106. package/schema-source/schema/rules/StatRule.ts +23 -0
  107. package/schema-source/schema/rules/TagRule.ts +176 -0
  108. package/schema-source/schema/rules/TagSchema.ts +161 -0
  109. package/schema-source/schema/tags/canonicalTags.ts +29 -0
  110. package/schema-source/schema/tools/build/index.ts +48 -0
  111. package/schema-source/schema/tools/i18n/index.ts +9 -0
  112. package/schema-source/schema/utils/Computed.ts +82 -0
  113. package/schema-source/schema/utils/DiscriminatedUnion.ts +255 -0
  114. package/schema-source/schema/utils/EmbeddedNode.ts +172 -0
  115. package/schema-source/schema/utils/ExtractLiteralFromEnum.ts +22 -0
  116. package/schema-source/schema/utils/FlatIntersect.ts +107 -0
  117. package/schema-source/schema/utils/IfThen.ts +50 -0
  118. package/schema-source/schema/utils/MergeEnumSchemas.ts +16 -0
  119. package/schema-source/schema/utils/NonNullable.ts +6 -0
  120. package/schema-source/schema/utils/Nullable.ts +29 -0
  121. package/schema-source/schema/utils/ObjectLiteral.ts +16 -0
  122. package/schema-source/schema/utils/ObjectProperties.ts +4 -0
  123. package/schema-source/schema/utils/OmitMeta.ts +22 -0
  124. package/schema-source/schema/utils/OmitOptional.ts +27 -0
  125. package/schema-source/schema/utils/PartialExcept.ts +26 -0
  126. package/schema-source/schema/utils/SetNullable.ts +44 -0
  127. package/schema-source/schema/utils/SetOptional.ts +48 -0
  128. package/schema-source/schema/utils/UnionEnum.ts +82 -0
  129. package/schema-source/schema/utils/UnionEnumFromRecord.ts +36 -0
  130. package/schema-source/schema/utils/UnionOneOf.ts +80 -0
  131. package/schema-source/schema/utils/generateRulesetSchemas.ts +204 -0
  132. package/schema-source/schema/utils/string.ts +15 -0
  133. package/schema-source/schema/utils/typebox.ts +141 -0
  134. package/schema-source/scripts/const.ts +55 -0
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @datasworn-community/build-tools
2
+
3
+ Build and migration tools for Datasworn source packages.
4
+
5
+ `datasworn-build` reads JSON/YAML Datasworn source files, validates them against
6
+ the schemas shipped by `@datasworn-community/core`, assigns Datasworn IDs, merges
7
+ the files, validates the built package, and writes distribution JSON.
8
+
9
+ `datasworn-migrate` applies Datasworn ID replacement maps to JSON files.
10
+
11
+ The build tools resolve core's shipped schemas at runtime through
12
+ `@datasworn-community/core/json/*`, so consumers should install matching versions
13
+ of `@datasworn-community/core` and `@datasworn-community/build-tools`.
14
+
15
+ The upstream TypeBox schema source is imported under `schema-source/` as source
16
+ material for the schema generation work. Runtime validation uses the generated
17
+ schemas shipped by core.
@@ -0,0 +1,3 @@
1
+ export declare function readArg(args: string[], name: string): string | undefined;
2
+ export declare function hasArg(args: string[], name: string): boolean;
3
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIxE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D"}
@@ -0,0 +1,10 @@
1
+ export function readArg(args, name) {
2
+ const index = args.indexOf(name);
3
+ if (index === -1)
4
+ return undefined;
5
+ return args[index + 1];
6
+ }
7
+ export function hasArg(args, name) {
8
+ return args.includes(name);
9
+ }
10
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAClC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,IAAY;IAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=datasworn-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasworn-build.d.ts","sourceRoot":"","sources":["../../src/cli/datasworn-build.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from 'node:fs';
3
+ import { readBuildConfig } from '../config.js';
4
+ import { buildRulesPackage } from '../rules-package-builder.js';
5
+ import { hasArg, readArg } from './args.js';
6
+ function usage() {
7
+ console.error(`Usage:
8
+ datasworn-build --config datasworn.config.json
9
+ datasworn-build --id my_rules --type ruleset --source source_data/my_rules --out-dir datasworn`);
10
+ process.exit(1);
11
+ }
12
+ const args = process.argv.slice(2);
13
+ if (hasArg(args, '--help') || hasArg(args, '-h'))
14
+ usage();
15
+ const configPath = readArg(args, '--config');
16
+ let config;
17
+ if (configPath != null) {
18
+ if (!existsSync(configPath))
19
+ throw new Error(`Config file not found: ${configPath}`);
20
+ config = await readBuildConfig(configPath);
21
+ }
22
+ else {
23
+ const id = readArg(args, '--id');
24
+ const type = readArg(args, '--type');
25
+ const source = readArg(args, '--source');
26
+ const outDir = readArg(args, '--out-dir');
27
+ if (id == null || type == null || source == null)
28
+ usage();
29
+ config = { id, type, source, outDir };
30
+ }
31
+ const result = await buildRulesPackage(config);
32
+ console.log(`Built ${config.id} from ${result.files.length} file(s): ${result.outFile}`);
33
+ //# sourceMappingURL=datasworn-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasworn-build.js","sourceRoot":"","sources":["../../src/cli/datasworn-build.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EACN,iBAAiB,EAEjB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE3C,SAAS,KAAK;IACb,OAAO,CAAC,KAAK,CAAC;;iGAEkF,CAAC,CAAA;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IAAE,KAAK,EAAE,CAAA;AAEzD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC5C,IAAI,MAA+B,CAAA;AAEnC,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACpF,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAA;AAC3C,CAAC;KAAM,CAAC;IACP,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAoC,CAAA;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAEzC,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI;QAAE,KAAK,EAAE,CAAA;IACzD,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;AAC9C,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=datasworn-migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasworn-migrate.d.ts","sourceRoot":"","sources":["../../src/cli/datasworn-migrate.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile } from 'node:fs/promises';
3
+ import { Migrations } from '@datasworn-community/core';
4
+ import { hasArg, readArg } from './args.js';
5
+ function usage() {
6
+ console.error(`Usage:
7
+ datasworn-migrate --map id_map.json --input old.json --output new.json`);
8
+ process.exit(1);
9
+ }
10
+ const args = process.argv.slice(2);
11
+ if (hasArg(args, '--help') || hasArg(args, '-h'))
12
+ usage();
13
+ const mapPath = readArg(args, '--map');
14
+ const inputPath = readArg(args, '--input');
15
+ const outputPath = readArg(args, '--output');
16
+ if (mapPath == null || inputPath == null || outputPath == null)
17
+ usage();
18
+ const replacementMap = JSON.parse(await readFile(mapPath, 'utf8'));
19
+ const input = await readFile(inputPath, 'utf8');
20
+ const unreplacedIds = new Set();
21
+ const migrated = JSON.parse(input, (key, value) => Migrations.updateIdInString(key, value, replacementMap, unreplacedIds));
22
+ await writeFile(outputPath, `${JSON.stringify(migrated, undefined, 2)}\n`);
23
+ if (unreplacedIds.size > 0) {
24
+ console.warn(`Unreplaced IDs: ${Array.from(unreplacedIds).join(', ')}`);
25
+ }
26
+ //# sourceMappingURL=datasworn-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasworn-migrate.js","sourceRoot":"","sources":["../../src/cli/datasworn-migrate.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE3C,SAAS,KAAK;IACb,OAAO,CAAC,KAAK,CAAC;yEAC0D,CAAC,CAAA;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IAAE,KAAK,EAAE,CAAA;AAEzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACtC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC5C,IAAI,OAAO,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI;IAAE,KAAK,EAAE,CAAA;AAEvE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAGhE,CAAA;AACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AAC/C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;AACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACjD,UAAU,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,CAAC,CACtE,CAAA;AAED,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;AAE1E,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RulesPackageBuildConfig } from './rules-package-builder.js';
2
+ export declare function readBuildConfig(configPath: string): Promise<RulesPackageBuildConfig>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAEzE,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,uBAAuB,CAAC,CAMlC"}
package/dist/config.js ADDED
@@ -0,0 +1,10 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ export async function readBuildConfig(configPath) {
5
+ const text = await readFile(configPath, 'utf8');
6
+ const ext = path.extname(configPath);
7
+ const value = ext === '.json' ? JSON.parse(text) : YAML.parse(text);
8
+ return value;
9
+ }
10
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAA;AAIvB,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEnE,OAAO,KAAgC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { buildRulesPackage, type BuildRulesPackageOptions, type RulesPackageBuildConfig, type RulesPackageBuildResult } from './rules-package-builder.js';
2
+ export { loadCoreSchema, loadCoreSchemas, resolveCoreSchemaPath, type CoreSchemaFileName } from './schema.js';
3
+ export { createDataswornValidator, createDataswornValidators, type SchemaValidator } from './validators.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACN,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,eAAe,EACpB,MAAM,iBAAiB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { buildRulesPackage } from './rules-package-builder.js';
2
+ export { loadCoreSchema, loadCoreSchemas, resolveCoreSchemaPath } from './schema.js';
3
+ export { createDataswornValidator, createDataswornValidators } from './validators.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,EAIjB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACN,cAAc,EACd,eAAe,EACf,qBAAqB,EAErB,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EAEzB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { type Datasworn, type DataswornSource } from '@datasworn-community/core';
2
+ import { type DataswornValidators } from './validators.js';
3
+ export interface RulesPackageBuildConfig {
4
+ id: string;
5
+ type: Datasworn.RulesPackage['type'];
6
+ source?: string;
7
+ outDir?: string;
8
+ paths?: {
9
+ source: string;
10
+ };
11
+ }
12
+ export interface BuildRulesPackageOptions {
13
+ outDir?: string;
14
+ validators?: DataswornValidators<Datasworn.RulesPackage, DataswornSource.RulesPackage>;
15
+ }
16
+ export interface RulesPackageBuildResult {
17
+ data: Datasworn.RulesPackage;
18
+ files: string[];
19
+ outFile: string;
20
+ }
21
+ export declare function buildRulesPackage(config: RulesPackageBuildConfig, options?: BuildRulesPackageOptions): Promise<RulesPackageBuildResult>;
22
+ //# sourceMappingURL=rules-package-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-package-builder.d.ts","sourceRoot":"","sources":["../src/rules-package-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAGN,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAEN,KAAK,mBAAmB,EACxB,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;KACd,CAAA;CACD;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,mBAAmB,CAC/B,SAAS,CAAC,YAAY,EACtB,eAAe,CAAC,YAAY,CAC5B,CAAA;CACD;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,SAAS,CAAC,YAAY,CAAA;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CACf;AAoED,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,uBAAuB,EAC/B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAiClC"}
@@ -0,0 +1,84 @@
1
+ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DATASWORN_SCHEMA_VERSION, IdParser } from '@datasworn-community/core';
4
+ import YAML from 'yaml';
5
+ import { createDataswornValidators } from './validators.js';
6
+ const sourceExtensions = new Set(['.json', '.yaml', '.yml']);
7
+ function isObject(value) {
8
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
9
+ }
10
+ function mergeInto(target, source) {
11
+ for (const [key, value] of Object.entries(source)) {
12
+ if (isObject(value)) {
13
+ const nextTarget = target[key];
14
+ if (!isObject(nextTarget))
15
+ target[key] = {};
16
+ mergeInto(target[key], value);
17
+ }
18
+ else {
19
+ target[key] = value;
20
+ }
21
+ }
22
+ return target;
23
+ }
24
+ function sortValue(value) {
25
+ if (Array.isArray(value))
26
+ return value.map(sortValue);
27
+ if (!isObject(value))
28
+ return value;
29
+ return Object.fromEntries(Object.entries(value)
30
+ .sort(([left], [right]) => left.localeCompare(right, 'en-US'))
31
+ .map(([key, entryValue]) => [key, sortValue(entryValue)]));
32
+ }
33
+ async function collectSourceFiles(sourceDir) {
34
+ const entries = await readdir(sourceDir, { recursive: true, withFileTypes: true });
35
+ const files = entries
36
+ .filter((entry) => entry.isFile())
37
+ .map((entry) => path.join(entry.parentPath, entry.name))
38
+ .filter((filePath) => sourceExtensions.has(path.extname(filePath)))
39
+ .sort((left, right) => left.localeCompare(right, 'en-US'));
40
+ if (files.length === 0)
41
+ throw new Error(`No Datasworn source files found in ${sourceDir}`);
42
+ return files;
43
+ }
44
+ async function readSourceFile(filePath) {
45
+ const text = await readFile(filePath, 'utf8');
46
+ const ext = path.extname(filePath);
47
+ const value = ext === '.json' ? JSON.parse(text) : YAML.parse(text);
48
+ if (!isObject(value))
49
+ throw new Error(`${filePath} did not parse to an object`);
50
+ return value;
51
+ }
52
+ function normalizeConfig(config) {
53
+ const source = config.source ?? config.paths?.source;
54
+ if (source == null)
55
+ throw new Error('Rules package build config requires source');
56
+ return { ...config, source };
57
+ }
58
+ export async function buildRulesPackage(config, options = {}) {
59
+ const normalizedConfig = normalizeConfig(config);
60
+ const validators = options.validators ??
61
+ (await createDataswornValidators());
62
+ const outDir = options.outDir ?? normalizedConfig.outDir ?? 'datasworn';
63
+ const files = await collectSourceFiles(normalizedConfig.source);
64
+ const index = new Map();
65
+ const merged = {
66
+ _id: normalizedConfig.id,
67
+ type: normalizedConfig.type,
68
+ datasworn_version: DATASWORN_SCHEMA_VERSION
69
+ };
70
+ for (const filePath of files) {
71
+ const source = await readSourceFile(filePath);
72
+ validators.source(source);
73
+ IdParser.assignIdsInRulesPackage(source, index);
74
+ mergeInto(merged, source);
75
+ }
76
+ const data = merged;
77
+ validators.output(data);
78
+ const packageOutDir = path.join(outDir, normalizedConfig.id);
79
+ const outFile = path.join(packageOutDir, `${normalizedConfig.id}.json`);
80
+ await mkdir(packageOutDir, { recursive: true });
81
+ await writeFile(outFile, `${JSON.stringify(sortValue(data), undefined, 2)}\n`);
82
+ return { data, files, outFile };
83
+ }
84
+ //# sourceMappingURL=rules-package-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-package-builder.js","sourceRoot":"","sources":["../src/rules-package-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type CoreSchemaFileName = 'datasworn.schema.json' | 'datasworn-source.schema.json';
2
+ export declare function resolveCoreSchemaPath(fileName: CoreSchemaFileName): string;
3
+ export declare function loadCoreSchema(fileName: CoreSchemaFileName): Promise<Record<string, unknown>>;
4
+ export declare function loadCoreSchemas(): Promise<{
5
+ datasworn: Record<string, unknown>;
6
+ source: Record<string, unknown>;
7
+ }>;
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAC3B,uBAAuB,GACvB,8BAA8B,CAAA;AAIjC,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAE1E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,oCAGhE;AAED,wBAAsB,eAAe;;;GAOpC"}
package/dist/schema.js ADDED
@@ -0,0 +1,18 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ const require = createRequire(import.meta.url);
4
+ export function resolveCoreSchemaPath(fileName) {
5
+ return require.resolve(`@datasworn-community/core/json/${fileName}`);
6
+ }
7
+ export async function loadCoreSchema(fileName) {
8
+ const schemaPath = resolveCoreSchemaPath(fileName);
9
+ return JSON.parse(await readFile(schemaPath, 'utf8'));
10
+ }
11
+ export async function loadCoreSchemas() {
12
+ const [datasworn, source] = await Promise.all([
13
+ loadCoreSchema('datasworn.schema.json'),
14
+ loadCoreSchema('datasworn-source.schema.json')
15
+ ]);
16
+ return { datasworn, source };
17
+ }
18
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAM3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,UAAU,qBAAqB,CAAC,QAA4B;IACjE,OAAO,OAAO,CAAC,OAAO,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAA4B;IAChE,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAA4B,CAAA;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,cAAc,CAAC,uBAAuB,CAAC;QACvC,cAAc,CAAC,8BAA8B,CAAC;KAC9C,CAAC,CAAA;IAEF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type SchemaValidator<TTarget> = (data: unknown) => data is TTarget;
2
+ export interface DataswornValidators<TOutput, TSource> {
3
+ output: SchemaValidator<TOutput>;
4
+ source: SchemaValidator<TSource>;
5
+ }
6
+ export declare function createDataswornValidator<TTarget>(schema: Record<string, unknown>, name: string): SchemaValidator<TTarget>;
7
+ export declare function createDataswornValidators<TOutput, TSource>(): Promise<DataswornValidators<TOutput, TSource>>;
8
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,OAAO,CAAA;AAEzE,MAAM,WAAW,mBAAmB,CAAC,OAAO,EAAE,OAAO;IACpD,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAChC;AAeD,wBAAgB,wBAAwB,CAAC,OAAO,EAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,GACV,eAAe,CAAC,OAAO,CAAC,CAiB1B;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAC3E,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CACrC,CAUA"}
@@ -0,0 +1,35 @@
1
+ import { Ajv } from 'ajv/dist/ajv.js';
2
+ import addFormatsModule from 'ajv-formats/dist/index.js';
3
+ import { loadCoreSchemas } from './schema.js';
4
+ function formatErrors(validate) {
5
+ return JSON.stringify(validate.errors?.map(({ instancePath, message, params, schemaPath }) => ({
6
+ instancePath,
7
+ message,
8
+ params,
9
+ schemaPath
10
+ })) ?? [], undefined, 2);
11
+ }
12
+ export function createDataswornValidator(schema, name) {
13
+ const ajv = new Ajv({
14
+ allErrors: true,
15
+ allowUnionTypes: true,
16
+ strict: false
17
+ });
18
+ const addFormats = addFormatsModule;
19
+ addFormats(ajv);
20
+ ajv.addFormat('markdown', true);
21
+ const validate = ajv.compile(schema);
22
+ return (data) => {
23
+ if (validate(data))
24
+ return true;
25
+ throw new Error(`${name} schema validation failed: ${formatErrors(validate)}`);
26
+ };
27
+ }
28
+ export async function createDataswornValidators() {
29
+ const schemas = await loadCoreSchemas();
30
+ return {
31
+ output: createDataswornValidator(schemas.datasworn, 'Datasworn'),
32
+ source: createDataswornValidator(schemas.source, 'Datasworn source')
33
+ };
34
+ }
35
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAyB,MAAM,iBAAiB,CAAA;AAC5D,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAS7C,SAAS,YAAY,CAAC,QAA0B;IAC/C,OAAO,IAAI,CAAC,SAAS,CACpB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,YAAY;QACZ,OAAO;QACP,MAAM;QACN,UAAU;KACV,CAAC,CAAC,IAAI,EAAE,EACT,SAAS,EACT,CAAC,CACD,CAAA;AACF,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,MAA+B,EAC/B,IAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QACnB,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,KAAK;KACb,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,gBAAoD,CAAA;IACvE,UAAU,CAAC,GAAG,CAAC,CAAA;IACf,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAE/B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAEpC,OAAO,CAAC,IAAa,EAAmB,EAAE;QACzC,IAAI,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAE/B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8BAA8B,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAA;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAG9C,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAA;IAEvC,OAAO;QACN,MAAM,EAAE,wBAAwB,CAAU,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;QACzE,MAAM,EAAE,wBAAwB,CAC/B,OAAO,CAAC,MAAM,EACd,kBAAkB,CAClB;KACD,CAAA;AACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@datasworn-community/build-tools",
3
+ "version": "0.2.0",
4
+ "description": "Build and migration tools for Datasworn source packages.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "bin": {
16
+ "datasworn-build": "./dist/cli/datasworn-build.js",
17
+ "datasworn-migrate": "./dist/cli/datasworn-migrate.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "schema-source",
22
+ "README.md"
23
+ ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/datasworn-community/datasworn.git",
27
+ "directory": "packages/build-tools"
28
+ },
29
+ "author": {
30
+ "name": "rsek",
31
+ "url": "https://github.com/rsek"
32
+ },
33
+ "contributors": [
34
+ {
35
+ "name": "tbsvttr",
36
+ "url": "https://github.com/tbsvttr"
37
+ },
38
+ {
39
+ "name": "Datasworn Community",
40
+ "url": "https://github.com/datasworn-community"
41
+ }
42
+ ],
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@sinclair/typebox": "0.34.41",
46
+ "ajv": "^8.20.0",
47
+ "ajv-formats": "^3.0.1",
48
+ "lodash-es": "^4.18.1",
49
+ "yaml": "^2.9.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@datasworn-community/core": "0.2.0"
53
+ },
54
+ "devDependencies": {
55
+ "@datasworn-community/core": "0.2.0"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/datasworn-community/datasworn/issues"
59
+ }
60
+ }
@@ -0,0 +1,66 @@
1
+ import { Type } from '@sinclair/typebox'
2
+ import { AssetPropertiesEnhanceable } from './assets/common.js'
3
+ import { Label, MarkdownString } from './common/Text.js'
4
+ import { CollectableNode } from './generic/CollectableNode.js'
5
+ import { CollectionNode } from './generic/CollectionNode.js'
6
+ import { Dictionary } from './generic/Dictionary.js'
7
+ import { FlatIntersect } from './utils/FlatIntersect.js'
8
+
9
+ const AssetMixin = Type.Object({
10
+ category: Type.Ref(Label, {
11
+ description:
12
+ "A localized category label for this asset. This is the surtitle above the asset's name on the card.",
13
+ examples: [
14
+ 'Combat Talent',
15
+ 'Command Vehicle',
16
+ 'Companion',
17
+ 'Deed',
18
+ 'Module',
19
+ 'Path',
20
+ 'Ritual',
21
+ 'Support Vehicle'
22
+ ]
23
+ }),
24
+ options: Dictionary(Type.Ref('AssetOptionField'), {
25
+ description:
26
+ "Options are input fields set when the player purchases the asset. They're likely to remain the same through the life of the asset. Typically, they are rendered at the top of the asset card."
27
+ }),
28
+ requirement: Type.Optional(
29
+ Type.Ref(MarkdownString, {
30
+ description: 'Describes prerequisites for purchasing or using this asset.'
31
+ })
32
+ ),
33
+ abilities: Type.Array(
34
+ Type.Ref('AssetAbility', {
35
+ description: 'Abilities provided by this asset. Most assets have 3.'
36
+ })
37
+ )
38
+ })
39
+
40
+ export const Asset = CollectableNode(
41
+ FlatIntersect([
42
+ AssetMixin,
43
+ AssetPropertiesEnhanceable(Type.Ref('AssetControlField'))
44
+ ]),
45
+ 'asset'
46
+ )
47
+
48
+ export type TAsset = typeof Asset
49
+ // export type Asset = Collectable<
50
+ // Static<typeof AssetMixin> &
51
+ // Static<ReturnType<typeof AssetPropertiesEnhanceable<TAssetControlField>>>
52
+ // >
53
+
54
+ export const AssetCollection = CollectionNode(
55
+ Type.Object({}),
56
+ 'asset_collection',
57
+ {
58
+ $id: 'AssetCollection'
59
+ }
60
+ )
61
+ export type TAssetCollection = typeof AssetCollection
62
+ // export type AssetCollection = Collection<Asset>
63
+
64
+ export * from './assets/Ability.js'
65
+ export * from './assets/Enhancement.js'
66
+ export * from './assets/Fields.js'
@@ -0,0 +1,20 @@
1
+ import { type Static, Type } from '@sinclair/typebox'
2
+ import * as Generic from './Generic.js'
3
+ import { Cyclopedia } from './generic/Mixin.js'
4
+
5
+ export const AtlasEntry = Generic.CollectableNode(Cyclopedia, 'atlas_entry', {
6
+ description:
7
+ 'An atlas entry, like the Ironlands region entries found in classic Ironsworn.'
8
+ })
9
+
10
+ export type TAtlasEntry = typeof AtlasEntry
11
+ export type AtlasEntry = Static<typeof AtlasEntry>
12
+
13
+ export const AtlasCollection = Generic.CollectionNode(
14
+ Type.Object({}),
15
+ 'atlas_collection'
16
+ )
17
+
18
+ export type TAtlasCollection = typeof AtlasCollection
19
+ /** Infer static type to avoid deep instantiation */
20
+ export type AtlasCollection = (typeof AtlasCollection)['static']