Skip to content

Commit dafc3e6

Browse files
Merge pull request #491 from akashic-games/support-modulemainpaths
Support moduleMainPaths
2 parents bceb269 + 970ae47 commit dafc3e6

File tree

7 files changed

+145
-13
lines changed

7 files changed

+145
-13
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# ChangeLog
22

3+
## 3.18.0
4+
* @akashic/game-configuration@2.2.0 に追従
5+
* `moduleMainPaths` をサポート
6+
37
## 3.17.1
48
* `g.Game#asset: AssetAccessor` を追加
59
* アセットIDからアクセッサパスを逆引きするメソッド `AssetAccessor#pathOf()` を追加

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "@akashic/akashic-engine",
3-
"version": "3.17.1",
3+
"version": "3.18.0",
44
"description": "The core library of Akashic Engine",
55
"main": "index.js",
66
"dependencies": {
7-
"@akashic/game-configuration": "~2.1.0",
7+
"@akashic/game-configuration": "~2.2.0",
88
"@akashic/pdi-types": "^1.13.0",
99
"@akashic/playlog": "~3.3.0",
1010
"@akashic/trigger": "~2.1.0"

src/AssetManager.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import type {
1111
AudioAssetConfigurationBase,
1212
VideoAssetConfigurationBase,
1313
VectorImageAssetConfigurationBase,
14-
BinaryAssetConfigurationBase
14+
BinaryAssetConfigurationBase,
15+
ModuleMainPathsMap
1516
} from "@akashic/game-configuration";
1617
import type {
1718
Asset,
@@ -215,6 +216,12 @@ export class AssetManager implements AssetLoadHandler {
215216
*/
216217
_moduleMainScripts: ModuleMainScriptsMap;
217218

219+
/**
220+
* package.json のパスをキーに、その main フィールドの内容を値に持つテーブル
221+
* @private
222+
*/
223+
_moduleMainPaths: ModuleMainPathsMap | null;
224+
218225
/**
219226
* 各アセットに対する参照の数。
220227
* 参照は requestAssets() で増え、unrefAssets() で減る。
@@ -266,7 +273,8 @@ export class AssetManager implements AssetLoadHandler {
266273
gameParams: AssetManagerParameterGameLike,
267274
conf?: AssetConfigurationMap,
268275
audioSystemConfMap?: AudioSystemConfigurationMap,
269-
moduleMainScripts?: ModuleMainScriptsMap
276+
moduleMainScripts?: ModuleMainScriptsMap,
277+
moduleMainPaths?: ModuleMainPathsMap
270278
) {
271279
this._resourceFactory = gameParams.resourceFactory;
272280
this._audioSystemManager = gameParams.audio;
@@ -278,6 +286,7 @@ export class AssetManager implements AssetLoadHandler {
278286
this._liveAssetVirtualPathTable = {};
279287
this._liveAssetPathTable = {};
280288
this._moduleMainScripts = moduleMainScripts ? moduleMainScripts : {};
289+
this._moduleMainPaths = moduleMainPaths ?? null;
281290
this._refCounts = {};
282291
this._loadings = {};
283292
this._generatedAssetCount = 0;

src/Game.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,13 @@ export class Game {
987987
if (Array.isArray(gameConfiguration.assets)) {
988988
throw new Error("Game#constructor: array type of configuration.assets is not yet supported");
989989
}
990-
this._assetManager = new AssetManager(this, gameConfiguration.assets, gameConfiguration.audio, gameConfiguration.moduleMainScripts);
990+
this._assetManager = new AssetManager(
991+
this,
992+
gameConfiguration.assets,
993+
gameConfiguration.audio,
994+
gameConfiguration.moduleMainScripts,
995+
gameConfiguration.moduleMainPaths
996+
);
991997
this._moduleManager = undefined!;
992998
this.asset = new AssetAccessor(this._assetManager);
993999

src/ModuleManager.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export class ModuleManager {
7575
let resolvedPath: string | undefined;
7676
const liveAssetVirtualPathTable = this._assetManager._liveAssetVirtualPathTable;
7777
const moduleMainScripts = this._assetManager._moduleMainScripts;
78+
const moduleMainPaths = this._assetManager._moduleMainPaths;
7879

7980
// 0. アセットIDらしい場合はまず当該アセットを探す
8081
if (path.indexOf("/") === -1) {
@@ -95,7 +96,8 @@ export class ModuleManager {
9596
}
9697

9798
// akashic-engine独自仕様: 対象の `path` が `moduleMainScripts` に指定されていたらそちらを参照する
98-
if (moduleMainScripts[path]) {
99+
// moduleMainScripts は将来的に非推奨となるため、moduleMainPaths が存在しない場合だけ参照する
100+
if (!moduleMainPaths && moduleMainScripts[path]) {
99101
targetScriptAsset = liveAssetVirtualPathTable[resolvedPath];
100102
} else {
101103
targetScriptAsset = this._findAssetByPathAsFile(resolvedPath, liveAssetVirtualPathTable);
@@ -145,6 +147,7 @@ export class ModuleManager {
145147
let resolvedPath: string | null = null;
146148
const liveAssetVirtualPathTable = this._assetManager._liveAssetVirtualPathTable;
147149
const moduleMainScripts = this._assetManager._moduleMainScripts;
150+
const moduleMainPaths = this._assetManager._moduleMainPaths;
148151

149152
// require(X) from module at path Y
150153
// 1. If X is a core module,
@@ -180,7 +183,8 @@ export class ModuleManager {
180183
// 3. LOAD_NODE_MODULES(X, dirname(Y))
181184

182185
// akashic-engine独自仕様: 対象の `path` が `moduleMainScripts` に指定されていたらそちらを返す
183-
if (moduleMainScripts[path]) {
186+
// moduleMainScripts は将来的に非推奨となるため、moduleMainPaths が存在しない場合だけ参照する
187+
if (!moduleMainPaths && moduleMainScripts[path]) {
184188
return moduleMainScripts[path];
185189
}
186190

@@ -250,6 +254,10 @@ export class ModuleManager {
250254
_resolveAbsolutePathAsDirectory(resolvedPath: string, liveAssetPathTable: { [key: string]: OneOfAsset }): string | null {
251255
let path = resolvedPath + "/package.json";
252256
const asset = liveAssetPathTable[path];
257+
const moduleMainPaths = this._assetManager._moduleMainPaths;
258+
if (moduleMainPaths && moduleMainPaths[path]) {
259+
return moduleMainPaths[path];
260+
}
253261
// liveAssetPathTable[path] != null だけではpathと同名のprototypeプロパティがある場合trueになってしまうので hasOwnProperty() を利用
254262
if (liveAssetPathTable.hasOwnProperty(path) && asset.type === "text") {
255263
const pkg = JSON.parse(asset.data);

src/__tests__/ModuleSpec.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,111 @@ describe("test Module", () => {
887887
game._startLoadingGlobalAssets();
888888
});
889889

890+
it("require - use moduleMainPaths", done => {
891+
const moduleMainScripts = gameConfiguration.moduleMainScripts;
892+
delete gameConfiguration.moduleMainScripts;
893+
gameConfiguration.moduleMainPaths = {
894+
"node_modules/noPackageJsonModule/package.json": "node_modules/noPackageJsonModule/hoge.js",
895+
"node_modules/externalResolvedModule/package.json": "node_modules/externalResolvedModule/index.js"
896+
};
897+
898+
const game = new Game(gameConfiguration, "./");
899+
const manager = game._moduleManager;
900+
const path = "/script/dummypath.js";
901+
game.resourceFactory.scriptContents = scriptContents;
902+
game._onLoad.add(() => {
903+
const module = new Module({
904+
id: "dummymod",
905+
path,
906+
virtualPath: game._assetManager._liveAssetPathTable[path],
907+
runtimeValueBase: game._runtimeValueBase,
908+
requireFunc: (path: string, currentModule?: Module) => manager._require(path, currentModule),
909+
resolveFunc: (path: string, currentModule?: Module) => manager._resolvePath(path, currentModule)
910+
});
911+
912+
let mod = module.require("./foo");
913+
expect(mod.me).toBe("script-foo");
914+
expect(mod.thisModule instanceof Module).toBe(true);
915+
expect(mod.thisModule.filename).toBe("/script/foo.js");
916+
expect(mod.thisModule.parent).toBe(module);
917+
expect(mod.thisModule.children).toEqual([]);
918+
expect(mod.thisModule.loaded).toBe(true);
919+
920+
mod = module.require("noPackageJson");
921+
expect(mod.me).toBe("noPackageJson-index");
922+
expect(mod.thisModule instanceof Module).toBe(true);
923+
expect(mod.thisModule.filename).toBe("/node_modules/noPackageJson/index.js");
924+
expect(mod.thisModule.parent).toBe(module);
925+
expect(mod.thisModule.children).toEqual([]);
926+
expect(mod.thisModule.loaded).toBe(true);
927+
928+
mod = module.require("noDefaultIndex");
929+
expect(mod.me).toBe("noDefaultIndex-root");
930+
expect(mod.thisModule instanceof Module).toBe(true);
931+
expect(mod.thisModule.filename).toBe("/node_modules/noDefaultIndex/root.js");
932+
expect(mod.thisModule.parent).toBe(module);
933+
expect(mod.thisModule.children).toEqual([]);
934+
expect(mod.thisModule.loaded).toBe(true);
935+
936+
mod = module.require("wrongPackageJsonMain");
937+
expect(mod.me).toBe("wrongPackageJsonMain-index");
938+
expect(mod.thisModule instanceof Module).toBe(true);
939+
expect(mod.thisModule.filename).toBe("/node_modules/wrongPackageJsonMain/index.js");
940+
expect(mod.thisModule.parent).toBe(module);
941+
expect(mod.thisModule.children).toEqual([]);
942+
expect(mod.thisModule.loaded).toBe(true);
943+
944+
mod = module.require("aGlobalAssetFoo");
945+
expect(mod.me).toBe("script-foo");
946+
expect(mod.thisModule instanceof Module).toBe(true);
947+
expect(mod.thisModule.filename).toBe("/script/foo.js");
948+
expect(mod.thisModule.parent).toBe(module);
949+
expect(mod.thisModule.children).toEqual([]);
950+
expect(mod.thisModule.loaded).toBe(true);
951+
952+
mod = module.require("noPackageJsonModule");
953+
expect(mod.me).toBe("noPackageJsonModule");
954+
expect(mod.thisModule instanceof Module).toBe(true);
955+
expect(mod.thisModule.filename).toBe("/node_modules/noPackageJsonModule/real_hoge.js");
956+
expect(mod.thisModule.parent).toBe(module);
957+
expect(mod.thisModule.children).toEqual([]);
958+
expect(mod.thisModule.loaded).toBe(true);
959+
960+
expect(() => {
961+
module.require("aNonGlobalAssetBar");
962+
}).toThrowError("AssertionError");
963+
const scene = new Scene({
964+
game: game,
965+
assetIds: ["aNonGlobalAssetBar"]
966+
});
967+
scene.onLoad.add(() => {
968+
let mod = module.require("aNonGlobalAssetBar");
969+
expect(mod.me).toBe("script-bar");
970+
expect(mod.thisModule instanceof Module).toBe(true);
971+
expect(mod.thisModule.filename).toBe("/script/bar.js");
972+
expect(mod.thisModule.parent).toBe(module);
973+
expect(mod.thisModule.children).toEqual([]);
974+
expect(mod.thisModule.loaded).toBe(true);
975+
976+
mod = module.require("./bar");
977+
expect(mod.me).toBe("script-bar");
978+
979+
game.popScene();
980+
game._flushPostTickTasks();
981+
expect(() => {
982+
module.require("aNonGlobalAssetBar");
983+
}).toThrowError("AssertionError");
984+
985+
gameConfiguration.moduleMainScripts = moduleMainScripts;
986+
delete gameConfiguration.moduleMainPaths;
987+
done();
988+
});
989+
game.pushScene(scene);
990+
game._flushPostTickTasks();
991+
});
992+
game._startLoadingGlobalAssets();
993+
});
994+
890995
it("_resolvePath", done => {
891996
const game = new Game(gameConfiguration, "/");
892997
const manager = game._moduleManager;

0 commit comments

Comments
 (0)