@crowdedkingdoms/crowdyjs 17.12.0-dev.1 → 17.14.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/MIGRATION.md +127 -0
  2. package/README.md +99 -4
  3. package/dist/crowdy-dsh/bridge.d.ts.map +1 -1
  4. package/dist/crowdy-dsh/bridge.js +2 -0
  5. package/dist/crowdy-studio/controller.d.ts +64 -8
  6. package/dist/crowdy-studio/controller.d.ts.map +1 -1
  7. package/dist/crowdy-studio/controller.js +345 -46
  8. package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
  9. package/dist/crowdy-studio/dom-shell.js +16 -9
  10. package/dist/crowdy-studio/embed/hud-layer.d.ts +2 -1
  11. package/dist/crowdy-studio/embed/hud-layer.d.ts.map +1 -1
  12. package/dist/crowdy-studio/embed/panel.d.ts +9 -6
  13. package/dist/crowdy-studio/embed/panel.d.ts.map +1 -1
  14. package/dist/crowdy-studio/embed/panel.js +4 -2
  15. package/dist/crowdy-studio/index.d.ts +2 -2
  16. package/dist/crowdy-studio/index.d.ts.map +1 -1
  17. package/dist/crowdy-studio/models.d.ts +1 -1
  18. package/dist/crowdy-studio/starter-projects.d.ts +22 -0
  19. package/dist/crowdy-studio/starter-projects.d.ts.map +1 -1
  20. package/dist/crowdy-studio/starter-projects.js +129 -5
  21. package/dist/domains/exec.d.ts +222 -20
  22. package/dist/domains/exec.d.ts.map +1 -1
  23. package/dist/domains/exec.js +215 -21
  24. package/dist/domains/marketplace.d.ts +15 -3
  25. package/dist/domains/marketplace.d.ts.map +1 -1
  26. package/dist/domains/marketplace.js +17 -3
  27. package/dist/errors.d.ts +3 -1
  28. package/dist/errors.d.ts.map +1 -1
  29. package/dist/generated/graphql.d.ts +422 -0
  30. package/dist/generated/graphql.d.ts.map +1 -1
  31. package/dist/generated/graphql.js +23 -11
  32. package/dist/grid-mods/exec-client-halves.d.ts +140 -0
  33. package/dist/grid-mods/exec-client-halves.d.ts.map +1 -0
  34. package/dist/grid-mods/exec-client-halves.js +341 -0
  35. package/dist/grid-mods/grid-host-calls.d.ts +3 -1
  36. package/dist/grid-mods/grid-host-calls.d.ts.map +1 -1
  37. package/dist/grid-mods/grid-host-calls.js +3 -1
  38. package/dist/grid-mods/index.d.ts +1 -0
  39. package/dist/grid-mods/index.d.ts.map +1 -1
  40. package/dist/grid-mods/index.js +1 -0
  41. package/dist/grid-mods/mod-runtime.d.ts +10 -2
  42. package/dist/grid-mods/mod-runtime.d.ts.map +1 -1
  43. package/dist/grid-mods/mod-runtime.js +2 -0
  44. package/dist/grid-scope.d.ts +1 -0
  45. package/dist/grid-scope.d.ts.map +1 -1
  46. package/dist/grid-scope.js +1 -0
  47. package/dist/index.d.ts +4 -4
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -3
  50. package/dist/kit/npcs.d.ts.map +1 -1
  51. package/dist/kit/social.d.ts.map +1 -1
  52. package/dist/live-coding/rust-analysis.js +13 -1
  53. package/dist/player-runtime/glue-runtime.d.ts +19 -6
  54. package/dist/player-runtime/glue-runtime.d.ts.map +1 -1
  55. package/dist/player-runtime/glue-runtime.js +40 -16
  56. package/dist/player-runtime/player-code-broker.d.ts +29 -0
  57. package/dist/player-runtime/player-code-broker.d.ts.map +1 -1
  58. package/dist/player-runtime/player-code-broker.js +41 -8
  59. package/dist/player-runtime/player-glue-worker.d.ts +2 -1
  60. package/dist/player-runtime/player-glue-worker.d.ts.map +1 -1
  61. package/dist/player-runtime/player-glue-worker.js +3 -1
  62. package/dist/stores/actors.d.ts +12 -2
  63. package/dist/stores/actors.d.ts.map +1 -1
  64. package/dist/stores/actors.js +43 -18
  65. package/dist/stores/chunks.d.ts +12 -0
  66. package/dist/stores/chunks.d.ts.map +1 -1
  67. package/dist/stores/chunks.js +112 -39
  68. package/dist/stores/durable.d.ts.map +1 -1
  69. package/dist/stores/durable.js +2 -1
  70. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { type MountCrowdyStudioDshOptions, type MountCrowdyStudioOptions } from '../mount.js';
