@datasworn-community/build-tools 0.2.3 → 0.2.5

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.
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync } from 'node:fs';
3
3
  import { readBuildConfig } from '../config.js';
4
+ import { buildContentPackages } from '../content-package-builder.js';
4
5
  import { buildRulesPackage } from '../rules-package-builder.js';
5
6
  import { hasArg, readArg } from './args.js';
6
7
  function usage() {
@@ -12,6 +13,9 @@ function usage() {
12
13
  const args = process.argv.slice(2);
13
14
  if (hasArg(args, '--help') || hasArg(args, '-h'))
14
15
  usage();
16
+ function isMultiPackageConfig(config) {
17
+ return 'packages' in config;
18
+ }
15
19
  const configPath = readArg(args, '--config');
16
20
  let config;
17
21
  if (configPath != null) {
@@ -28,6 +32,12 @@ else {
28
32
  usage();
29
33
  config = { id, type, source, outDir };
30
34
  }
31
- const result = await buildRulesPackage(config);
32
- console.log(`Built ${config.id} from ${result.files.length} file(s): ${result.outFile}`);
35
+ if (isMultiPackageConfig(config)) {
36
+ const result = await buildContentPackages(config);
37
+ console.log(`Built ${result.results.length} package(s) in dependency order: ${result.buildOrder.join(', ')}`);
38
+ }
39
+ else {
40
+ const result = await buildRulesPackage(config);
41
+ console.log(`Built ${config.id} from ${result.files.length} file(s): ${result.outFile}`);
42
+ }
33
43
  //# sourceMappingURL=datasworn-build.js.map
@@ -1 +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"}
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,oBAAoB,EAEpB,MAAM,+BAA+B,CAAA;AACtC,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,SAAS,oBAAoB,CAC5B,MAAyD;IAEzD,OAAO,UAAU,IAAI,MAAM,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC5C,IAAI,MAAyD,CAAA;AAE7D,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,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CACV,SAAS,MAAM,CAAC,OAAO,CAAC,MAAM,oCAAoC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAA;AACF,CAAC;KAAM,CAAC;IACP,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC9C,OAAO,CAAC,GAAG,CACV,SAAS,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,OAAO,EAAE,CAC3E,CAAA;AACF,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { MultiPackageBuildConfig } from './content-package-builder.js';
1
2
  import type { RulesPackageBuildConfig } from './rules-package-builder.js';
2
- export declare function readBuildConfig(configPath: string): Promise<RulesPackageBuildConfig>;
3
+ export type DataswornBuildConfig = RulesPackageBuildConfig | MultiPackageBuildConfig;
4
+ export declare function readBuildConfig(configPath: string): Promise<DataswornBuildConfig>;
3
5
  //# sourceMappingURL=config.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAEzE,MAAM,MAAM,oBAAoB,GAC7B,uBAAuB,GACvB,uBAAuB,CAAA;AAE1B,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAM/B"}
@@ -1 +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"}
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;AASvB,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,KAA6B,CAAA;AACrC,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { type RulesPackageBuildConfig, type RulesPackageBuildResult } from './rules-package-builder.js';
2
+ interface PackageJson {
3
+ name: string;
4
+ version: string;
5
+ description?: string;
6
+ type: 'module';
7
+ main: string;
8
+ types: string;
9
+ exports: Record<string, unknown>;
10
+ files: string[];
11
+ dependencies: Record<string, string>;
12
+ license?: string;
13
+ private?: boolean;
14
+ }
15
+ export interface ContentPackageDependencyConfig {
16
+ /** Rules package ID referenced by this package. */
17
+ id: string;
18
+ /** Published npm package name for dependency metadata and installed preload. */
19
+ packageName: string;
20
+ /** Schema line accepted by this package, for example `0.2`. */
21
+ schemaLine: string;
22
+ }
23
+ export interface ContentPackageBuildConfig extends RulesPackageBuildConfig {
24
+ /** Published npm package name, for example `@datasworn-community/starforged`. */
25
+ packageName: string;
26
+ /** Schema line this dataset targets, for example `0.2`. */
27
+ schemaLine: string;
28
+ /** Full package version. Release workflows normally fill this in. */
29
+ version?: string;
30
+ description?: string;
31
+ license?: string;
32
+ private?: boolean;
33
+ /** Cross-package Datasworn package dependencies. */
34
+ dependencies?: string[];
35
+ /** Metadata for dependencies that may be published as sibling packages. */
36
+ publishDependencies?: ContentPackageDependencyConfig[];
37
+ /**
38
+ * Additional packages to load for ID-reference validation without declaring
39
+ * them as publish-time package dependencies.
40
+ */
41
+ validationDependencies?: ContentPackageDependencyConfig[];
42
+ /**
43
+ * Asset directories to copy into the generated publishable package, for
44
+ * example `source_data/starforged/icons`.
45
+ */
46
+ assets?: string[];
47
+ paths?: RulesPackageBuildConfig['paths'] & {
48
+ assets?: string[];
49
+ };
50
+ }
51
+ export interface MultiPackageBuildConfig {
52
+ outDir?: string;
53
+ packageOutDir?: string;
54
+ packages: ContentPackageBuildConfig[];
55
+ }
56
+ export interface ContentPackageBuildResult extends RulesPackageBuildResult {
57
+ config: ContentPackageBuildConfig;
58
+ packageDir: string;
59
+ packageJson: PackageJson;
60
+ }
61
+ export interface MultiPackageBuildResult {
62
+ results: ContentPackageBuildResult[];
63
+ buildOrder: string[];
64
+ }
65
+ export declare function buildContentPackages(config: MultiPackageBuildConfig): Promise<MultiPackageBuildResult>;
66
+ export {};
67
+ //# sourceMappingURL=content-package-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-package-builder.d.ts","sourceRoot":"","sources":["../src/content-package-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,MAAM,4BAA4B,CAAA;AAKnC,UAAU,WAAW;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC9C,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAA;IACnB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACzE,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,8BAA8B,EAAE,CAAA;IACtD;;;OAGG;IACH,sBAAsB,CAAC,EAAE,8BAA8B,EAAE,CAAA;IACzD;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,uBAAuB,CAAC,OAAO,CAAC,GAAG;QAC1C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;CACD;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,yBAAyB,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACzE,MAAM,EAAE,yBAAyB,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,yBAAyB,EAAE,CAAA;IACpC,UAAU,EAAE,MAAM,EAAE,CAAA;CACpB;AAyOD,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,uBAAuB,GAC7B,OAAO,CAAC,uBAAuB,CAAC,CA4ClC"}
@@ -0,0 +1,198 @@
1
+ import { cp, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ import { DATASWORN_SCHEMA_VERSION } from '@datasworn-community/core';
5
+ import { buildRulesPackage } from './rules-package-builder.js';
6
+ import { validateIdRefs } from './id-references.js';
7
+ const require = createRequire(import.meta.url);
8
+ function currentSchemaLine() {
9
+ const [major, minor] = DATASWORN_SCHEMA_VERSION.split('.');
10
+ return `${major}.${minor}`;
11
+ }
12
+ function dependencyRange(schemaLine) {
13
+ return `^${schemaLine}.0`;
14
+ }
15
+ function packageVersion(config) {
16
+ return config.version ?? `${config.schemaLine}.0`;
17
+ }
18
+ function assertSchemaLine(config) {
19
+ if (!/^\d+\.\d+$/.test(config.schemaLine))
20
+ throw new Error(`${config.id}: schemaLine must look like "0.2"`);
21
+ const activeSchemaLine = currentSchemaLine();
22
+ if (config.schemaLine !== activeSchemaLine)
23
+ throw new Error(`${config.id}: schemaLine ${config.schemaLine} does not match installed core schema line ${activeSchemaLine}`);
24
+ const version = packageVersion(config);
25
+ if (!version.startsWith(`${config.schemaLine}.`))
26
+ throw new Error(`${config.id}: package version ${version} must stay on schema line ${config.schemaLine}`);
27
+ }
28
+ function assertNoDuplicatePackageIds(packages) {
29
+ const seen = new Set();
30
+ for (const config of packages) {
31
+ if (seen.has(config.id))
32
+ throw new Error(`Duplicate package id: ${config.id}`);
33
+ seen.add(config.id);
34
+ }
35
+ }
36
+ function topologicalPackageOrder(packages) {
37
+ assertNoDuplicatePackageIds(packages);
38
+ const byId = new Map(packages.map((config) => [config.id, config]));
39
+ const visiting = new Set();
40
+ const visited = new Set();
41
+ const ordered = [];
42
+ function visit(config, ancestry) {
43
+ if (visited.has(config.id))
44
+ return;
45
+ if (visiting.has(config.id))
46
+ throw new Error(`Circular package dependency: ${[...ancestry, config.id].join(' -> ')}`);
47
+ visiting.add(config.id);
48
+ for (const dependencyId of config.dependencies ?? []) {
49
+ const dependency = byId.get(dependencyId);
50
+ if (dependency != null)
51
+ visit(dependency, [...ancestry, config.id]);
52
+ }
53
+ visiting.delete(config.id);
54
+ visited.add(config.id);
55
+ ordered.push(config);
56
+ }
57
+ for (const config of packages)
58
+ visit(config, []);
59
+ return ordered;
60
+ }
61
+ function dependencyMetadata(config, builtPackages) {
62
+ const explicit = new Map((config.publishDependencies ?? []).map((dependency) => [
63
+ dependency.id,
64
+ dependency
65
+ ]));
66
+ return (config.dependencies ?? []).map((dependencyId) => {
67
+ const built = builtPackages.get(dependencyId);
68
+ if (built != null)
69
+ return {
70
+ id: dependencyId,
71
+ packageName: built.config.packageName,
72
+ schemaLine: built.config.schemaLine
73
+ };
74
+ const dependency = explicit.get(dependencyId);
75
+ if (dependency == null)
76
+ throw new Error(`${config.id}: dependency ${dependencyId} is neither built in this repo nor listed in publishDependencies`);
77
+ return dependency;
78
+ });
79
+ }
80
+ async function loadInstalledDependency(dependency) {
81
+ const jsonPath = require.resolve(`${dependency.packageName}/json/${dependency.id}.json`, { paths: [process.cwd()] });
82
+ return JSON.parse(await readFile(jsonPath, 'utf8'));
83
+ }
84
+ async function validationDependencyMetadata(config, builtPackages) {
85
+ const publish = dependencyMetadata(config, builtPackages);
86
+ const byId = new Map(publish.map((dependency) => [dependency.id, dependency]));
87
+ for (const dependency of config.validationDependencies ?? [])
88
+ byId.set(dependency.id, dependency);
89
+ return [...byId.values()];
90
+ }
91
+ async function preloadedDependencies(config, builtPackages) {
92
+ const dependencies = [];
93
+ for (const dependency of await validationDependencyMetadata(config, builtPackages)) {
94
+ const built = builtPackages.get(dependency.id);
95
+ dependencies.push(built?.data ?? (await loadInstalledDependency(dependency)));
96
+ }
97
+ return dependencies;
98
+ }
99
+ function assetDirs(config) {
100
+ return config.assets ?? config.paths?.assets ?? [];
101
+ }
102
+ function packageJsonFor(config, dependencies) {
103
+ const packageDependencies = Object.fromEntries([
104
+ ['@datasworn-community/core', dependencyRange(config.schemaLine)],
105
+ ...dependencies.map((dependency) => [
106
+ dependency.packageName,
107
+ dependencyRange(dependency.schemaLine)
108
+ ])
109
+ ].sort(([left], [right]) => left.localeCompare(right, 'en-US')));
110
+ return {
111
+ name: config.packageName,
112
+ version: packageVersion(config),
113
+ description: config.description,
114
+ type: 'module',
115
+ main: './index.js',
116
+ types: './index.d.ts',
117
+ exports: {
118
+ '.': {
119
+ types: './index.d.ts',
120
+ default: './index.js'
121
+ },
122
+ './json/*': './json/*',
123
+ './package.json': './package.json'
124
+ },
125
+ files: ['index.js', 'index.d.ts', 'json'],
126
+ dependencies: packageDependencies,
127
+ license: config.license,
128
+ private: config.private
129
+ };
130
+ }
131
+ function stableJson(value) {
132
+ return `${JSON.stringify(value, undefined, 2)}\n`;
133
+ }
134
+ async function copyPackageAssets(config, packageDir, packageJson) {
135
+ for (const source of assetDirs(config)) {
136
+ const targetName = path.basename(source);
137
+ const target = path.join(packageDir, targetName);
138
+ await cp(source, target, {
139
+ recursive: true,
140
+ force: true,
141
+ filter: (entryPath) => path.basename(entryPath) !== '.DS_Store'
142
+ });
143
+ if (!packageJson.files.includes(targetName))
144
+ packageJson.files.push(targetName);
145
+ packageJson.exports[`./${targetName}/*`] = `./${targetName}/*`;
146
+ }
147
+ packageJson.files.sort((left, right) => left.localeCompare(right, 'en-US'));
148
+ }
149
+ async function writePublishableArtifacts(config, result, builtPackages, packageOutDir) {
150
+ const dependencies = dependencyMetadata(config, builtPackages);
151
+ const packageJson = packageJsonFor(config, dependencies);
152
+ const packageDir = path.join(packageOutDir, config.id);
153
+ const jsonDir = path.join(packageDir, 'json');
154
+ await mkdir(jsonDir, { recursive: true });
155
+ await copyPackageAssets(config, packageDir, packageJson);
156
+ await Promise.all([
157
+ writeFile(path.join(packageDir, 'package.json'), stableJson(packageJson)),
158
+ writeFile(path.join(packageDir, 'index.js'), `import data from './json/${config.id}.json' with { type: 'json' }\n\nexport { data }\nexport default data\n`),
159
+ writeFile(path.join(packageDir, 'index.d.ts'), "import type { Datasworn } from '@datasworn-community/core'\n\ndeclare const data: Datasworn.RulesPackage\nexport { data }\nexport default data\n"),
160
+ writeFile(path.join(jsonDir, `${config.id}.json`), stableJson(result.data))
161
+ ]);
162
+ return { ...result, config, packageDir, packageJson };
163
+ }
164
+ export async function buildContentPackages(config) {
165
+ const outDir = config.outDir ?? 'datasworn';
166
+ const packageOutDir = config.packageOutDir ?? 'dist/packages';
167
+ const ordered = topologicalPackageOrder(config.packages);
168
+ const builtPackages = new Map();
169
+ const results = [];
170
+ const validationTree = {};
171
+ for (const packageConfig of ordered) {
172
+ assertSchemaLine(packageConfig);
173
+ const result = await buildRulesPackage(packageConfig, {
174
+ outDir,
175
+ validateIdRefs: false
176
+ });
177
+ validationTree[packageConfig.id] = result.data;
178
+ const publishable = await writePublishableArtifacts(packageConfig, result, builtPackages, packageOutDir);
179
+ builtPackages.set(packageConfig.id, publishable);
180
+ results.push(publishable);
181
+ }
182
+ for (const result of results) {
183
+ const dependencyTree = {
184
+ ...validationTree
185
+ };
186
+ for (const dependency of await preloadedDependencies(result.config, builtPackages))
187
+ dependencyTree[dependency._id] = dependency;
188
+ const idRefs = validateIdRefs(result.data, dependencyTree);
189
+ const unresolved = [...idRefs.invalid, ...idRefs.unreachable];
190
+ if (unresolved.length > 0)
191
+ throw new Error(`${result.config.id}: ${unresolved.length} unresolved ID reference(s):\n ${unresolved.join('\n ')}`);
192
+ }
193
+ return {
194
+ results,
195
+ buildOrder: ordered.map((packageConfig) => packageConfig.id)
196
+ };
197
+ }
198
+ //# sourceMappingURL=content-package-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-package-builder.js","sourceRoot":"","sources":["../src/content-package-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { IdParser } from '@datasworn-community/core';
2
+ /** Collect every Datasworn ID reference embedded in `data`. */
3
+ export declare function extractIdRefs(data: unknown): Set<string>;
4
+ export interface IdRefReport {
5
+ /** References that resolve to at least one node in the tree. */
6
+ valid: Set<string>;
7
+ /** Strings that look like IDs but cannot be parsed. */
8
+ invalid: Set<string>;
9
+ /** Parseable IDs that match no node in the tree. */
10
+ unreachable: Set<string>;
11
+ }
12
+ type Tree = Parameters<IdParser['getMatches']>[0];
13
+ /**
14
+ * Validate every ID reference in `data` against `tree`, partitioning them into
15
+ * valid / invalid / unreachable. `tree` should contain the package being built
16
+ * plus any preloaded dependency packages.
17
+ */
18
+ export declare function validateIdRefs(data: unknown, tree: Tree): IdRefReport;
19
+ export {};
20
+ //# sourceMappingURL=id-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-references.d.ts","sourceRoot":"","sources":["../src/id-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAwEpD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CASxD;AAED,MAAM,WAAW,WAAW;IAC3B,gEAAgE;IAChE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAClB,uDAAuD;IACvD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,oDAAoD;IACpD,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACxB;AAED,KAAK,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAsBjD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,WAAW,CAIrE"}
@@ -0,0 +1,96 @@
1
+ import { IdParser } from '@datasworn-community/core';
2
+ /**
3
+ * Collects the Datasworn ID references embedded in a built rules package and
4
+ * validates that each one resolves against a tree. Ported from the upstream
5
+ * `pkg-core/Validators/Text.ts` (`forEachIdRef`) and
6
+ * `RulesPackageBuilder.validateIdRef`, adapted onto the published core
7
+ * `IdParser`. Used to verify cross-package references (e.g. an expansion that
8
+ * points at IDs defined by the ruleset it depends on) actually resolve.
9
+ */
10
+ // The `_id` key holds a node's own identity, not a reference to another node.
11
+ const IdKey = '_id';
12
+ // Keys whose string values are free text / URLs and never bare ID references.
13
+ const plainTextKeys = new Set(['label', '_comment', 'name', 'title', 'category']);
14
+ const urlKeys = new Set(['url', 'license', 'icon']);
15
+ const nonTextKeys = new Set(['dice']);
16
+ // Matches a `typeId:path` Datasworn ID (or wildcard) wherever it appears —
17
+ // standalone, inside a markdown link, or inside a `{{macro>id}}`.
18
+ const idLike = /(?<typeId>[a-z\d_.]{3,}|\*{1,2}):(?<path>(?:[a-z_]+|\*{1,2})(?:\/(?:[a-z\d_.]+|\*{1,2})+)+|\*{2})/g;
19
+ function forEachPrimitiveValue(value, key, fn) {
20
+ switch (typeof value) {
21
+ case 'undefined':
22
+ break;
23
+ case 'boolean':
24
+ case 'number':
25
+ case 'string':
26
+ fn(value, key);
27
+ break;
28
+ case 'object':
29
+ if (value === null)
30
+ fn(null, key);
31
+ else if (Array.isArray(value))
32
+ value.forEach((item, index) => forEachPrimitiveValue(item, index, fn));
33
+ else
34
+ for (const [childKey, childValue] of Object.entries(value))
35
+ forEachPrimitiveValue(childValue, childKey, fn);
36
+ break;
37
+ default:
38
+ throw new Error(`Unrecognized value type: ${typeof value}`);
39
+ }
40
+ }
41
+ function needsIdValidation(key, value) {
42
+ if (!(typeof key === 'number' || typeof key === 'string'))
43
+ return false;
44
+ if (typeof value !== 'string')
45
+ return false;
46
+ if (key === IdKey ||
47
+ plainTextKeys.has(key) ||
48
+ urlKeys.has(key) ||
49
+ nonTextKeys.has(key) ||
50
+ !value.includes('/') ||
51
+ !value.includes(':'))
52
+ return false;
53
+ return true;
54
+ }
55
+ /** Collect every Datasworn ID reference embedded in `data`. */
56
+ export function extractIdRefs(data) {
57
+ const ids = new Set();
58
+ forEachPrimitiveValue(data, undefined, (value, key) => {
59
+ if (!needsIdValidation(key, value))
60
+ return;
61
+ for (const match of value.matchAll(idLike))
62
+ ids.add(match[0]);
63
+ });
64
+ return ids;
65
+ }
66
+ function emptyReport() {
67
+ return { valid: new Set(), invalid: new Set(), unreachable: new Set() };
68
+ }
69
+ function classifyIdRef(id, tree, report) {
70
+ if (report.valid.has(id) || report.invalid.has(id) || report.unreachable.has(id))
71
+ return;
72
+ let parsed;
73
+ try {
74
+ parsed = IdParser.parse(id);
75
+ }
76
+ catch {
77
+ report.invalid.add(id);
78
+ return;
79
+ }
80
+ if (parsed.getMatches(tree, () => true).size > 0)
81
+ report.valid.add(id);
82
+ else
83
+ report.unreachable.add(id);
84
+ }
85
+ /**
86
+ * Validate every ID reference in `data` against `tree`, partitioning them into
87
+ * valid / invalid / unreachable. `tree` should contain the package being built
88
+ * plus any preloaded dependency packages.
89
+ */
90
+ export function validateIdRefs(data, tree) {
91
+ const report = emptyReport();
92
+ for (const id of extractIdRefs(data))
93
+ classifyIdRef(id, tree, report);
94
+ return report;
95
+ }
96
+ //# sourceMappingURL=id-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-references.js","sourceRoot":"","sources":["../src/id-references.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { buildRulesPackage, type BuildRulesPackageOptions, type RulesPackageBuildConfig, type RulesPackageBuildResult } from './rules-package-builder.js';
2
+ export { buildContentPackages, type ContentPackageBuildConfig, type ContentPackageBuildResult, type ContentPackageDependencyConfig, type MultiPackageBuildConfig, type MultiPackageBuildResult } from './content-package-builder.js';
2
3
  export { loadCoreSchema, loadCoreSchemas, resolveCoreSchemaPath, type CoreSchemaFileName } from './schema.js';
3
4
  export { createDataswornValidator, createDataswornValidators, type SchemaValidator } from './validators.js';
5
+ export { extractIdRefs, validateIdRefs, type IdRefReport } from './id-references.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,MAAM,8BAA8B,CAAA;AACrC,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;AACxB,OAAO,EACN,aAAa,EACb,cAAc,EACd,KAAK,WAAW,EAChB,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { buildRulesPackage } from './rules-package-builder.js';
2
+ export { buildContentPackages } from './content-package-builder.js';
2
3
  export { loadCoreSchema, loadCoreSchemas, resolveCoreSchemaPath } from './schema.js';
3
4
  export { createDataswornValidator, createDataswornValidators } from './validators.js';
5
+ export { extractIdRefs, validateIdRefs } from './id-references.js';
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,EAIjB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACN,oBAAoB,EAMpB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACN,cAAc,EACd,eAAe,EACf,qBAAqB,EAErB,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EAEzB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACN,aAAa,EACb,cAAc,EAEd,MAAM,oBAAoB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { type Datasworn, type DataswornSource } from '@datasworn-community/core';
2
+ import { type IdRefReport } from './id-references.js';
2
3
  import { type DataswornValidators } from './validators.js';
3
4
  export interface RulesPackageBuildConfig {
4
5
  id: string;
@@ -8,15 +9,34 @@ export interface RulesPackageBuildConfig {
8
9
  paths?: {
9
10
  source: string;
10
11
  };
12
+ /**
13
+ * IDs of other rules packages this one references (e.g. an expansion's
14
+ * ruleset). The multi-package builder preloads their built output so
15
+ * cross-package ID references resolve; declaration order does not matter.
16
+ */
17
+ dependencies?: string[];
11
18
  }
12
19
  export interface BuildRulesPackageOptions {
13
20
  outDir?: string;
14
21
  validators?: DataswornValidators<Datasworn.RulesPackage, DataswornSource.RulesPackage>;
22
+ /**
23
+ * Already-built dependency packages to include in the ID-reference
24
+ * validation tree, so references from this package into them resolve.
25
+ */
26
+ dependencies?: readonly Datasworn.RulesPackage[];
27
+ /**
28
+ * Validate ID references immediately against this package and dependencies.
29
+ * Multi-package content builds disable this and validate once against the
30
+ * complete in-repo tree, which supports optional cross-package references.
31
+ */
32
+ validateIdRefs?: boolean;
15
33
  }
16
34
  export interface RulesPackageBuildResult {
17
35
  data: Datasworn.RulesPackage;
18
36
  files: string[];
19
37
  outFile: string;
38
+ /** Result of validating this package's ID references against the tree. */
39
+ idRefs: IdRefReport;
20
40
  }
21
41
  export declare function buildRulesPackage(config: RulesPackageBuildConfig, options?: BuildRulesPackageOptions): Promise<RulesPackageBuildResult>;
22
42
  //# sourceMappingURL=rules-package-builder.d.ts.map
@@ -1 +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"}
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,WAAW,EAChB,MAAM,oBAAoB,CAAA;AAC3B,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;IACD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;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;IACD;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,SAAS,CAAC,YAAY,EAAE,CAAA;IAChD;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,SAAS,CAAC,YAAY,CAAA;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,MAAM,EAAE,WAAW,CAAA;CACnB;AA4ED,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,uBAAuB,EAC/B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAwDlC"}
@@ -2,11 +2,15 @@ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { DATASWORN_SCHEMA_VERSION, IdParser } from '@datasworn-community/core';
4
4
  import YAML from 'yaml';
5
+ import { validateIdRefs } from './id-references.js';
5
6
  import { createDataswornValidators } from './validators.js';
6
7
  const sourceExtensions = new Set(['.json', '.yaml', '.yml']);
7
8
  function isObject(value) {
8
9
  return typeof value === 'object' && value !== null && !Array.isArray(value);
9
10
  }
11
+ function cloneJsonValue(value) {
12
+ return JSON.parse(JSON.stringify(value));
13
+ }
10
14
  function mergeInto(target, source) {
11
15
  for (const [key, value] of Object.entries(source)) {
12
16
  if (isObject(value)) {
@@ -44,9 +48,12 @@ async function collectSourceFiles(sourceDir) {
44
48
  async function readSourceFile(filePath) {
45
49
  const text = await readFile(filePath, 'utf8');
46
50
  const ext = path.extname(filePath);
47
- const value = ext === '.json' ? JSON.parse(text) : YAML.parse(text);
51
+ const value = ext === '.json'
52
+ ? JSON.parse(text)
53
+ : cloneJsonValue(YAML.parse(text, { maxAliasCount: -1, merge: true }));
48
54
  if (!isObject(value))
49
55
  throw new Error(`${filePath} did not parse to an object`);
56
+ value.datasworn_version = DATASWORN_SCHEMA_VERSION;
50
57
  return value;
51
58
  }
52
59
  function normalizeConfig(config) {
@@ -70,15 +77,30 @@ export async function buildRulesPackage(config, options = {}) {
70
77
  for (const filePath of files) {
71
78
  const source = await readSourceFile(filePath);
72
79
  validators.source(source);
73
- IdParser.assignIdsInRulesPackage(source, index);
74
80
  mergeInto(merged, source);
75
81
  }
82
+ IdParser.assignIdsInRulesPackage(merged, index);
76
83
  const data = merged;
77
84
  validators.output(data);
85
+ // Validate ID references against a tree of this package plus any preloaded
86
+ // dependencies. This catches cross-package references (e.g. an expansion
87
+ // pointing at its ruleset) that AJV structural validation cannot.
88
+ const tree = {
89
+ [normalizedConfig.id]: data
90
+ };
91
+ for (const dependency of options.dependencies ?? [])
92
+ tree[dependency._id] = dependency;
93
+ const shouldValidateIdRefs = options.validateIdRefs ?? true;
94
+ const idRefs = shouldValidateIdRefs
95
+ ? validateIdRefs(data, tree)
96
+ : { valid: new Set(), invalid: new Set(), unreachable: new Set() };
97
+ const unresolved = [...idRefs.invalid, ...idRefs.unreachable];
98
+ if (shouldValidateIdRefs && unresolved.length > 0)
99
+ throw new Error(`${normalizedConfig.id}: ${unresolved.length} unresolved ID reference(s):\n ${unresolved.join('\n ')}`);
78
100
  const packageOutDir = path.join(outDir, normalizedConfig.id);
79
101
  const outFile = path.join(packageOutDir, `${normalizedConfig.id}.json`);
80
102
  await mkdir(packageOutDir, { recursive: true });
81
103
  await writeFile(outFile, `${JSON.stringify(sortValue(data), undefined, 2)}\n`);
82
- return { data, files, outFile };
104
+ return { data, files, outFile, idRefs };
83
105
  }
84
106
  //# sourceMappingURL=rules-package-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules-package-builder.js","sourceRoot":"","sources":["../src/rules-package-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules-package-builder.js","sourceRoot":"","sources":["../src/rules-package-builder.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
+ import type { Options } from 'ajv/dist/core.js';
1
2
  export type SchemaValidator<TTarget> = (data: unknown) => data is TTarget;
2
3
  export interface DataswornValidators<TOutput, TSource> {
3
4
  output: SchemaValidator<TOutput>;
4
5
  source: SchemaValidator<TSource>;
5
6
  }
6
- export declare function createDataswornValidator<TTarget>(schema: Record<string, unknown>, name: string): SchemaValidator<TTarget>;
7
+ export declare function createDataswornValidator<TTarget>(schema: Record<string, unknown>, name: string, options?: Options): SchemaValidator<TTarget>;
7
8
  export declare function createDataswornValidators<TOutput, TSource>(): Promise<DataswornValidators<TOutput, TSource>>;
8
9
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAK/C,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,EACZ,OAAO,GAAE,OAAY,GACnB,eAAe,CAAC,OAAO,CAAC,CAkB1B;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAC3E,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CACrC,CAWA"}
@@ -9,11 +9,12 @@ function formatErrors(validate) {
9
9
  schemaPath
10
10
  })) ?? [], undefined, 2);
11
11
  }
12
- export function createDataswornValidator(schema, name) {
12
+ export function createDataswornValidator(schema, name, options = {}) {
13
13
  const ajv = new Ajv({
14
14
  allErrors: true,
15
15
  allowUnionTypes: true,
16
- strict: false
16
+ strict: false,
17
+ ...options
17
18
  });
18
19
  const addFormats = addFormatsModule;
19
20
  addFormats(ajv);
@@ -29,7 +30,7 @@ export async function createDataswornValidators() {
29
30
  const schemas = await loadCoreSchemas();
30
31
  return {
31
32
  output: createDataswornValidator(schemas.datasworn, 'Datasworn'),
32
- source: createDataswornValidator(schemas.source, 'Datasworn source')
33
+ source: createDataswornValidator(schemas.source, 'Datasworn source', { useDefaults: 'empty' })
33
34
  };
34
35
  }
35
36
  //# sourceMappingURL=validators.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAyB,MAAM,iBAAiB,CAAA;AAE5D,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,EACZ,UAAmB,EAAE;IAErB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QACnB,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,KAAK;QACb,GAAG,OAAO;KACV,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,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,CACxB;KACD,CAAA;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datasworn-community/build-tools",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Build and migration tools for Datasworn source packages.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -49,10 +49,10 @@
49
49
  "yaml": "^2.9.0"
50
50
  },
51
51
  "peerDependencies": {
52
- "@datasworn-community/core": "0.2.3"
52
+ "@datasworn-community/core": "0.2.5"
53
53
  },
54
54
  "devDependencies": {
55
- "@datasworn-community/core": "0.2.3",
55
+ "@datasworn-community/core": "0.2.5",
56
56
  "json-schema": "^0.4.0",
57
57
  "json-schema-library": "^11.4.1",
58
58
  "type-fest": "^5.6.0"