miaoda-game-devkit 0.2.9 → 0.2.11

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 (40) hide show
  1. package/README.md +27 -1
  2. package/dist/cli/lint.js +32 -1
  3. package/dist/game-clock-suUidZdT.d.mts +11 -0
  4. package/dist/game-clock-suUidZdT.d.ts +11 -0
  5. package/dist/{gameplay-audit-CCJo4Qhk.d.mts → gameplay-audit-DmbBA0M_.d.mts} +7 -1
  6. package/dist/{gameplay-audit-CCJo4Qhk.d.ts → gameplay-audit-DmbBA0M_.d.ts} +7 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +165 -4
  10. package/dist/index.mjs +165 -4
  11. package/dist/lint/game-telemetry.contract.mjs +165 -4
  12. package/dist/lint/gameplay-contract.contract.mjs +165 -4
  13. package/dist/lint/phaser-headless.contract.mjs +281 -4
  14. package/dist/lint/vitest-config.contract.mjs +234 -11
  15. package/dist/phaser-facade.mjs +156 -0
  16. package/dist/react/index.d.mts +13 -0
  17. package/dist/react/index.d.ts +13 -0
  18. package/dist/react/index.js +57 -0
  19. package/dist/react/index.mjs +29 -0
  20. package/dist/react/testing.d.mts +21 -0
  21. package/dist/react/testing.d.ts +21 -0
  22. package/dist/react/testing.js +82 -0
  23. package/dist/react/testing.mjs +57 -0
  24. package/dist/react/vitest-config.d.mts +14 -0
  25. package/dist/react/vitest-config.d.ts +14 -0
  26. package/dist/react/vitest-config.js +57 -0
  27. package/dist/react/vitest-config.mjs +32 -0
  28. package/dist/react/vitest-setup.d.mts +2 -0
  29. package/dist/react/vitest-setup.d.ts +2 -0
  30. package/dist/react/vitest-setup.js +35 -0
  31. package/dist/react/vitest-setup.mjs +33 -0
  32. package/dist/vite.d.mts +22 -0
  33. package/dist/vite.d.ts +22 -0
  34. package/dist/vite.js +93 -0
  35. package/dist/vite.mjs +67 -0
  36. package/dist/vitest-config.d.mts +2 -2
  37. package/dist/vitest-config.d.ts +2 -2
  38. package/dist/vitest-config.js +53 -3
  39. package/dist/vitest-config.mjs +53 -3
  40. package/package.json +72 -2
@@ -1,5 +1,5 @@
1
1
  // src/vitest-config.ts
2
- import { resolve } from "path";
2
+ import { resolve as resolve2 } from "path";
3
3
  import { defineConfig } from "vitest/config";
4
4
 
5
5
  // src/gameplay-audit.ts
@@ -603,7 +603,52 @@ GAMEPLAY_AUDIT: ALL CONTRACTS PASSED (${tests.filter((test) => test.metadata).le
603
603
  }
604
604
  };
605
605
 
606
+ // src/vite.ts
607
+ import { existsSync } from "fs";
608
+ import { createRequire } from "module";
609
+ import { dirname, join as join2, normalize, resolve, sep } from "path";
610
+ var PHASER_MODULE_ID = "phaser";
611
+ function resolvePhaserFacade(projectRoot) {
612
+ const requireFromProject = createRequire(join2(projectRoot, "package.json"));
613
+ const viteEntry = requireFromProject.resolve("miaoda-game-devkit/vite");
614
+ const facade = join2(dirname(viteEntry), "phaser-facade.mjs");
615
+ if (!existsSync(facade)) {
616
+ throw new Error(
617
+ `miaoda-game-devkit \u7F3A\u5C11 Phaser facade\uFF1A${facade}`
618
+ );
619
+ }
620
+ return facade;
621
+ }
622
+ function isInsideDirectory(filePath, directory) {
623
+ const normalizedFile = normalize(filePath);
624
+ const normalizedDirectory = `${normalize(directory)}${sep}`;
625
+ return normalizedFile.startsWith(normalizedDirectory);
626
+ }
627
+ function phaserRexUIScenePlugin(projectRoot) {
628
+ let scenesRoot = projectRoot ? resolve(projectRoot, "src/scenes") : void 0;
629
+ let phaserFacade = projectRoot ? resolvePhaserFacade(projectRoot) : void 0;
630
+ return {
631
+ name: "miaoda-phaser-rexui-scene",
632
+ enforce: "pre",
633
+ configResolved(config) {
634
+ const resolvedProjectRoot = projectRoot ?? config.root;
635
+ scenesRoot ??= resolve(resolvedProjectRoot, "src/scenes");
636
+ phaserFacade ??= resolvePhaserFacade(resolvedProjectRoot);
637
+ },
638
+ /** 查询参数属于构建工具元数据,去除后才能稳定判断真实源码位置。 */
639
+ resolveId(source, importer) {
640
+ if (source !== PHASER_MODULE_ID || !importer || !scenesRoot) {
641
+ return null;
642
+ }
643
+ const cleanImporter = importer.split("?", 1)[0] ?? importer;
644
+ return isInsideDirectory(cleanImporter, scenesRoot) ? phaserFacade ?? null : null;
645
+ }
646
+ };
647
+ }
648
+
606
649
  // src/vitest-config.ts