2
2
  import type { CrowdyStudioDshPane } from '../../crowdy-dsh/pane.js';
3
3
  import type { CrowdyStudioDshHost } from '../../crowdy-dsh/bridge.js';
4
- import type { CrowdyStudioController, CrowdyStudioMods, CrowdyStudioPlayerCompute, CrowdyStudioPlayerWallet } from '../controller.js';
4
+ import type { CrowdyStudioController, CrowdyStudioMods, CrowdyStudioPlayerCompute, CrowdyStudioPlayerWallet, CrowdyStudioServerEngine } from '../controller.js';
5
5
  import type { CrowdyStudioProjectProvider } from '../models.js';
6
6
  import type { CrowdyStudioGitHubTransport } from '../github/transport.js';
7
7
  import type { PlayerHostAdapterV1 } from '../../player-host/index.js';
@@ -19,7 +19,7 @@ export interface CrowdyStudioEmbedServices {
19
19
  playerWallet?: CrowdyStudioPlayerWallet;
20
20
  /** GitHub repository loop; omission hides the card. `CrowdyClient` provides it. */
21
21
  crowdyStudioGitHub?: CrowdyStudioGitHubTransport;
22
- /** ck-exec, for `serverEngine: 'ck-exec'`. `CrowdyClient` provides it. */
22
+ /** ck-exec, the default engine for both targets when present. `CrowdyClient` provides it. */
23
23
  exec?: CrowdyStudioMods;
24
24
  }
