@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.
- package/README.md +17 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +10 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/datasworn-build.d.ts +3 -0
- package/dist/cli/datasworn-build.d.ts.map +1 -0
- package/dist/cli/datasworn-build.js +33 -0
- package/dist/cli/datasworn-build.js.map +1 -0
- package/dist/cli/datasworn-migrate.d.ts +3 -0
- package/dist/cli/datasworn-migrate.d.ts.map +1 -0
- package/dist/cli/datasworn-migrate.js +26 -0
- package/dist/cli/datasworn-migrate.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/rules-package-builder.d.ts +22 -0
- package/dist/rules-package-builder.d.ts.map +1 -0
- package/dist/rules-package-builder.js +84 -0
- package/dist/rules-package-builder.js.map +1 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +18 -0
- package/dist/schema.js.map +1 -0
- package/dist/validators.d.ts +8 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +35 -0
- package/dist/validators.js.map +1 -0
- package/package.json +60 -0
- package/schema-source/schema/Assets.ts +66 -0
- package/schema-source/schema/Atlas.ts +20 -0
- package/schema-source/schema/Defs.ts +126 -0
- package/schema-source/schema/DelveSites.ts +3 -0
- package/schema-source/schema/Entities.ts +1 -0
- package/schema-source/schema/Generic.ts +18 -0
- package/schema-source/schema/Moves.ts +1 -0
- package/schema-source/schema/Npcs.ts +80 -0
- package/schema-source/schema/Oracles.ts +20 -0
- package/schema-source/schema/Rarities.ts +36 -0
- package/schema-source/schema/Root.ts +94 -0
- package/schema-source/schema/Rules.ts +61 -0
- package/schema-source/schema/RulesPackages.ts +135 -0
- package/schema-source/schema/Symbols.ts +30 -0
- package/schema-source/schema/Truths.ts +53 -0
- package/schema-source/schema/Utils.ts +21 -0
- package/schema-source/schema/assets/Ability.ts +79 -0
- package/schema-source/schema/assets/Enhancement.ts +62 -0
- package/schema-source/schema/assets/Fields.ts +285 -0
- package/schema-source/schema/assets/common.ts +29 -0
- package/schema-source/schema/common/Fields.ts +327 -0
- package/schema-source/schema/common/Id.ts +64 -0
- package/schema-source/schema/common/Inputs.ts +374 -0
- package/schema-source/schema/common/Metadata.ts +142 -0
- package/schema-source/schema/common/Player.ts +17 -0
- package/schema-source/schema/common/Progress.ts +63 -0
- package/schema-source/schema/common/Range.ts +53 -0
- package/schema-source/schema/common/RollableValues.ts +152 -0
- package/schema-source/schema/common/Rolls.ts +108 -0
- package/schema-source/schema/common/Text.ts +95 -0
- package/schema-source/schema/common/index.ts +16 -0
- package/schema-source/schema/delve/DelveSite.ts +121 -0
- package/schema-source/schema/delve/DelveSiteDomain.ts +136 -0
- package/schema-source/schema/delve/DelveSiteTheme.ts +97 -0
- package/schema-source/schema/delve/common.ts +32 -0
- package/schema-source/schema/entities/EntityPrompt.ts +13 -0
- package/schema-source/schema/entities/index.ts +1 -0
- package/schema-source/schema/generic/CollectableNode.ts +75 -0
- package/schema-source/schema/generic/CollectionNode.ts +145 -0
- package/schema-source/schema/generic/Dictionary.ts +39 -0
- package/schema-source/schema/generic/EmbedOnlyNode.ts +19 -0
- package/schema-source/schema/generic/Enhance.ts +38 -0
- package/schema-source/schema/generic/IdNode.ts +40 -0
- package/schema-source/schema/generic/Mixin.ts +11 -0
- package/schema-source/schema/generic/NonCollectableNode.ts +38 -0
- package/schema-source/schema/generic/PrimaryTypeNode.ts +115 -0
- package/schema-source/schema/generic/SourcedNode.ts +51 -0
- package/schema-source/schema/index.ts +23 -0
- package/schema-source/schema/moves/ActionRoll.ts +152 -0
- package/schema-source/schema/moves/EmbeddedMove.ts +24 -0
- package/schema-source/schema/moves/Move.ts +26 -0
- package/schema-source/schema/moves/MoveCategory.ts +6 -0
- package/schema-source/schema/moves/MoveEnhancement.ts +29 -0
- package/schema-source/schema/moves/ProgressRoll.ts +184 -0
- package/schema-source/schema/moves/Trigger.ts +193 -0
- package/schema-source/schema/moves/common.ts +136 -0
- package/schema-source/schema/moves/index.ts +13 -0
- package/schema-source/schema/moves/utils.ts +132 -0
- package/schema-source/schema/object_type/ObjectType.ts +23 -0
- package/schema-source/schema/oracles/EmbeddedOracleRollable.ts +28 -0
- package/schema-source/schema/oracles/OracleCollection.ts +140 -0
- package/schema-source/schema/oracles/OracleRollable.ts +207 -0
- package/schema-source/schema/oracles/Table.ts +94 -0
- package/schema-source/schema/oracles/TableRow.ts +141 -0
- package/schema-source/schema/root/NiceSchema.ts +15 -0
- package/schema-source/schema/root/Root.ts +41 -0
- package/schema-source/schema/root/SchemaTransform.ts +89 -0
- package/schema-source/schema/root/SourceData.ts +151 -0
- package/schema-source/schema/rules/ConditionMeterRule.ts +25 -0
- package/schema-source/schema/rules/ImpactRule.ts +54 -0
- package/schema-source/schema/rules/SpecialTrackRule.ts +29 -0
- package/schema-source/schema/rules/StatRule.ts +23 -0
- package/schema-source/schema/rules/TagRule.ts +176 -0
- package/schema-source/schema/rules/TagSchema.ts +161 -0
- package/schema-source/schema/tags/canonicalTags.ts +29 -0
- package/schema-source/schema/tools/build/index.ts +48 -0
- package/schema-source/schema/tools/i18n/index.ts +9 -0
- package/schema-source/schema/utils/Computed.ts +82 -0
- package/schema-source/schema/utils/DiscriminatedUnion.ts +255 -0
- package/schema-source/schema/utils/EmbeddedNode.ts +172 -0
- package/schema-source/schema/utils/ExtractLiteralFromEnum.ts +22 -0
- package/schema-source/schema/utils/FlatIntersect.ts +107 -0
- package/schema-source/schema/utils/IfThen.ts +50 -0
- package/schema-source/schema/utils/MergeEnumSchemas.ts +16 -0
- package/schema-source/schema/utils/NonNullable.ts +6 -0
- package/schema-source/schema/utils/Nullable.ts +29 -0
- package/schema-source/schema/utils/ObjectLiteral.ts +16 -0
- package/schema-source/schema/utils/ObjectProperties.ts +4 -0
- package/schema-source/schema/utils/OmitMeta.ts +22 -0
- package/schema-source/schema/utils/OmitOptional.ts +27 -0
- package/schema-source/schema/utils/PartialExcept.ts +26 -0
- package/schema-source/schema/utils/SetNullable.ts +44 -0
- package/schema-source/schema/utils/SetOptional.ts +48 -0
- package/schema-source/schema/utils/UnionEnum.ts +82 -0
- package/schema-source/schema/utils/UnionEnumFromRecord.ts +36 -0
- package/schema-source/schema/utils/UnionOneOf.ts +80 -0
- package/schema-source/schema/utils/generateRulesetSchemas.ts +204 -0
- package/schema-source/schema/utils/string.ts +15 -0
- package/schema-source/schema/utils/typebox.ts +141 -0
- 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 @@
|
|
|
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"}
|
package/dist/cli/args.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -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']
|