@dcl/sdk-commands 7.12.1-18948473009.commit-a279e87 → 7.12.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.
- package/dist/commands/code-to-composite/asset-migrator.d.ts +25 -0
- package/dist/commands/code-to-composite/asset-migrator.js +239 -0
- package/dist/commands/code-to-composite/asset-migrator.js.map +1 -0
- package/dist/commands/code-to-composite/code-commenter.d.ts +11 -0
- package/dist/commands/code-to-composite/code-commenter.js +88 -0
- package/dist/commands/code-to-composite/code-commenter.js.map +1 -0
- package/dist/commands/code-to-composite/composite-generator.d.ts +6 -0
- package/dist/commands/code-to-composite/composite-generator.js +56 -0
- package/dist/commands/code-to-composite/composite-generator.js.map +1 -0
- package/dist/commands/code-to-composite/index.d.ts +16 -0
- package/dist/commands/code-to-composite/index.js +130 -0
- package/dist/commands/code-to-composite/index.js.map +1 -0
- package/dist/commands/code-to-composite/name-generator.d.ts +9 -0
- package/dist/commands/code-to-composite/name-generator.js +140 -0
- package/dist/commands/code-to-composite/name-generator.js.map +1 -0
- package/dist/commands/code-to-composite/scene-executor.d.ts +15 -0
- package/dist/commands/code-to-composite/scene-executor.js +405 -0
- package/dist/commands/code-to-composite/scene-executor.js.map +1 -0
- package/dist/commands/start/data-layer/fs.d.ts +1 -1
- package/dist/commands/start/data-layer/fs.js +12 -8
- package/dist/commands/start/data-layer/fs.js.map +1 -1
- package/dist/commands/start/data-layer/rpc.d.ts +1 -1
- package/dist/commands/start/data-layer/rpc.js +2 -2
- package/dist/commands/start/data-layer/rpc.js.map +1 -1
- package/dist/commands/start/index.js +2 -1
- package/dist/commands/start/index.js.map +1 -1
- package/dist/components/fs.d.ts +1 -1
- package/dist/components/fs.js +1 -0
- package/dist/components/fs.js.map +1 -1
- package/dist/locales/en.json +5 -0
- package/dist/locales/es.json +5 -0
- package/dist/locales/zh.json +5 -0
- package/dist/logic/bundle.js +1 -1
- package/dist/logic/error.d.ts +1 -1
- package/dist/logic/error.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateEntityNames = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const dist_cjs_1 = require("@dcl/ecs/dist-cjs");
|
|
9
|
+
function capitalize(string) {
|
|
10
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Component priority list for name generation
|
|
14
|
+
*/
|
|
15
|
+
function getNameGenerators() {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
component: dist_cjs_1.GltfContainer,
|
|
19
|
+
getName: (data) => {
|
|
20
|
+
if (data?.src) {
|
|
21
|
+
const filename = path_1.default.basename(data.src);
|
|
22
|
+
return path_1.default.parse(filename).name;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
component: dist_cjs_1.MeshRenderer,
|
|
29
|
+
getName: (data) => {
|
|
30
|
+
if (data?.mesh?.['$case']) {
|
|
31
|
+
const meshType = data.mesh['$case'];
|
|
32
|
+
return meshType;
|
|
33
|
+
}
|
|
34
|
+
return 'Mesh';
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
component: dist_cjs_1.TextShape,
|
|
39
|
+
getName: (data) => {
|
|
40
|
+
if (data?.text) {
|
|
41
|
+
const text = String(data.text).trim();
|
|
42
|
+
const ellipsed = text.length > 10 ? text.substring(0, 10) + '...' : text;
|
|
43
|
+
return `Text: ${ellipsed}`;
|
|
44
|
+
}
|
|
45
|
+
return 'Text';
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
component: dist_cjs_1.VideoPlayer,
|
|
50
|
+
getName: (data) => {
|
|
51
|
+
if (data?.src) {
|
|
52
|
+
const filename = path_1.default.basename(data.src);
|
|
53
|
+
return path_1.default.parse(filename).name;
|
|
54
|
+
}
|
|
55
|
+
return 'Video';
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
component: dist_cjs_1.NftShape,
|
|
60
|
+
getName: () => 'NFT'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
component: dist_cjs_1.LightSource,
|
|
64
|
+
getName: () => 'Light'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
component: dist_cjs_1.AudioSource,
|
|
68
|
+
getName: (data) => {
|
|
69
|
+
if (data?.audioClipUrl) {
|
|
70
|
+
const filename = path_1.default.basename(data.audioClipUrl);
|
|
71
|
+
return path_1.default.parse(filename).name;
|
|
72
|
+
}
|
|
73
|
+
return 'Audio';
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
component: dist_cjs_1.MeshCollider,
|
|
78
|
+
getName: (data) => {
|
|
79
|
+
const pre = 'Mesh Collider';
|
|
80
|
+
if (data?.mesh?.['$case']) {
|
|
81
|
+
const meshType = data.mesh['$case'];
|
|
82
|
+
return `${pre}: ${meshType}`;
|
|
83
|
+
}
|
|
84
|
+
return pre;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generates a name for an entity based on a specific component
|
|
91
|
+
*/
|
|
92
|
+
function generateNameFromComponent(generator, entity) {
|
|
93
|
+
if (!generator.component.has(entity) || !('getOrNull' in generator.component)) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const componentData = generator.component.getOrNull(entity);
|
|
97
|
+
const name = generator.getName(componentData);
|
|
98
|
+
return name ? capitalize(name) : null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generates Name components for entities that don't have them
|
|
102
|
+
*
|
|
103
|
+
* Automatically generates Name components for entities based on their other components.
|
|
104
|
+
* This makes entities easier to identify and work with in the Creator Hub.
|
|
105
|
+
*/
|
|
106
|
+
async function generateEntityNames(components, engine) {
|
|
107
|
+
const { logger } = components;
|
|
108
|
+
let createdCount = 0;
|
|
109
|
+
const processedEntities = new Set();
|
|
110
|
+
// iterate through entities with nameable components in priority order
|
|
111
|
+
for (const generator of getNameGenerators()) {
|
|
112
|
+
for (const [entity] of engine.getEntitiesWith(generator.component)) {
|
|
113
|
+
// skip if already processed (entity may have multiple "nameable" components)
|
|
114
|
+
if (processedEntities.has(entity))
|
|
115
|
+
continue;
|
|
116
|
+
processedEntities.add(entity);
|
|
117
|
+
// skip reserved entities
|
|
118
|
+
if (entity === engine.RootEntity || entity === engine.PlayerEntity || entity === engine.CameraEntity) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// KNOWN ISSUE: The Name component is filtered out by the renderer transport during scene execution
|
|
122
|
+
// because its componentId exceeds MAX_STATIC_COMPONENT (only core renderer components are sent).
|
|
123
|
+
// See: https://github.com/decentraland/js-sdk-toolchain/blob/main/packages/%40dcl/sdk/src/internal/transports/rendererTransport.ts#L38
|
|
124
|
+
// This means Name components created in scene code are lost during code-to-composite execution,
|
|
125
|
+
// so Name.has(entity) will always return false here, causing custom names to be overwritten.
|
|
126
|
+
// We keep this check for future reference in case the transport filtering changes.
|
|
127
|
+
if (dist_cjs_1.Name.has(entity))
|
|
128
|
+
continue;
|
|
129
|
+
const name = generateNameFromComponent(generator, entity);
|
|
130
|
+
if (name) {
|
|
131
|
+
dist_cjs_1.Name.createOrReplace(entity, { value: name });
|
|
132
|
+
createdCount++;
|
|
133
|
+
logger.log(` ✓ Entity ${entity}: "${name}"`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return createdCount;
|
|
138
|
+
}
|
|
139
|
+
exports.generateEntityNames = generateEntityNames;
|
|
140
|
+
//# sourceMappingURL=name-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../../src/commands/code-to-composite/name-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IEngine } from '@dcl/ecs/dist-cjs';
|
|
2
|
+
import { CliComponents } from '../../components';
|
|
3
|
+
import { SceneProject } from '../../logic/project-validations';
|
|
4
|
+
/**
|
|
5
|
+
* Executes a Decentraland scene's code and captures the resulting ECS engine state.
|
|
6
|
+
*
|
|
7
|
+
* This is the main entry point for the code-to-composite command. It runs scene
|
|
8
|
+
* code in a Node.js environment to extract the entity/component structure.
|
|
9
|
+
*
|
|
10
|
+
* The returned engine can then be used to generate composite/CRDT files.
|
|
11
|
+
*/
|
|
12
|
+
export declare function executeSceneCode(components: Pick<CliComponents, 'fs' | 'logger'>, project: SceneProject, crdtFilePath: string): Promise<{
|
|
13
|
+
engine: IEngine;
|
|
14
|
+
sceneCodeEntrypoint: string;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.executeSceneCode = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const module_1 = __importDefault(require("module"));
|
|
9
|
+
const i18next_1 = __importDefault(require("i18next"));
|
|
10
|
+
const dist_cjs_1 = require("@dcl/ecs/dist-cjs");
|
|
11
|
+
const ByteBuffer_1 = require("@dcl/ecs/dist-cjs/serialization/ByteBuffer");
|
|
12
|
+
const inspector_1 = require("@dcl/inspector");
|
|
13
|
+
const error_1 = require("../../logic/error");
|
|
14
|
+
const bundle_1 = require("../../logic/bundle");
|
|
15
|
+
/**
|
|
16
|
+
* Returns the set of component IDs that are used by the @dcl/inspector.
|
|
17
|
+
*/
|
|
18
|
+
function getInspectorComponentsIds() {
|
|
19
|
+
const { components } = (0, inspector_1.createEngineContext)();
|
|
20
|
+
const ids = new Set();
|
|
21
|
+
for (const [_, component] of Object.entries(components)) {
|
|
22
|
+
ids.add(component.componentId);
|
|
23
|
+
}
|
|
24
|
+
return ids;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Initializes the ECS engine with a mock transport layer.
|
|
28
|
+
*
|
|
29
|
+
* The transport layer is used to capture CRDT messages sent by the scene code.
|
|
30
|
+
* This allows us to capture the state of all entities and components.
|
|
31
|
+
*/
|
|
32
|
+
function initEngine() {
|
|
33
|
+
const transport = {
|
|
34
|
+
filter: () => true,
|
|
35
|
+
send: async (_messages) => { }
|
|
36
|
+
};
|
|
37
|
+
dist_cjs_1.engine.addTransport(transport);
|
|
38
|
+
return {
|
|
39
|
+
engine: dist_cjs_1.engine,
|
|
40
|
+
transport
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Creates initial CRDT state with required engine components.
|
|
45
|
+
*/
|
|
46
|
+
function getInitialCrdtState() {
|
|
47
|
+
function addPlayerEntityTransform() {
|
|
48
|
+
const buffer = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
49
|
+
const transform = dist_cjs_1.Transform.create(dist_cjs_1.engine.PlayerEntity);
|
|
50
|
+
dist_cjs_1.Transform.schema.serialize(transform, buffer);
|
|
51
|
+
const transformData = buffer.toCopiedBinary();
|
|
52
|
+
buffer.resetBuffer();
|
|
53
|
+
dist_cjs_1.PutComponentOperation.write(1, 1, dist_cjs_1.Transform.componentId, transformData, buffer);
|
|
54
|
+
dist_cjs_1.PutComponentOperation.write(2, 1, dist_cjs_1.Transform.componentId, transformData, buffer);
|
|
55
|
+
return buffer.toBinary();
|
|
56
|
+
}
|
|
57
|
+
function addUICanvasOnRootEntity() {
|
|
58
|
+
const buffer = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
59
|
+
const uiCanvasInformation = dist_cjs_1.UiCanvasInformation.create(dist_cjs_1.engine.RootEntity);
|
|
60
|
+
dist_cjs_1.UiCanvasInformation.schema.serialize(uiCanvasInformation, buffer);
|
|
61
|
+
const uiCanvasComponentData = buffer.toCopiedBinary();
|
|
62
|
+
buffer.resetBuffer();
|
|
63
|
+
dist_cjs_1.PutComponentOperation.write(0, 1, dist_cjs_1.UiCanvasInformation.componentId, uiCanvasComponentData, buffer);
|
|
64
|
+
return buffer.toBinary();
|
|
65
|
+
}
|
|
66
|
+
function addCameraMode() {
|
|
67
|
+
const buffer = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
68
|
+
const cameraMode = dist_cjs_1.CameraMode.create(dist_cjs_1.engine.RootEntity);
|
|
69
|
+
dist_cjs_1.CameraMode.schema.serialize(cameraMode, buffer);
|
|
70
|
+
const cameraModeComponentData = buffer.toCopiedBinary();
|
|
71
|
+
buffer.resetBuffer();
|
|
72
|
+
dist_cjs_1.PutComponentOperation.write(2, 1, dist_cjs_1.CameraMode.componentId, cameraModeComponentData, buffer);
|
|
73
|
+
return buffer.toBinary();
|
|
74
|
+
}
|
|
75
|
+
return [addPlayerEntityTransform(), addUICanvasOnRootEntity(), addCameraMode()];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Creates pre-defined mocks for critical ~system modules.
|
|
79
|
+
*
|
|
80
|
+
* These modules are runtime-specific and don't exist in Node.js.
|
|
81
|
+
* This function provides meaningful mock implementations for the most
|
|
82
|
+
* commonly used system modules to ensure scene code executes correctly.
|
|
83
|
+
*/
|
|
84
|
+
function createCriticalModuleMocks(engine, transport, crdtState) {
|
|
85
|
+
return {
|
|
86
|
+
'~system/EngineApi': {
|
|
87
|
+
crdtSendToRenderer: async (crdt) => {
|
|
88
|
+
transport.onmessage(crdt.data);
|
|
89
|
+
await engine.update(0);
|
|
90
|
+
},
|
|
91
|
+
crdtGetState: async () => ({
|
|
92
|
+
hasEntities: false,
|
|
93
|
+
data: [...getInitialCrdtState(), crdtState]
|
|
94
|
+
}),
|
|
95
|
+
sendBatch: async () => ({ events: [] }),
|
|
96
|
+
subscribe: async () => ({}),
|
|
97
|
+
unsubscribe: async () => ({}),
|
|
98
|
+
isServer: async () => ({ isServer: false }),
|
|
99
|
+
crdtGetMessageFromRenderer: async () => ({ data: [] })
|
|
100
|
+
},
|
|
101
|
+
'~system/Scene': {
|
|
102
|
+
getSceneInfo: async () => ({
|
|
103
|
+
cid: '',
|
|
104
|
+
metadata: '{}',
|
|
105
|
+
baseUrl: '',
|
|
106
|
+
contents: []
|
|
107
|
+
})
|
|
108
|
+
},
|
|
109
|
+
'~system/UserIdentity': {
|
|
110
|
+
getUserData: async () => ({
|
|
111
|
+
data: {
|
|
112
|
+
displayName: 'Test User',
|
|
113
|
+
userId: 'test-user-id',
|
|
114
|
+
hasConnectedWeb3: false,
|
|
115
|
+
version: 1,
|
|
116
|
+
avatar: {
|
|
117
|
+
bodyShape: 'urn:decentraland:off-chain:base-avatars:BaseMale',
|
|
118
|
+
skinColor: '#000000',
|
|
119
|
+
hairColor: '#000000',
|
|
120
|
+
eyeColor: '#000000',
|
|
121
|
+
wearables: [],
|
|
122
|
+
snapshots: {
|
|
123
|
+
face256: '',
|
|
124
|
+
body: ''
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}),
|
|
129
|
+
getUserPublicKey: async () => ({ address: undefined })
|
|
130
|
+
},
|
|
131
|
+
'~system/EnvironmentApi': {
|
|
132
|
+
isPreviewMode: async () => ({ isPreview: true }),
|
|
133
|
+
getBootstrapData: async () => ({
|
|
134
|
+
id: '',
|
|
135
|
+
baseUrl: '',
|
|
136
|
+
entity: {
|
|
137
|
+
content: [],
|
|
138
|
+
metadataJson: '{}'
|
|
139
|
+
},
|
|
140
|
+
useFPSThrottling: false
|
|
141
|
+
}),
|
|
142
|
+
getPlatform: async () => ({ platform: 'desktop' }),
|
|
143
|
+
areUnsafeRequestAllowed: async () => ({ status: false }),
|
|
144
|
+
getCurrentRealm: async () => ({ currentRealm: undefined }),
|
|
145
|
+
getExplorerConfiguration: async () => ({ clientUri: '', configurations: {} }),
|
|
146
|
+
getDecentralandTime: async () => ({ seconds: Date.now() / 1000 })
|
|
147
|
+
},
|
|
148
|
+
'~system/Runtime': {
|
|
149
|
+
getRealm: async () => ({
|
|
150
|
+
realmInfo: {
|
|
151
|
+
baseUrl: 'http://localhost',
|
|
152
|
+
realmName: 'localhost',
|
|
153
|
+
networkId: 1,
|
|
154
|
+
commsAdapter: 'offline',
|
|
155
|
+
isPreview: true
|
|
156
|
+
}
|
|
157
|
+
}),
|
|
158
|
+
getWorldTime: async () => ({ seconds: Date.now() / 1000 }),
|
|
159
|
+
readFile: async () => ({ content: new Uint8Array(), hash: '' }),
|
|
160
|
+
getSceneInformation: async () => ({
|
|
161
|
+
urn: '',
|
|
162
|
+
content: [],
|
|
163
|
+
metadataJson: '{}',
|
|
164
|
+
baseUrl: ''
|
|
165
|
+
}),
|
|
166
|
+
getExplorerInformation: async () => ({
|
|
167
|
+
agent: 'code-to-composite',
|
|
168
|
+
platform: 'desktop',
|
|
169
|
+
configurations: {}
|
|
170
|
+
})
|
|
171
|
+
},
|
|
172
|
+
'~system/Players': {
|
|
173
|
+
getPlayerData: async () => ({ data: undefined }),
|
|
174
|
+
getPlayersInScene: async () => ({ players: [] }),
|
|
175
|
+
getConnectedPlayers: async () => ({ players: [] })
|
|
176
|
+
},
|
|
177
|
+
'~system/RestrictedActions': {
|
|
178
|
+
movePlayerTo: async () => ({}),
|
|
179
|
+
teleportTo: async () => ({}),
|
|
180
|
+
triggerEmote: async () => ({}),
|
|
181
|
+
changeRealm: async () => ({ success: false }),
|
|
182
|
+
openExternalUrl: async () => ({ success: false }),
|
|
183
|
+
openNftDialog: async () => ({ success: false }),
|
|
184
|
+
setCommunicationsAdapter: async () => ({ success: false }),
|
|
185
|
+
triggerSceneEmote: async () => ({ success: false })
|
|
186
|
+
},
|
|
187
|
+
'~system/CommsApi': {
|
|
188
|
+
getActiveVideoStreams: async () => ({ streams: [] })
|
|
189
|
+
},
|
|
190
|
+
'~system/CommunicationsController': {
|
|
191
|
+
send: async () => ({}),
|
|
192
|
+
sendBinary: async () => ({ data: [] })
|
|
193
|
+
},
|
|
194
|
+
'~system/EthereumController': {
|
|
195
|
+
requirePayment: async () => ({ jsonAnyResponse: '{}' }),
|
|
196
|
+
signMessage: async () => ({ message: '', hexEncodedMessage: '', signature: '' }),
|
|
197
|
+
convertMessageToObject: async () => ({ dict: {} }),
|
|
198
|
+
sendAsync: async () => ({ jsonAnyResponse: '{}' }),
|
|
199
|
+
getUserAccount: async () => ({ address: undefined })
|
|
200
|
+
},
|
|
201
|
+
'~system/PortableExperiences': {
|
|
202
|
+
spawn: async () => ({ pid: '', parentCid: '', name: '' }),
|
|
203
|
+
kill: async () => ({ status: false }),
|
|
204
|
+
exit: async () => ({ status: false }),
|
|
205
|
+
getPortableExperiencesLoaded: async () => ({ loaded: [] })
|
|
206
|
+
},
|
|
207
|
+
'~system/SignedFetch': {
|
|
208
|
+
signedFetch: async () => ({
|
|
209
|
+
ok: false,
|
|
210
|
+
status: 404,
|
|
211
|
+
statusText: 'Not Found',
|
|
212
|
+
headers: {},
|
|
213
|
+
body: ''
|
|
214
|
+
}),
|
|
215
|
+
getHeaders: async () => ({ headers: {} })
|
|
216
|
+
},
|
|
217
|
+
'~system/Testing': {
|
|
218
|
+
logTestResult: async () => ({}),
|
|
219
|
+
plan: async () => ({}),
|
|
220
|
+
setCameraTransform: async () => ({})
|
|
221
|
+
},
|
|
222
|
+
'~system/UserActionModule': {
|
|
223
|
+
requestTeleport: async () => ({})
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Creates a Proxy that automatically mocks unknown properties and functions.
|
|
229
|
+
*
|
|
230
|
+
* This provides a fallback mechanism for ~system module functions that aren't
|
|
231
|
+
* explicitly mocked.
|
|
232
|
+
*/
|
|
233
|
+
function createAutoMockProxy(baseMock = {}) {
|
|
234
|
+
return new Proxy(baseMock, {
|
|
235
|
+
get(target, prop) {
|
|
236
|
+
if (prop in target) {
|
|
237
|
+
return target[prop];
|
|
238
|
+
}
|
|
239
|
+
return async (...args) => {
|
|
240
|
+
return {};
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Creates a mock implementation for a ~system/* module.
|
|
247
|
+
*
|
|
248
|
+
* ~system modules are runtime-specific and don't exist in Node.js, so they need
|
|
249
|
+
* to be mocked for scene execution.
|
|
250
|
+
*/
|
|
251
|
+
function createSystemModuleMock(engine, transport, mainCrdt, moduleId) {
|
|
252
|
+
const criticalModuleMocks = createCriticalModuleMocks(engine, transport, mainCrdt);
|
|
253
|
+
if (moduleId in criticalModuleMocks) {
|
|
254
|
+
return createAutoMockProxy(criticalModuleMocks[moduleId]);
|
|
255
|
+
}
|
|
256
|
+
return createAutoMockProxy();
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Sets up a Node.js require hook to intercept and mock ~system/* module imports.
|
|
260
|
+
*
|
|
261
|
+
* This patches Module.prototype.require to intercept require() calls during
|
|
262
|
+
* scene bundle execution.
|
|
263
|
+
*
|
|
264
|
+
* NOTE: The hook is temporary and should be removed after scene execution using
|
|
265
|
+
* the returned cleanup function.
|
|
266
|
+
*/
|
|
267
|
+
function setupRequireHook(engine, transport, mainCrdt) {
|
|
268
|
+
const originalRequire = module_1.default.prototype.require;
|
|
269
|
+
module_1.default.prototype.require = function (id) {
|
|
270
|
+
if (id.startsWith('~system/')) {
|
|
271
|
+
return createSystemModuleMock(engine, transport, mainCrdt, id);
|
|
272
|
+
}
|
|
273
|
+
return originalRequire.apply(this, [id]);
|
|
274
|
+
};
|
|
275
|
+
return () => {
|
|
276
|
+
module_1.default.prototype.require = originalRequire;
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Loads and executes the scene bundle to populate the ECS engine.
|
|
281
|
+
*/
|
|
282
|
+
async function loadAndExecuteBundle(bundlePath) {
|
|
283
|
+
delete require.cache[require.resolve(bundlePath)];
|
|
284
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
285
|
+
const sceneModule = require(bundlePath);
|
|
286
|
+
if (typeof sceneModule.onStart === 'function') {
|
|
287
|
+
const onStart = sceneModule.onStart();
|
|
288
|
+
if (typeof onStart.then === 'function') {
|
|
289
|
+
await onStart;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (typeof sceneModule.onUpdate === 'function') {
|
|
293
|
+
const onUpdate = sceneModule.onUpdate(0);
|
|
294
|
+
if (typeof onUpdate.then === 'function') {
|
|
295
|
+
await onUpdate;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Filters out components that are not supported by the @dcl/inspector.
|
|
301
|
+
*/
|
|
302
|
+
function filterInspectorCompatibleComponents(engine) {
|
|
303
|
+
const validComponentIds = getInspectorComponentsIds();
|
|
304
|
+
const reactEcsComponentIds = new Set([
|
|
305
|
+
dist_cjs_1.UiTransform.componentId,
|
|
306
|
+
dist_cjs_1.UiText.componentId,
|
|
307
|
+
dist_cjs_1.UiBackground.componentId,
|
|
308
|
+
dist_cjs_1.UiInput.componentId,
|
|
309
|
+
dist_cjs_1.UiInputResult.componentId,
|
|
310
|
+
dist_cjs_1.UiDropdown.componentId,
|
|
311
|
+
dist_cjs_1.UiDropdownResult.componentId,
|
|
312
|
+
]);
|
|
313
|
+
// first pass: identify entities with react-ecs components
|
|
314
|
+
const uiEntities = new Set();
|
|
315
|
+
for (const component of engine.componentsIter()) {
|
|
316
|
+
if (reactEcsComponentIds.has(component.componentId)) {
|
|
317
|
+
for (const [entity] of engine.getEntitiesWith(component)) {
|
|
318
|
+
uiEntities.add(entity);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// second pass: remove components from entities that either:
|
|
323
|
+
// - are root engine entities
|
|
324
|
+
// - have react-ecs components
|
|
325
|
+
for (const component of engine.componentsIter()) {
|
|
326
|
+
if ('deleteFrom' in component) {
|
|
327
|
+
const isValidComponent = validComponentIds.has(component.componentId);
|
|
328
|
+
for (const [entity] of engine.getEntitiesWith(component)) {
|
|
329
|
+
if (uiEntities.has(entity) || !isValidComponent) {
|
|
330
|
+
component.deleteFrom(entity);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// BONUS: remove Transform from PlayerEntity to avoid bad placement when running the client
|
|
336
|
+
dist_cjs_1.Transform.deleteFrom(engine.PlayerEntity);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Loads the main CRDT file if it exists, otherwise returns an empty buffer.
|
|
340
|
+
*
|
|
341
|
+
* The CRDT file contains serialized component state that may already exist
|
|
342
|
+
* in the scene. This is used to initialize the engine with any pre-existing
|
|
343
|
+
* state before executing the scene code.
|
|
344
|
+
*/
|
|
345
|
+
async function getMainCrdtFile(components, crdtFilePath) {
|
|
346
|
+
let mainCrdt = new Uint8Array();
|
|
347
|
+
if (await components.fs.fileExists(crdtFilePath)) {
|
|
348
|
+
mainCrdt = new Uint8Array(await components.fs.readFile(crdtFilePath));
|
|
349
|
+
}
|
|
350
|
+
return mainCrdt;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Bundles the scene code and returns the entrypoint.
|
|
354
|
+
*/
|
|
355
|
+
async function bundle(components, project) {
|
|
356
|
+
try {
|
|
357
|
+
const { inputs } = await (0, bundle_1.bundleProject)(components, {
|
|
358
|
+
workingDirectory: project.workingDirectory,
|
|
359
|
+
watch: false,
|
|
360
|
+
production: false,
|
|
361
|
+
emitDeclaration: false,
|
|
362
|
+
ignoreComposite: true,
|
|
363
|
+
customEntryPoint: false
|
|
364
|
+
}, project.scene);
|
|
365
|
+
return inputs[0].entrypoint;
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
throw new error_1.CliError('CODE_TO_COMPOSITE_BUILD_FAILED', i18next_1.default.t('errors.code_to_composite.build_failed', { error: err.message }));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Executes a Decentraland scene's code and captures the resulting ECS engine state.
|
|
373
|
+
*
|
|
374
|
+
* This is the main entry point for the code-to-composite command. It runs scene
|
|
375
|
+
* code in a Node.js environment to extract the entity/component structure.
|
|
376
|
+
*
|
|
377
|
+
* The returned engine can then be used to generate composite/CRDT files.
|
|
378
|
+
*/
|
|
379
|
+
async function executeSceneCode(components, project, crdtFilePath) {
|
|
380
|
+
const { fs, logger } = components;
|
|
381
|
+
logger.log('Building scene...');
|
|
382
|
+
const sceneCodeEntrypoint = await bundle(components, project);
|
|
383
|
+
const bundlePath = path_1.default.join(project.workingDirectory, project.scene.main);
|
|
384
|
+
if (!(await fs.fileExists(bundlePath))) {
|
|
385
|
+
throw new error_1.CliError('CODE_TO_COMPOSITE_BUNDLE_NOT_FOUND', i18next_1.default.t('errors.code_to_composite.bundle_not_found', { bundlePath }));
|
|
386
|
+
}
|
|
387
|
+
logger.log('Executing scene code to capture engine state...');
|
|
388
|
+
const crdtState = await getMainCrdtFile(components, crdtFilePath);
|
|
389
|
+
const { engine, transport } = initEngine();
|
|
390
|
+
const restoreRequire = setupRequireHook(engine, transport, crdtState);
|
|
391
|
+
try {
|
|
392
|
+
await loadAndExecuteBundle(bundlePath);
|
|
393
|
+
filterInspectorCompatibleComponents(engine);
|
|
394
|
+
return { engine: engine, sceneCodeEntrypoint };
|
|
395
|
+
}
|
|
396
|
+
catch (err) {
|
|
397
|
+
throw new error_1.CliError('CODE_TO_COMPOSITE_EXECUTION_FAILED', i18next_1.default.t('errors.code_to_composite.execution_failed', { error: `${err.message}\n${err.stack || ''}` }));
|
|
398
|
+
}
|
|
399
|
+
finally {
|
|
400
|
+
// cleanup: restore original require
|
|
401
|
+
restoreRequire();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
exports.executeSceneCode = executeSceneCode;
|
|
405
|
+
//# sourceMappingURL=scene-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-executor.js","sourceRoot":"","sources":["../../../src/commands/code-to-composite/scene-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,4 @@ import { CliComponents } from '../../../components';
|
|
|
5
5
|
* .i.e: scene\\assets\\main.composite -> scene/assets/main.composite
|
|
6
6
|
*/
|
|
7
7
|
export declare function pathToPosix(value: string): string;
|
|
8
|
-
export declare function createFileSystemInterfaceFromFsComponent({ fs }: Pick<CliComponents, 'fs'
|
|
8
|
+
export declare function createFileSystemInterfaceFromFsComponent({ fs }: Pick<CliComponents, 'fs'>, projectWorkingDirectory?: string): FileSystemInterface;
|
|
@@ -13,7 +13,7 @@ function pathToPosix(value) {
|
|
|
13
13
|
return value.replace(/\\/g, '/');
|
|
14
14
|
}
|
|
15
15
|
exports.pathToPosix = pathToPosix;
|
|
16
|
-
function createFileSystemInterfaceFromFsComponent({ fs }) {
|
|
16
|
+
function createFileSystemInterfaceFromFsComponent({ fs }, projectWorkingDirectory = process.cwd()) {
|
|
17
17
|
return {
|
|
18
18
|
dirname(value) {
|
|
19
19
|
return pathToPosix(path_1.default.dirname(value));
|
|
@@ -25,27 +25,31 @@ function createFileSystemInterfaceFromFsComponent({ fs }) {
|
|
|
25
25
|
return path_1.default.join(...paths);
|
|
26
26
|
},
|
|
27
27
|
async existFile(filePath) {
|
|
28
|
-
|
|
28
|
+
const resolvedPath = path_1.default.isAbsolute(filePath) ? filePath : path_1.default.resolve(projectWorkingDirectory, filePath);
|
|
29
|
+
return fs.fileExists(resolvedPath);
|
|
29
30
|
},
|
|
30
31
|
async readFile(filePath) {
|
|
31
|
-
|
|
32
|
+
const resolvedPath = path_1.default.isAbsolute(filePath) ? filePath : path_1.default.resolve(projectWorkingDirectory, filePath);
|
|
33
|
+
return fs.readFile(resolvedPath);
|
|
32
34
|
},
|
|
33
35
|
async writeFile(filePath, content) {
|
|
34
|
-
const
|
|
36
|
+
const resolvedPath = path_1.default.isAbsolute(filePath) ? filePath : path_1.default.resolve(projectWorkingDirectory, filePath);
|
|
37
|
+
const folder = path_1.default.dirname(resolvedPath);
|
|
35
38
|
if (!(await fs.directoryExists(folder))) {
|
|
36
39
|
await fs.mkdir(folder, { recursive: true });
|
|
37
40
|
}
|
|
38
|
-
await fs.writeFile(
|
|
41
|
+
await fs.writeFile(resolvedPath, content);
|
|
39
42
|
},
|
|
40
43
|
async rm(filePath) {
|
|
41
|
-
|
|
44
|
+
const resolvedPath = path_1.default.isAbsolute(filePath) ? filePath : path_1.default.resolve(projectWorkingDirectory, filePath);
|
|
45
|
+
await fs.rm(resolvedPath);
|
|
42
46
|
},
|
|
43
47
|
async readdir(dirPath) {
|
|
44
48
|
if (dirPath.indexOf('/../') !== -1) {
|
|
45
49
|
throw new Error('The usage of /../ is not allowed');
|
|
46
50
|
}
|
|
47
51
|
const root = dirPath === '.' || dirPath === './' || dirPath === '';
|
|
48
|
-
const resolvedPath = root ?
|
|
52
|
+
const resolvedPath = root ? projectWorkingDirectory : dirPath;
|
|
49
53
|
const result = await fs.readdir(resolvedPath);
|
|
50
54
|
return Promise.all(result.map(async (name) => ({
|
|
51
55
|
name: pathToPosix(name),
|
|
@@ -53,7 +57,7 @@ function createFileSystemInterfaceFromFsComponent({ fs }) {
|
|
|
53
57
|
})));
|
|
54
58
|
},
|
|
55
59
|
cwd() {
|
|
56
|
-
return pathToPosix(
|
|
60
|
+
return pathToPosix(projectWorkingDirectory);
|
|
57
61
|
}
|
|
58
62
|
};
|
|
59
63
|
}
|