25
25
  export interface CrowdyStudioEmbedTargetPermission {
@@ -70,11 +70,14 @@ export interface CrowdyStudioEmbedOptions {
70
70
  */
71
71
  github?: CrowdyStudioGitHubTransport;
72
72
  /**
73
- * What runs the SERVER target: legacy player compute (the default until it is switched
74
- * off), or a ck-exec mod on the grid, built from the project's `ckx-sdk` crate
75
- * (`client.exec`).
73
+ * What runs the project: a ck-exec mod on the grid, built from the project's `ckx-sdk`
74
+ * crate, with the CLIENT target as its `crowdy-client-sdk` CLIENT half (`client.exec`), or
75
+ * legacy player compute for both targets, which the platform is switching off. Defaults to
76
+ * `'ck-exec'` when the client has `exec` (every `CrowdyClient` does), else
77
+ * `'player-compute'`. Pass `'player-compute'` to stay on the legacy engine until 18.0
78
+ * removes it.
76
79
  */
77
- serverEngine?: 'player-compute' | 'ck-exec';
80
+ serverEngine?: CrowdyStudioServerEngine;
78
81
  /**
79
82
  * Suppress gameplay input and return a restoration callback. Used only by
80
83
  * the narrow-screen modal; the desktop dock remains non-modal.
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/embed/panel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/embed/panel.ts"],"names":[],"mappings":"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"}
@@ -359,13 +359,15 @@ export class CrowdyStudioEmbed {
359
359
  });
360
360
  }
361
361
  : undefined);
362
- if (this.options.serverEngine === 'ck-exec' && !client.exec) {
362
+ const serverEngine = this.options.serverEngine ?? (client.exec ? 'ck-exec' : 'player-compute');
363
+ if (serverEngine === 'ck-exec' && !client.exec) {
363
364
  throw new Error("serverEngine 'ck-exec' needs the client's exec domain");
364
365
  }
365
366
  const handle = await mountCrowdyStudio(element, {
366
367
  projectProvider: client.crowdyStudio,
367
368
  playerCompute: client.playerCompute,
368
- ...(this.options.serverEngine === 'ck-exec' ? { mods: client.exec } : {}),
369
+ serverEngine,
370
+ ...(serverEngine === 'ck-exec' ? { mods: client.exec } : {}),
369
371
  ...((this.options.github ?? client.crowdyStudioGitHub)
370
372
  ? { github: this.options.github ?? client.crowdyStudioGitHub }
371
373
  : {}),
@@ -1,7 +1,7 @@
1
- export { CrowdyStudioController, type CrowdyStudioControllerOptions, type CrowdyStudioBroker, type CrowdyStudioAgentWorkContext, type CrowdyStudioDeploymentPlan, type CrowdyStudioDeployResult, type CrowdyStudioInvokeResult, type CrowdyStudioPhase, type CrowdyStudioPolledSurface, type CrowdyStudioRun, type CrowdyStudioRuntimeStatus, type CrowdyStudioRuntimeSync, type CrowdyStudioRuntimeSyncState, type CrowdyStudioMods, type CrowdyStudioPlayerCompute, type CrowdyStudioPlayerWallet, type CrowdyStudioState, type CrowdyStudioStopResult, type CrowdyStudioUsageSnapshot, type CrowdyStudioWalletSnapshot, } from './controller.js';
1
+ export { CrowdyStudioController, type CrowdyStudioControllerOptions, type CrowdyStudioBroker, type CrowdyStudioAgentWorkContext, type CrowdyStudioDeploymentPlan, type CrowdyStudioDeployResult, type CrowdyStudioInvokeResult, type CrowdyStudioPhase, type CrowdyStudioPolledSurface, type CrowdyStudioRun, type CrowdyStudioRuntimeStatus, type CrowdyStudioRuntimeSync, type CrowdyStudioRuntimeSyncState, type CrowdyStudioLogLevel, type CrowdyStudioMods, type CrowdyStudioPlayerCompute, type CrowdyStudioPlayerWallet, type CrowdyStudioServerEngine, type CrowdyStudioState, type CrowdyStudioStopResult, type CrowdyStudioUsageSnapshot, type CrowdyStudioWalletSnapshot, } from './controller.js';
2
2
  export { mountCrowdyStudio, type CrowdyStudioHandle, type MountCrowdyStudioDshOptions, type MountCrowdyStudioOptions, } from './mount.js';
3
3
  export { CrowdyStudioOfflineError, CrowdyStudioRevisionConflictError, cloneCrowdyStudioProject, crowdyStudioFileKey, crowdyStudioFileUri, normalizeCrowdyStudioPath, projectTargets, type CreateCrowdyStudioProjectInput, type ImportCrowdyStudioReferenceFileInput, type CrowdyStudioAtomicFileChange, type CrowdyStudioAtomicPatchInput, type CrowdyStudioAtomicPatchResult, type CrowdyStudioCheckpointFile, type CrowdyStudioCheckpointMetadata, type CrowdyStudioCheckpointRestoreInput, type CrowdyStudioCheckpointRestoreResult, type CrowdyStudioFileRef, type CrowdyStudioPairingPreference, type CrowdyStudioProject, type CrowdyStudioProjectFile, type CrowdyStudioProjectKind, type CrowdyStudioProjectMetadata, type CrowdyStudioProjectProvider, type CrowdyStudioProjectRevision, type CrowdyStudioProjectScope, type CrowdyStudioProjectSummary, type CrowdyStudioReferenceFile, type CrowdyStudioSaveState, type CrowdyStudioSynchronizationProvider, type CrowdyStudioProjectSynchronization, type CrowdyStudioPatchOperation, type CrowdyStudioTarget, type SaveCrowdyStudioLibraryFileInput, type SaveCrowdyStudioProjectInput, } from './models.js';
4
- export { createCrowdyStudioStarterProject, type CrowdyStudioNewProjectOptions, } from './starter-projects.js';
4
+ export { createCrowdyStudioStarterProject, type CrowdyStudioModStarter, type CrowdyStudioNewProjectOptions, } from './starter-projects.js';
5
5
  export { DEFAULT_CLIENT_TICK_INTERVAL_MS, MAX_CLIENT_TICK_INTERVAL_MS, MIN_CLIENT_TICK_INTERVAL_MS, parseClientTickIntervalMs, } from './client-tick-interval.js';
6
6
  export { parseRustcDiagnostics, type CrowdyStudioDiagnostic, type CrowdyStudioDiagnosticSeverity, type CrowdyStudioDiagnosticSource, } from './diagnostics.js';
7
7
  export { MODEL_LINT_QUERY, modelLintDiagnostics, modelLintSubjectPath, type CrowdyModelLintFinding, type CrowdyModelLintResult, } from './model-lint.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/index.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export type CrowdyStudioProjectKind = 'SERVER' | 'CLIENT' | 'FULL_STACK';
6
6
  * Whether a full-stack server should advertise its client companion.
7
7
  * `OPTIONAL` records author intent without creating a runtime requirement;
8
8
  * `REQUIRED` is applied with `playerCompute.setRequires` after both targets
9
- * compile successfully.
9
+ * compile successfully. A ck-exec mod has no pairing: players call it by name.
10
10
  */
11
11
  export type CrowdyStudioPairingPreference = 'NONE' | 'OPTIONAL' | 'REQUIRED';
12
12
  /** A source file in one project target. Paths are relative to that target. */
@@ -1,10 +1,32 @@
1
+ import type { CrowdyStudioServerEngine } from './controller.js';
1
2
  import { type CreateCrowdyStudioProjectInput, type CrowdyStudioProjectKind } from './models.js';
3
+ /** ck-exec's mod starter crate (`client.exec.modStarter(appId)`). */
4
+ export interface CrowdyStudioModStarter {
5
+ /** `Cargo.toml` and `src/**` of a `ckx-sdk` crate. */
6
+ files: readonly {
7
+ path: string;
8
+ content: string;
9
+ }[];
10
+ }
2
11
  export interface CrowdyStudioNewProjectOptions {
3
12
  appId: string;
4
13
  gridId: string;
5
14
  name: string;
6
15
  kind: CrowdyStudioProjectKind;
7
16
  description?: string;
17
+ /**
18
+ * The SERVER target starts from this crate, its package named for the project, instead of
19
+ * the legacy compute SDK crate, and the server module name fits a mod's. A mod has no
20
+ * client pairing, so a full-stack project records `NONE`.
21
+ */
22
+ modStarter?: CrowdyStudioModStarter;
23
+ /**
24
+ * `'ck-exec'`: the project is a ck-exec mod. Its SERVER target starts from `modStarter`
25
+ * (required with one), its CLIENT target from a `crowdy-client-sdk` crate, the mod's CLIENT
26
+ * half, and both module names fit a mod's. Default `'player-compute'`, where the CLIENT target
27
+ * is a legacy compute SDK crate.
28
+ */
29
+ engine?: CrowdyStudioServerEngine;
8
30
  }
9
31
  /** Create a compile-oriented starter without introducing a raw JSON source map. */
10
32
  export declare function createCrowdyStudioStarterProject(options: CrowdyStudioNewProjectOptions): CreateCrowdyStudioProjectInput;
@@ -1 +1 @@
1
- {"version":3,"file":"starter-projects.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/starter-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EAEnC,KAAK,uBAAuB,EAG7B,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,uBAAuB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mFAAmF;AACnF,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,6BAA6B,GACrC,8BAA8B,CA2BhC"}
1
+ {"version":3,"file":"starter-projects.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/starter-projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAEL,KAAK,8BAA8B,EAEnC,KAAK,uBAAuB,EAG7B,MAAM,aAAa,CAAC;AASrB,qEAAqE;AACrE,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,uBAAuB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAED,mFAAmF;AACnF,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,6BAA6B,GACrC,8BAA8B,CAqChC"}
@@ -1,9 +1,18 @@
1
1
  import { projectTargets, } from './models.js';
2
2
  const SDK_VERSION = '0.1.8';
3
+ /** crowdy-client-sdk, what a ck-exec mod's CLIENT half builds on; the build points it at the platform's copy. */
4
+ const CLIENT_SDK_VERSION = '0.1.0';
5
+ /** A mod's name is at most 48 characters, and the SERVER module name is `<base>-server`. */
6
+ const MOD_BASE_MAX = 48 - '-server'.length;
3
7
  /** Create a compile-oriented starter without introducing a raw JSON source map. */
4
8
  export function createCrowdyStudioStarterProject(options) {
5
- const base = moduleName(options.name);
9
+ const mod = options.modStarter;
10
+ const exec = options.engine === 'ck-exec';
6
11
  const targets = projectTargets(options.kind);
12
+ if (exec && targets.includes('SERVER') && !mod) {
13
+ throw new Error('A ck-exec SERVER target starts from the mod starter (client.exec.modStarter)');
14
+ }
15
+ const base = mod || exec ? modModuleBase(options.name) : moduleName(options.name);
7
16
  const metadata = {
8
17
  name: options.name.trim() || 'Untitled mod',
9
18
  ...(options.description?.trim()
@@ -15,18 +24,133 @@ export function createCrowdyStudioStarterProject(options) {
15
24
  ...(targets.includes('CLIENT')
16
25
  ? { clientModuleName: `${base}-client` }
17
26
  : {}),
18
- pairingPreference: options.kind === 'FULL_STACK' ? 'REQUIRED' : 'NONE',
27
+ pairingPreference: options.kind === 'FULL_STACK' && !mod && !exec ? 'REQUIRED' : 'NONE',
19
28
  };
20
29
  return {
21
30
  appId: options.appId,
22
31
  gridId: options.gridId,
23
32
  kind: options.kind,
24
33
  metadata,
25
- files: targets.flatMap((target) => starterFiles(target, target === 'SERVER'
26
- ? metadata.serverModuleName
27
- : metadata.clientModuleName)),
34
+ files: targets.flatMap((target) => target === 'SERVER'
35
+ ? mod
36
+ ? modStarterFiles(mod, metadata.serverModuleName)
37
+ : starterFiles(target, metadata.serverModuleName)
38
+ : exec
39
+ ? clientHalfStarterFiles(metadata.clientModuleName)
40
+ : starterFiles(target, metadata.clientModuleName)),
28
41
  };
29
42
  }
43
+ /**
44
+ * A ck-exec mod's CLIENT half: one `crowdy-client-sdk` crate within the build's rules (only
45
+ * `[package]`, `[lib]` as a cdylib, the SDK and serde dependencies, and
46
+ * `[package.metadata.crowdy] tick_interval_ms`).
47
+ */
48
+ function clientHalfStarterFiles(name) {
49
+ return [
50
+ {
51
+ target: 'CLIENT',
52
+ path: 'Cargo.toml',
53
+ content: `[package]
54
+ name = "${name}"
55
+ version = "0.1.0"
56
+ edition = "2021"
57
+
58
+ [lib]
59
+ crate-type = ["cdylib"]
60
+
61
+ # How often visitors' browsers call tick (clamped 16–1000 ms).
62
+ # 1000 = HUD/text. 50 = physics minigames (pool). 16 = shooters, if a tick stays cheap.
63
+ [package.metadata.crowdy]
64
+ tick_interval_ms = 1000
65
+
66
+ [dependencies]
67
+ crowdy-client-sdk = "${CLIENT_SDK_VERSION}"
68
+ serde_json = "1"
69
+ `,
70
+ },
71
+ {
72
+ target: 'CLIENT',
73
+ path: 'src/lib.rs',
74
+ content: `use crowdy_client_sdk as crowdy;
75
+
76
+ fn init() {
77
+ // Runs once in each visitor's browser, after they consent to this CLIENT half
78
+ // (or trust you) and while they stand in this grid.
79
+ crowdy::log(1, "ready");
80
+ }
81
+
82
+ fn tick(_dt_ms: u32) {
83
+ // Every tick_interval_ms (Cargo.toml). The state blob lasts as long as the page's worker.
84
+ let ticks = u32::from_le_bytes(crowdy::state_get().try_into().unwrap_or([0; 4])).wrapping_add(1);
85
+ crowdy::state_set(&ticks.to_le_bytes());
86
+ // Host calls cross the page's broker as the visiting player, inside this grid: the HUD and
87
+ // overlay, chunk and actor reads, voxel writes, spatial and channel sends, grid events.
88
+ // Type "crowdy::api::" for the rest. The page's DOM and tokens are never reachable.
89
+ let _ = crowdy::api::hud_set(serde_json::json!({ "text": format!("Ticks here: {ticks}") }));
90
+ //
91
+ // Mouse (holodeck canvas only; Studio chrome is omitted). Drain every tick:
92
+ // let data = crowdy::api::pointer_clicks().unwrap_or(serde_json::json!({}));
93
+ // data["clicks"] = [{ "t": "down"|"up", "button": 0, "atMs", "heldMs", "nx", "ny" }]
94
+ }
95
+
96
+ fn invoke(payload: &[u8]) -> Vec<u8> {
97
+ payload.to_vec()
98
+ }
99
+
100
+ fn event(_payload: &[u8]) {
101
+ // Grid events from the other CLIENT halves on this page (crowdy::api::emit_event).
102
+ }
103
+
104
+ crowdy::register_module!(init: init, tick: tick, invoke: invoke, event: event);
105
+ `,
106
+ },
107
+ ];
108
+ }
109
+ function modStarterFiles(starter, name) {
110
+ const paths = new Set(starter.files.map((file) => file.path));
111
+ if (!paths.has('Cargo.toml') || !paths.has('src/lib.rs')) {
112
+ throw new Error('The mod starter has no Cargo.toml or src/lib.rs');
113
+ }
114
+ return starter.files.map((file) => ({
115
+ target: 'SERVER',
116
+ path: file.path,
117
+ content: file.path === 'Cargo.toml'
118
+ ? renamePackage(file.content, name)
119
+ : file.content,
120
+ }));
121
+ }
122
+ /** The first `name` in `[package]`, set to `name`; every other line as it was. */
123
+ function renamePackage(manifest, name) {
124
+ let section = '';
125
+ let renamed = false;
126
+ return manifest
127
+ .split('\n')
128
+ .map((line) => {
129
+ const header = /^\s*\[([^\]]+)\]\s*$/.exec(line);
130
+ if (header) {
131
+ section = header[1].trim();
132
+ return line;
133
+ }
134
+ if (section !== 'package' || renamed || !/^\s*name\s*=/.test(line)) {
135
+ return line;
136
+ }
137
+ renamed = true;
138
+ return `name = "${name}"`;
139
+ })
140
+ .join('\n');
141
+ }
142
+ /**
143
+ * A mod module base: short enough for `<base>-server` and `<base>-client` to be mod names, and
144
+ * starting with a letter, as a build's crate names must.
145
+ */
146
+ function modModuleBase(value) {
147
+ const slug = slugModuleName(value);
148
+ if (!slug)
149
+ return 'player-mod';
150
+ const cut = (/^[a-z]/u.test(slug) ? slug : `mod-${slug}`).slice(0, MOD_BASE_MAX);
151
+ // The slug has no runs of dashes, so the cut leaves at most one at the end.
152
+ return cut.endsWith('-') ? cut.slice(0, -1) : cut;
153
+ }
30
154
  function starterFiles(target, name) {
31
155
  return [
32
156
  {