650
+ var PHASER_FACADE_DEPENDENCY = /miaoda-game-devkit[\\/]dist[\\/]phaser-facade\.mjs$/;
651
+ var REXUI_DEPENDENCY = /phaser4-rex-plugins/;
607
652
  function defineGameVitestConfig(options) {
608
653
  const auditIssues = validateGameplayAuditOptions(options.gameplayAudit, options.projectRoot);
609
654
  if (auditIssues.length > 0) {
@@ -613,10 +658,11 @@ function defineGameVitestConfig(options) {
613
658
  );
614
659
  }
615
660
  return defineConfig({
661
+ plugins: [phaserRexUIScenePlugin(options.projectRoot)],
616
662
  resolve: {
617
663
  alias: {
618
664
  ...options.aliases,
619
- "@": resolve(options.projectRoot, "src")
665
+ "@": resolve2(options.projectRoot, "src")
620
666
  }
621
667
  },
622
668
  // devkit 作为 external ESM 加载时,应用测试也必须 externalize Phaser,
@@ -634,7 +680,11 @@ function defineGameVitestConfig(options) {
634
680
  // 如果强制内联,Vite 会把这些模块按浏览器模块转换,
635
681
  // 最终触发 "No such built-in module: node:"。
636
682
  external: [/miaoda-game-devkit/],
637
- inline: options.inlineDependencies
683
+ inline: [
684
+ PHASER_FACADE_DEPENDENCY,
685
+ REXUI_DEPENDENCY,
686
+ ...options.inlineDependencies ?? []
687
+ ]
638
688
  }
639
689
  },
640
690
  environment: "jsdom",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "miaoda-game-devkit",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "description": "Shared lint and deterministic Phaser HEADLESS testing tools for Miaoda games",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,48 @@
30
30
  "default": "./dist/vitest-config.js"
31
31
  }
32
32
  },
33
+ "./vite": {
34
+ "import": {
35
+ "types": "./dist/vite.d.mts",
36
+ "default": "./dist/vite.mjs"
37
+ },
38
+ "require": {
39
+ "types": "./dist/vite.d.ts",
40
+ "default": "./dist/vite.js"
41
+ }
42
+ },
33
43
  "./vitest-setup": "./dist/lint/setup.mjs",
44
+ "./react": {
45
+ "import": {
46
+ "types": "./dist/react/index.d.mts",
47
+ "default": "./dist/react/index.mjs"
48
+ },
49
+ "require": {
50
+ "types": "./dist/react/index.d.ts",
51
+ "default": "./dist/react/index.js"
52
+ }
53
+ },
54
+ "./react/testing": {
55
+ "import": {
56
+ "types": "./dist/react/testing.d.mts",
57
+ "default": "./dist/react/testing.mjs"
58
+ },
59
+ "require": {
60
+ "types": "./dist/react/testing.d.ts",
61
+ "default": "./dist/react/testing.js"
62
+ }
63
+ },
64
+ "./react/vitest-config": {
65
+ "import": {
66
+ "types": "./dist/react/vitest-config.d.mts",
67
+ "default": "./dist/react/vitest-config.mjs"
68
+ },
69
+ "require": {
70
+ "types": "./dist/react/vitest-config.d.ts",
71
+ "default": "./dist/react/vitest-config.js"
72
+ }
73
+ },
74
+ "./react/vitest-setup": "./dist/react/vitest-setup.mjs",
34
75
  "./biome": "./biome-config.json",
35
76
  "./tsconfig-base": "./tsconfig-base.json"
36
77
  },
@@ -80,7 +121,36 @@
80
121
  "vitest": "^4.1.10"
81
122
  },
82
123
  "peerDependencies": {
83
- "phaser": ">=4.0.0 <5"
124
+ "@testing-library/jest-dom": ">=6 <8",
125
+ "@testing-library/react": ">=16 <17",
126
+ "phaser": ">=4.0.0 <5",
127
+ "phaser4-rex-plugins": ">=4.0.0 <5",
128
+ "react": ">=19 <20",
129
+ "react-dom": ">=19 <20",
130
+ "vite": ">=6 <9"
131
+ },
132
+ "peerDependenciesMeta": {
133
+ "@testing-library/jest-dom": {
134
+ "optional": true
135
+ },
136
+ "@testing-library/react": {
137
+ "optional": true
138
+ },
139
+ "phaser": {
140
+ "optional": true
141
+ },
142
+ "phaser4-rex-plugins": {
143
+ "optional": true
144
+ },
145
+ "react": {
146
+ "optional": true
147
+ },
148
+ "react-dom": {
149
+ "optional": true
150
+ },
151
+ "vite": {
152
+ "optional": true
153
+ }
84
154
  },
85
155
  "publishConfig": {
86
156
  "registry": "https://registry.npmjs.org/",