Reference exp_roles and exp_groups from the exp_scenario build (#473)

* Reference exp_roles and exp_groups from the exp_scenario build

exp_scenario imports types from @expcluster/roles and
@expcluster/permission-groups through their dist folders, so building it
on its own before those packages are built fails with TS2307. A plain
pnpm install runs the prepare scripts in dependency order, but a filtered
install or running tsc --build in exp_scenario on a fresh clone does not.
Referencing the node projects of both packages makes tsc build them first.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Export messages and controller types from exp_roles and exp_groups

exp_scenario reached into @expcluster/roles/dist/node/* for the message
classes and the controller plugin type. The package index now re-exports
messages and the ControllerPlugin type, so consumers import from the
package name like they do with @clusterio/lib. The controller export is
type only, which keeps node code out of the web bundle. The test still
requires the controller classes from dist since they cannot be
re-exported at runtime.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Cooldude2606
2026-09-09 18:42:18 +01:00
committed by GitHub
co-authored by Claude Fable 5.1
6 changed files with 18 additions and 8 deletions
+3
View File
@@ -1,6 +1,9 @@
import * as lib from "@clusterio/lib"; import * as lib from "@clusterio/lib";
import * as messages from "./messages"; import * as messages from "./messages";
export * from "./messages";
export type { ControllerPlugin } from "./controller";
declare module "@clusterio/lib" { declare module "@clusterio/lib" {
export interface InstanceConfigFields { export interface InstanceConfigFields {
"exp_groups.sync_mode": "enabled" | "disabled" | "bidirectional" "exp_groups.sync_mode": "enabled" | "disabled" | "bidirectional"
+3
View File
@@ -1,6 +1,9 @@
import * as lib from "@clusterio/lib"; import * as lib from "@clusterio/lib";
import * as messages from "./messages"; import * as messages from "./messages";
export * from "./messages";
export type { ControllerPlugin } from "./controller";
declare module "@clusterio/lib" { declare module "@clusterio/lib" {
export interface InstanceConfigFields { export interface InstanceConfigFields {
"exp_roles.sync_mode": "disabled" | "enabled" | "bidirectional"; "exp_roles.sync_mode": "disabled" | "enabled" | "bidirectional";
+4 -4
View File
@@ -1,9 +1,9 @@
import * as lib from "@clusterio/lib"; import * as lib from "@clusterio/lib";
import { BaseControllerPlugin } from "@clusterio/controller"; import { BaseControllerPlugin } from "@clusterio/controller";
import type { ControllerPlugin as RolesPlugin } from "@expcluster/roles/dist/node/controller"; import { RoleMetaRecord, type ControllerPlugin as RolesPlugin } from "@expcluster/roles";
import type { ControllerPlugin as GroupsPlugin } from "@expcluster/permission-groups/dist/node/controller"; import {
import { RoleMetaRecord } from "@expcluster/roles/dist/node/messages"; GroupRecord, GroupPermissions, RoleMappingRecord, type ControllerPlugin as GroupsPlugin,
import { GroupRecord, GroupPermissions, RoleMappingRecord } from "@expcluster/permission-groups/dist/node/messages"; } from "@expcluster/permission-groups";
import * as messages from "./messages"; import * as messages from "./messages";
import { SeedRole, SeedGroup, seedRoles, seedGroups, flattenSeedPermissions } from "./seed"; import { SeedRole, SeedGroup, seedRoles, seedGroups, flattenSeedPermissions } from "./seed";
+1 -1
View File
@@ -1,4 +1,4 @@
import { RoleColor } from "@expcluster/roles/dist/node/messages"; import { RoleColor } from "@expcluster/roles";
/** /**
* A role created by the seed, as the scenario defined it before roles moved to * A role created by the seed, as the scenario defined it before roles moved to
+3 -3
View File
@@ -5,11 +5,11 @@ const { Controller } = require("@clusterio/controller");
const { ControllerPlugin } = require("../dist/node/controller"); const { ControllerPlugin } = require("../dist/node/controller");
const messages = require("../dist/node/messages"); const messages = require("../dist/node/messages");
const { seedRoles, seedGroups } = require("../dist/node/seed"); const { seedRoles, seedGroups } = require("../dist/node/seed");
const roles = require("@expcluster/roles/dist/node"); const roles = require("@expcluster/roles");
const groups = require("@expcluster/permission-groups/dist/node"); const groups = require("@expcluster/permission-groups");
const { ControllerPlugin: RolesPlugin } = require("@expcluster/roles/dist/node/controller"); const { ControllerPlugin: RolesPlugin } = require("@expcluster/roles/dist/node/controller");
const { ControllerPlugin: GroupsPlugin } = require("@expcluster/permission-groups/dist/node/controller"); const { ControllerPlugin: GroupsPlugin } = require("@expcluster/permission-groups/dist/node/controller");
const { GroupRecord, GroupPermissions, RoleMappingRecord } = require("@expcluster/permission-groups/dist/node/messages"); const { GroupRecord, GroupPermissions, RoleMappingRecord } = require("@expcluster/permission-groups");
// Importing this defines the permissions the seed grants // Importing this defines the permissions the seed grants
require("../dist/node/permissions"); require("../dist/node/permissions");
+4
View File
@@ -1,5 +1,9 @@
{ {
"extends": "../tsconfig.node.json", "extends": "../tsconfig.node.json",
"references": [
{ "path": "../exp_groups/tsconfig.node.json" },
{ "path": "../exp_roles/tsconfig.node.json" },
],
"include": ["./**/*.ts"], "include": ["./**/*.ts"],
"exclude": ["test/*", "./dist/*"], "exclude": ["test/*", "./dist/*"],
} }