@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.
- package/dist/cli/datasworn-build.js +12 -2
- package/dist/cli/datasworn-build.js.map +1 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/content-package-builder.d.ts +67 -0
- package/dist/content-package-builder.d.ts.map +1 -0
- package/dist/content-package-builder.js +198 -0
- package/dist/content-package-builder.js.map +1 -0
- package/dist/id-references.d.ts +20 -0
- package/dist/id-references.d.ts.map +1 -0
- package/dist/id-references.js +96 -0
- package/dist/id-references.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/rules-package-builder.d.ts +20 -0
- package/dist/rules-package-builder.d.ts.map +1 -1
- package/dist/rules-package-builder.js +25 -3
- package/dist/rules-package-builder.js.map +1 -1
- package/dist/validators.d.ts +2 -1
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +4 -3
- package/dist/validators.js.map +1 -1
- package/package.json +3 -3
|
@@ -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
|
-
|
|
32
|
-
|
|
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,
|
|
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
|
|
3
|
+
export type DataswornBuildConfig = RulesPackageBuildConfig | MultiPackageBuildConfig;
|
|
4
|
+
export declare function readBuildConfig(configPath: string): Promise<DataswornBuildConfig>;
|
|
3
5
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/config.js.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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'
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EACN,wBAAwB,EACxB,QAAQ,EAGR,MAAM,2BAA2B,CAAA;AAClC,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EACN,yBAAyB,EAEzB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"rules-package-builder.js","sourceRoot":"","sources":["../src/rules-package-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/validators.d.ts
CHANGED
|
@@ -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
|
package/dist/validators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/validators.js
CHANGED
|
@@ -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
|
package/dist/validators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAyB,MAAM,iBAAiB,CAAA;
|
|
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
|
+
"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.
|
|
52
|
+
"@datasworn-community/core": "0.2.5"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@datasworn-community/core": "0.2.
|
|
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"
|