@ishibashi0112/webview2-bridge-gen 0.2.0 → 0.3.0

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 (44) hide show
  1. package/README.md +12 -0
  2. package/dist/cli.js +62 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/generate.d.ts +1 -0
  5. package/dist/generate.d.ts.map +1 -1
  6. package/dist/generate.js +1 -0
  7. package/dist/generate.js.map +1 -1
  8. package/dist/init.d.ts +32 -0
  9. package/dist/init.d.ts.map +1 -0
  10. package/dist/init.js +93 -0
  11. package/dist/init.js.map +1 -0
  12. package/package.json +6 -3
  13. package/template/README.md +10 -0
  14. package/template/myapp/README.md +91 -0
  15. package/template/myapp/_gitignore +6 -0
  16. package/template/myapp/contract/contract.schema.json +66 -0
  17. package/template/myapp/contract/contract.ts +8 -0
  18. package/template/myapp/dotnet/Directory.Build.props +10 -0
  19. package/template/myapp/dotnet/MyApp.Contract/Generated/Dispatcher.Generated.vb +30 -0
  20. package/template/myapp/dotnet/MyApp.Contract/Generated/Dto.vb +39 -0
  21. package/template/myapp/dotnet/MyApp.Contract/Generated/Events.vb +32 -0
  22. package/template/myapp/dotnet/MyApp.Contract/Generated/Interfaces.vb +20 -0
  23. package/template/myapp/dotnet/MyApp.Contract/MyApp.Contract.vbproj +9 -0
  24. package/template/myapp/dotnet/MyApp.Contract/Runtime/Dispatcher.vb +151 -0
  25. package/template/myapp/dotnet/MyApp.Contract/Runtime/IBridgeEmitter.vb +22 -0
  26. package/template/myapp/dotnet/MyApp.Contract/Runtime/JsonRpc.vb +130 -0
  27. package/template/myapp/dotnet/MyApp.Host/Bridge/WebViewBridge.vb +106 -0
  28. package/template/myapp/dotnet/MyApp.Host/MainForm.vb +90 -0
  29. package/template/myapp/dotnet/MyApp.Host/MyApp.Host.vbproj +28 -0
  30. package/template/myapp/dotnet/MyApp.Host/Program.vb +12 -0
  31. package/template/myapp/dotnet/MyApp.Impl/CustomersApi.vb +38 -0
  32. package/template/myapp/dotnet/MyApp.Impl/MyApp.Impl.vbproj +9 -0
  33. package/template/myapp/dotnet/MyApp.sln +34 -0
  34. package/template/myapp/package.json +16 -0
  35. package/template/myapp/pnpm-workspace.yaml +6 -0
  36. package/template/myapp/web/index.html +13 -0
  37. package/template/myapp/web/package.json +23 -0
  38. package/template/myapp/web/src/bridge.ts +29 -0
  39. package/template/myapp/web/src/generated/contract-types.ts +33 -0
  40. package/template/myapp/web/src/main.tsx +37 -0
  41. package/template/myapp/web/src/vite-env.d.ts +6 -0
  42. package/template/myapp/web/tsconfig.json +8 -0
  43. package/template/myapp/web/vite.config.ts +17 -0
  44. package/template/myapp/webview2-bridge.gen.json +11 -0
package/README.md CHANGED
@@ -20,6 +20,18 @@ pnpm add -D @ishibashi0112/webview2-bridge-gen zod
20
20
 
21
21
  Requires Node.js 20.19+ and zod 4.
22
22
 
23
+ ## Start a new app
24
+
25
+ ```sh
26
+ pnpm dlx @ishibashi0112/webview2-bridge-gen init my-app --name MyInventory
27
+ cd my-app && pnpm install && pnpm gen:check
28
+ ```
29
+
30
+ `init` writes a complete skeleton (31 files): the zod contract, a Vite + React app with a mock transport,
31
+ and three VB.NET projects (`<Name>.Contract` netstandard2.0, `<Name>.Impl` net48, `<Name>.Host` WinForms net48)
32
+ including the generated code and the bundled VB runtime. `--name` becomes the VB namespace / project names
33
+ (PascalCase; defaults to the directory name). The generated README walks through the dev loop and the Windows checks.
34
+
23
35
  ## Define the contract
24
36
 
25
37
  ```ts
package/dist/cli.js CHANGED
@@ -1,18 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
- import { generate } from "./generate.js";
5
- import { GenerateError } from "./schema.js";
6
4
  const DEFAULT_CONFIG = "webview2-bridge.gen.json";
7
5
  function usage() {
8
- console.error(`Usage: webview2-bridge-gen [--config <file>] [--cwd <dir>] [--check]
6
+ console.error(`Usage:
7
+ webview2-bridge-gen [--config <file>] [--cwd <dir>] [--check]
8
+ webview2-bridge-gen init <dir> [--name <AppName>] [--force]
9
9
 
10
+ generate(既定):
10
11
  --config 設定ファイル(既定: ./${DEFAULT_CONFIG})
11
12
  --cwd 設定ファイル内の相対パスの基準(既定: 設定ファイルのあるディレクトリ)
12
- --check 書き込まず、生成物が最新かだけを確認する(差分があれば exit 1)`);
13
+ --check 書き込まず、生成物が最新かだけを確認する(差分があれば exit 1
14
+
15
+ init: 新規アプリの骨組み(contract / web / dotnet の 3 プロジェクト)を <dir> に書き出す
16
+ --name アプリ名(PascalCase。VB の名前空間・プロジェクト名になる。既定: <dir> の名前から生成)
17
+ --force <dir> にファイルがあっても書き込む`);
13
18
  process.exit(2);
14
19
  }
15
- async function main(argv) {
20
+ async function runGenerate(argv) {
16
21
  let configPath = DEFAULT_CONFIG;
17
22
  let cwd;
18
23
  let check = false;
@@ -31,6 +36,8 @@ async function main(argv) {
31
36
  usage();
32
37
  }
33
38
  }
39
+ // generate は tsx / zod を読み込むので、init だけのときは読み込まない
40
+ const { generate } = await import("./generate.js");
34
41
  const absConfig = path.resolve(configPath);
35
42
  const config = JSON.parse(await readFile(absConfig, "utf8"));
36
43
  const base = cwd ? path.resolve(cwd) : path.dirname(absConfig);
@@ -48,7 +55,56 @@ async function main(argv) {
48
55
  console.log(result.files.map((f) => `wrote ${rel(f)}`).join("\n"));
49
56
  return 0;
50
57
  }
51
- main(process.argv.slice(2)).then((code) => process.exit(code), (err) => {
58
+ async function runInit(argv) {
59
+ let dir;
60
+ let name;
61
+ let force = false;
62
+ for (let i = 0; i < argv.length; i++) {
63
+ const a = argv[i];
64
+ if (a === "--name")
65
+ name = argv[++i] ?? usage();
66
+ else if (a === "--force")
67
+ force = true;
68
+ else if (a === "-h" || a === "--help")
69
+ usage();
70
+ else if (a.startsWith("-")) {
71
+ console.error(`Unknown argument: ${a}`);
72
+ usage();
73
+ }
74
+ else if (dir === undefined)
75
+ dir = a;
76
+ else {
77
+ console.error(`Unexpected argument: ${a}`);
78
+ usage();
79
+ }
80
+ }
81
+ if (dir === undefined)
82
+ usage();
83
+ const { scaffold, defaultAppName } = await import("./init.js");
84
+ const targetDir = path.resolve(dir);
85
+ const appName = name ?? defaultAppName(path.basename(targetDir));
86
+ const result = await scaffold({ targetDir, name: appName, force });
87
+ console.log(result.files.map((f) => `wrote ${f}`).join("\n"));
88
+ console.log(`
89
+ Created ${appName} in ${targetDir} (${result.files.length} files).
90
+
91
+ Next:
92
+ cd ${dir}
93
+ pnpm install # esbuild の postinstall 許可は pnpm-workspace.yaml に設定済み
94
+ pnpm gen:check # 生成物が同梱版と一致することを確認(契約を変えたら pnpm gen)
95
+ pnpm dev # http://localhost:5173 をブラウザで開く(MemoryTransport のモック)
96
+ # Windows: set WEBVIEW2_BRIDGE_DEV_URL=http://localhost:5173 && dotnet run --project dotnet/${appName}.Host
97
+
98
+ See README.md in the new directory for the full walkthrough.`);
99
+ return 0;
100
+ }
101
+ async function main(argv) {
102
+ if (argv[0] === "init")
103
+ return runInit(argv.slice(1));
104
+ return runGenerate(argv);
105
+ }
106
+ main(process.argv.slice(2)).then((code) => process.exit(code), async (err) => {
107
+ const { GenerateError } = await import("./schema.js");
52
108
  if (err instanceof GenerateError) {
53
109
  console.error(`webview2-bridge-gen: ${err.message}`);
54
110
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -44,4 +44,5 @@ export declare function generate(config: GenerateConfig, opts: {
44
44
  check?: boolean;
45
45
  }): Promise<GenerateResult>;
46
46
  export { emitVbRuntime, genPackageVersion, VB_RUNTIME_FILES, type VbRuntimeKind } from "./vb-runtime.js";
47
+ export { scaffold, defaultAppName, validateAppName, bundledTemplateDir, TEMPLATE_NAME, type ScaffoldOptions, type ScaffoldResult } from "./init.js";
47
48
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;IACxC,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,GAAG;QACxC;;;;WAIG;QACH,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B;;;WAGG;QACH,QAAQ,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,wCAAwC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,yCAAyC;AACzC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAqDtH;AAwCD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;IACxC,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,GAAG;QACxC;;;;WAIG;QACH,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B;;;WAGG;QACH,QAAQ,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,wCAAwC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,yCAAyC;AACzC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAqDtH;AAwCD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC"}
package/dist/generate.js CHANGED
@@ -100,4 +100,5 @@ async function removeStaleGenerated(dir, ext, keep) {
100
100
  }
101
101
  }
102
102
  export { emitVbRuntime, genPackageVersion, VB_RUNTIME_FILES } from "./vb-runtime.js";
103
+ export { scaffold, defaultAppName, validateAppName, bundledTemplateDir, TEMPLATE_NAME } from "./init.js";
103
104
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ /** テンプレート内のプレースホルダ */
2
+ export declare const TEMPLATE_NAME = "MyApp";
3
+ export interface ScaffoldOptions {
4
+ /** 書き出し先ディレクトリ(無ければ作る。既にファイルがあれば force なしではエラー) */
5
+ targetDir: string;
6
+ /** アプリ名(PascalCase 推奨。VB の名前空間になるので識別子として妥当なこと) */
7
+ name: string;
8
+ /** 既存ファイルがあっても上書きする */
9
+ force?: boolean;
10
+ /** テンプレートの場所(既定: パッケージ同梱の template/myapp/) */
11
+ templateDir?: string;
12
+ }
13
+ export interface ScaffoldResult {
14
+ /** 書き出したファイル(targetDir からの相対パス、"/" 区切り) */
15
+ files: string[];
16
+ /** 置換後のアプリ名 */
17
+ name: string;
18
+ }
19
+ /** アプリ名として使えるか(VB の名前空間の 1 セグメントになる) */
20
+ export declare function validateAppName(name: string): void;
21
+ /** ディレクトリ名から既定のアプリ名を作る(inventory-app → InventoryApp) */
22
+ export declare function defaultAppName(dirName: string): string;
23
+ /** 同梱テンプレートのディレクトリ(src/ からも dist/ からも ../template/myapp) */
24
+ export declare function bundledTemplateDir(): string;
25
+ /** テンプレートをコピーしてアプリ名に置換する */
26
+ export declare function scaffold(options: ScaffoldOptions): Promise<ScaffoldResult>;
27
+ /**
28
+ * .sln の `Project("{種別GUID}") = "名前", "パス", "{プロジェクトGUID}"` からプロジェクト GUID を集め、
29
+ * 新しい GUID に置き換える(ProjectConfigurationPlatforms 等の参照箇所も同じ置換で追従する)
30
+ */
31
+ export declare function renewProjectGuids(sln: string): string;
32
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,sBAAsB;AACtB,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wCAAwC;AACxC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASlD;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,4BAA4B;AAC5B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAuBhF;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQrD"}
package/dist/init.js ADDED
@@ -0,0 +1,93 @@
1
+ /**
2
+ * `webview2-bridge-gen init`: 同梱テンプレート(template/myapp/ = リポジトリの templates/myapp/ のコピー)を
3
+ * コピーし、プレースホルダ `MyApp` / `myapp` をアプリ名に置換して新規アプリの骨組みを書き出す。
4
+ *
5
+ * - `MyApp`(PascalCase): VB の名前空間・プロジェクト名・アセンブリ名・Form のタイトル・LocalAppData のフォルダ名
6
+ * - `myapp`(小文字): package.json の name
7
+ * - .sln のプロジェクト GUID は新しく振り直す(プロジェクト種別 GUID は変えない)
8
+ * - `_gitignore` は `.gitignore` に戻す(npm pack が .gitignore を改名するため同梱時は別名)
9
+ *
10
+ * Node 固有(fs)なので index.ts からは export しない(generate と同じ entry)。
11
+ */
12
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
13
+ import { randomUUID } from "node:crypto";
14
+ import path from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ import { GenerateError } from "./schema.js";
17
+ /** テンプレート内のプレースホルダ */
18
+ export const TEMPLATE_NAME = "MyApp";
19
+ const NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
20
+ /** アプリ名として使えるか(VB の名前空間の 1 セグメントになる) */
21
+ export function validateAppName(name) {
22
+ if (!NAME_PATTERN.test(name)) {
23
+ throw new GenerateError(`invalid app name "${name}": use letters, digits and underscores only, starting with a letter (e.g. InventoryApp)`);
24
+ }
25
+ if (name === TEMPLATE_NAME) {
26
+ throw new GenerateError(`app name "${TEMPLATE_NAME}" is the template placeholder; choose another name`);
27
+ }
28
+ }
29
+ /** ディレクトリ名から既定のアプリ名を作る(inventory-app → InventoryApp) */
30
+ export function defaultAppName(dirName) {
31
+ const pascal = dirName
32
+ .split(/[^A-Za-z0-9]+/)
33
+ .filter((s) => s.length > 0)
34
+ .map((s) => s[0].toUpperCase() + s.slice(1))
35
+ .join("");
36
+ return /^[0-9]/.test(pascal) ? `App${pascal}` : pascal;
37
+ }
38
+ /** 同梱テンプレートのディレクトリ(src/ からも dist/ からも ../template/myapp) */
39
+ export function bundledTemplateDir() {
40
+ return fileURLToPath(new URL("../template/myapp/", import.meta.url));
41
+ }
42
+ /** テンプレートをコピーしてアプリ名に置換する */
43
+ export async function scaffold(options) {
44
+ const { name } = options;
45
+ validateAppName(name);
46
+ const templateDir = options.templateDir ?? bundledTemplateDir();
47
+ const targetDir = path.resolve(options.targetDir);
48
+ const existing = await readdir(targetDir).catch(() => null);
49
+ if (existing !== null && existing.length > 0 && !options.force) {
50
+ throw new GenerateError(`${targetDir} is not empty (use --force to write into it anyway)`);
51
+ }
52
+ const rename = (s) => s.replaceAll(TEMPLATE_NAME, name).replaceAll(TEMPLATE_NAME.toLowerCase(), name.toLowerCase());
53
+ const files = [];
54
+ for (const rel of await listFiles(templateDir)) {
55
+ const outRel = rename(rel === "_gitignore" ? ".gitignore" : rel);
56
+ let content = rename(await readFile(path.join(templateDir, rel), "utf8"));
57
+ if (outRel.endsWith(".sln"))
58
+ content = renewProjectGuids(content);
59
+ const target = path.join(targetDir, ...outRel.split("/"));
60
+ await mkdir(path.dirname(target), { recursive: true });
61
+ await writeFile(target, content, "utf8");
62
+ files.push(outRel);
63
+ }
64
+ return { files, name };
65
+ }
66
+ async function listFiles(root) {
67
+ const out = [];
68
+ const walk = async (dir) => {
69
+ for (const e of await readdir(dir, { withFileTypes: true })) {
70
+ const full = path.join(dir, e.name);
71
+ if (e.isDirectory())
72
+ await walk(full);
73
+ else
74
+ out.push(path.relative(root, full).split(path.sep).join("/"));
75
+ }
76
+ };
77
+ await walk(root);
78
+ return out.sort();
79
+ }
80
+ /**
81
+ * .sln の `Project("{種別GUID}") = "名前", "パス", "{プロジェクトGUID}"` からプロジェクト GUID を集め、
82
+ * 新しい GUID に置き換える(ProjectConfigurationPlatforms 等の参照箇所も同じ置換で追従する)
83
+ */
84
+ export function renewProjectGuids(sln) {
85
+ const projectLine = /^Project\("\{[0-9A-Fa-f-]+\}"\)\s*=\s*"[^"]*",\s*"[^"]*",\s*"\{([0-9A-Fa-f-]+)\}"/gm;
86
+ let out = sln;
87
+ for (const m of sln.matchAll(projectLine)) {
88
+ const oldGuid = m[1];
89
+ out = out.replaceAll(`{${oldGuid}}`, `{${randomUUID().toUpperCase()}}`);
90
+ }
91
+ return out;
92
+ }
93
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ishibashi0112/webview2-bridge-gen",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "zod contract -> JSON Schema -> TypeScript types + VB.NET DTO / Interface / Dispatcher generator for WinForms (.NET Framework 4.8) + WebView2 + Vite/React apps",
5
5
  "keywords": [
6
6
  "webview2",
@@ -45,6 +45,7 @@
45
45
  "files": [
46
46
  "dist",
47
47
  "vb-runtime",
48
+ "template",
48
49
  "README.md",
49
50
  "LICENSE"
50
51
  ],
@@ -64,10 +65,12 @@
64
65
  "zod": "^4.5.4"
65
66
  },
66
67
  "scripts": {
67
- "build": "pnpm sync:vb-runtime && node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
68
+ "build": "pnpm sync && node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
68
69
  "gen": "tsx src/cli.ts",
69
70
  "test": "vitest run",
70
71
  "typecheck": "tsc --noEmit -p tsconfig.json",
71
- "sync:vb-runtime": "node scripts/sync-vb-runtime.mjs"
72
+ "sync": "pnpm sync:vb-runtime && pnpm sync:template",
73
+ "sync:vb-runtime": "node scripts/sync-vb-runtime.mjs",
74
+ "sync:template": "node scripts/sync-template.mjs"
72
75
  }
73
76
  }
@@ -0,0 +1,10 @@
1
+ # template
2
+
3
+ 新規アプリの雛形 `myapp/` のコピー。**手で編集しない。**
4
+
5
+ 唯一の正はリポジトリの `templates/myapp/`。
6
+ `pnpm --filter @ishibashi0112/webview2-bridge-gen sync:template`(`pnpm build` でも自動実行)でここへコピーされ、
7
+ npm パッケージに同梱される。`init.test.ts` が templates/ と一致していることを検証する。
8
+
9
+ `webview2-bridge-gen init <dir> --name <AppName>` がこれをコピーし、`MyApp` / `myapp` をアプリ名に置換して書き出す。
10
+ `.gitignore` は npm pack が改名してしまうので `_gitignore` として同梱し、init が `.gitignore` に戻す。
@@ -0,0 +1,91 @@
1
+ # MyApp — webview2-bridge を使う新規アプリの雛形
2
+
3
+ 公開済みの npm(`@ishibashi0112/webview2-bridge-gen` / `-client`)だけで成立する最小構成。
4
+ `pnpm dlx @ishibashi0112/webview2-bridge-gen init <dir> --name <AppName>` がこのフォルダをコピーし、`MyApp` を指定名に置換して書き出す
5
+ (手でコピーして `MyApp` を置換しても同じ)。
6
+ NuGet は Newtonsoft.Json と Microsoft.Web.WebView2 の 2 つしか使わない。
7
+
8
+ ```
9
+ myapp/
10
+ package.json # pnpm スクリプト(gen / gen:check / dev / build:web)
11
+ pnpm-workspace.yaml # web を workspace に。esbuild の postinstall 許可(必須)
12
+ webview2-bridge.gen.json # ジェネレータ設定(出力先・名前空間)
13
+ contract/contract.ts # zod による契約(唯一の正)。手で書く
14
+ contract/contract.schema.json# 生成
15
+ web/ # Vite + React。src/bridge.ts(transport 選択とモック)と src/main.tsx を手で書く
16
+ src/generated/ # 生成(TS 型)
17
+ dotnet/
18
+ Directory.Build.props # Option Strict On 等の共通設定
19
+ MyApp.sln
20
+ MyApp.Contract/ # netstandard2.0。Generated/ と Runtime/ は生成。手で書くものは無い
21
+ MyApp.Impl/ # net48。IXxxApi の実装を手で書く(DB / サーバーアクセスはここ)
22
+ MyApp.Host/ # net48 WinForms exe。MainForm.vb / Program.vb を手で書く。Bridge/ は生成
23
+ ```
24
+
25
+ 手で書くファイルは 5 つ: `contract.ts`、`bridge.ts`、`main.tsx`、`CustomersApi.vb`、`MainForm.vb`。
26
+ 残りは生成物か、一度置いたら触らない設定ファイル。
27
+
28
+ ## 前提ツール
29
+
30
+ | ツール | 用途 | 備考 |
31
+ |---|---|---|
32
+ | Node.js 22 以上 + pnpm 11(Corepack) | 生成、フロント開発 | `corepack enable` で pnpm が入る |
33
+ | .NET SDK 8 以上 | `dotnet build` / `dotnet run` | VS 2022 17.8 以降に同梱。VS 無しなら SDK 単体でよい |
34
+ | WebView2 Runtime | 実行 | Windows 11 は標準搭載 |
35
+ | Visual Studio 2022 | **任意**。フォームデザイナと GUI デバッガが要るときだけ | 「.NET デスクトップ開発」ワークロード |
36
+
37
+ ## 初回
38
+
39
+ ```sh
40
+ pnpm install # esbuild の postinstall 許可は pnpm-workspace.yaml に設定済み
41
+ pnpm gen # contract.ts → schema → TS 型 / VB 生成物 / VB ランタイム / WebViewBridge(10 ファイル)
42
+ pnpm dev # http://localhost:5173 をブラウザで開く。MemoryTransport のモックで動く
43
+ ```
44
+
45
+ Windows で実機(WebView2 内で VB と往復):
46
+
47
+ ```bat
48
+ set WEBVIEW2_BRIDGE_DEV_URL=http://localhost:5173
49
+ dotnet run --project dotnet/MyApp.Host
50
+ ```
51
+
52
+ PowerShell は `$env:WEBVIEW2_BRIDGE_DEV_URL="http://localhost:5173"`。バッジが `transport: webview2` になり、
53
+ `customers.list` で VB 側 `CustomersApi` の結果と progress が表示されれば OK。F12 で DevTools。
54
+
55
+ 配布形態(環境変数なし):
56
+
57
+ ```sh
58
+ pnpm build:web # → web/dist
59
+ dotnet build dotnet/MyApp.sln -c Release # dist を bin/Release/net48/wwwroot にコピーする
60
+ ```
61
+
62
+ `bin/Release/net48/MyApp.exe` を起動すると `https://app.local/index.html` から wwwroot が読まれる。
63
+ 配布するのは `bin/Release/net48/` 一式(wwwroot を含む)。
64
+
65
+ ## 日々のループ(API を 1 つ足す)
66
+
67
+ 1. `contract/contract.ts` にメソッドを足す
68
+ 2. `pnpm gen`(CI では `pnpm gen:check`)
69
+ 3. `web/src/bridge.ts` のモックに同じメソッドを足し、画面を作る(ブラウザだけで進む)
70
+ 4. `dotnet/MyApp.Impl/` に実装を書く。新しい namespace を足したら `MainForm.vb` の `dispatcher.Register(...)` も 1 行足す
71
+ 5. Windows で `dotnet run` して実機確認
72
+
73
+ ## Visual Studio はいつ要るか
74
+
75
+ ビルド・実行・生成はすべて VS 無し(VS Code + ターミナル)で進められる。VS を開くのは次のときだけ。
76
+
77
+ - **フォームデザイナ**で WinForms の部品(メニュー、NotifyIcon、ツールバー等)を置きたいとき。
78
+ この雛形の `MainForm.vb` はコードだけで WebView2 を Dock=Fill しているので、デザイナ無しで完結している
79
+ - VB 側に**ブレークポイント**を張って GUI デバッガで追いたいとき(`Debug.WriteLine` と WebView2 の DevTools で足りることが多い)
80
+ - 既存の旧スタイル .vbproj を含む**最終ビルド**(旧プロジェクトから Host を参照する等)
81
+
82
+ VS で開く場合は `dotnet/MyApp.sln` をそのまま開ける(SDK スタイル .vbproj)。
83
+
84
+ ## 注意
85
+
86
+ - `MyApp.Host.vbproj` の `<PlatformTarget>x64</PlatformTarget>` を消して AnyCPU にしない。Windows の `dotnet build` で WebView2 のローダーが x86 だけになり、起動時に `BadImageFormatException` になる。32 ビット専用の DB ドライバ等が要るなら `x86` にする
87
+ - `pnpm-workspace.yaml` の `allowBuilds: { esbuild: true }` を消さない。pnpm 11 は postinstall を既定で止めるため、無いと gen が動かない
88
+ - `webview2-bridge.gen.json` の `ts.contractImport` は **生成ファイル(web/src/generated/)から見た相対パス**
89
+ - 生成物(`Generated/`、`Runtime/`、`Bridge/`、`web/src/generated/`、`contract.schema.json`)は手で編集しない。コミットはする
90
+ - ランタイムを上げるときは gen のバージョンを上げて `pnpm gen` を再実行する(`Runtime/` と `Bridge/` が更新される)
91
+ - 日付は ISO 8601 文字列で往復する。union / z.date 等は契約に使えない(gen がエラーで止める)
@@ -0,0 +1,6 @@
1
+ node_modules/
2
+ dist/
3
+ bin/
4
+ obj/
5
+ .vs/
6
+ *.user
@@ -0,0 +1,66 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "contractVersion": 1,
4
+ "$defs": {
5
+ "Customer": {
6
+ "type": "object",
7
+ "properties": {
8
+ "id": {
9
+ "type": "string"
10
+ },
11
+ "name": {
12
+ "type": "string"
13
+ }
14
+ },
15
+ "required": [
16
+ "id",
17
+ "name"
18
+ ],
19
+ "additionalProperties": false
20
+ }
21
+ },
22
+ "methods": {
23
+ "customers": {
24
+ "list": {
25
+ "input": {
26
+ "type": "object",
27
+ "properties": {
28
+ "keyword": {
29
+ "type": "string"
30
+ }
31
+ },
32
+ "additionalProperties": false
33
+ },
34
+ "output": {
35
+ "type": "object",
36
+ "properties": {
37
+ "items": {
38
+ "type": "array",
39
+ "items": {
40
+ "$ref": "#/$defs/Customer"
41
+ }
42
+ }
43
+ },
44
+ "required": [
45
+ "items"
46
+ ],
47
+ "additionalProperties": false
48
+ }
49
+ }
50
+ }
51
+ },
52
+ "events": {
53
+ "progress": {
54
+ "type": "object",
55
+ "properties": {
56
+ "percent": {
57
+ "type": "number"
58
+ }
59
+ },
60
+ "required": [
61
+ "percent"
62
+ ],
63
+ "additionalProperties": false
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import { defineContract } from "@ishibashi0112/webview2-bridge-gen";
3
+ const Customer = z.object({ id: z.string(), name: z.string() }).meta({ id: "Customer" });
4
+ export const contract = defineContract({
5
+ methods: { customers: { list: { input: z.object({ keyword: z.string().optional() }), output: z.object({ items: z.array(Customer) }) } } },
6
+ events: { progress: z.object({ percent: z.number() }) },
7
+ });
8
+ export type Contract = typeof contract;
@@ -0,0 +1,10 @@
1
+ <Project>
2
+ <PropertyGroup>
3
+ <OptionStrict>On</OptionStrict>
4
+ <OptionExplicit>On</OptionExplicit>
5
+ <OptionInfer>On</OptionInfer>
6
+ <LangVersion>16.9</LangVersion>
7
+ <MyType Condition="'$(OutputType)' != 'WinExe'">Empty</MyType>
8
+ <EnableWindowsTargeting Condition="'$(OS)' != 'Windows_NT'">true</EnableWindowsTargeting>
9
+ </PropertyGroup>
10
+ </Project>
@@ -0,0 +1,30 @@
1
+ ' <auto-generated>
2
+ ' This code was generated by @ishibashi0112/webview2-bridge-gen from contract.schema.json.
3
+ ' DO NOT EDIT. Changes will be lost when `pnpm gen` runs.
4
+ ' </auto-generated>
5
+ Option Strict On
6
+ Option Explicit On
7
+ Option Infer On
8
+
9
+ Imports System
10
+ Imports System.Runtime.CompilerServices
11
+ Imports WebView2Bridge.Runtime
12
+
13
+ Namespace Global.MyApp.Contract
14
+
15
+ ''' <summary>契約の実装を Dispatcher に登録する拡張メソッド。dispatcher.Register(api) と書ける</summary>
16
+ Public Module DispatcherExtensions
17
+
18
+ ''' <summary>契約に含まれる全メソッド名</summary>
19
+ Public ReadOnly MethodNames As String() = {"customers.list"}
20
+
21
+ ''' <summary>"customers.*" の実装を登録する</summary>
22
+ <Extension>
23
+ Public Sub Register(dispatcher As Dispatcher, api As ICustomersApi)
24
+ If dispatcher Is Nothing Then Throw New ArgumentNullException(NameOf(dispatcher))
25
+ If api Is Nothing Then Throw New ArgumentNullException(NameOf(api))
26
+ dispatcher.RegisterHandler(Of CustomersListRequest, CustomersListResponse)("customers.list", AddressOf api.List)
27
+ End Sub
28
+ End Module
29
+
30
+ End Namespace
@@ -0,0 +1,39 @@
1
+ ' <auto-generated>
2
+ ' This code was generated by @ishibashi0112/webview2-bridge-gen from contract.schema.json.
3
+ ' DO NOT EDIT. Changes will be lost when `pnpm gen` runs.
4
+ ' </auto-generated>
5
+ Option Strict On
6
+ Option Explicit On
7
+ Option Infer On
8
+
9
+ Imports System
10
+ Imports System.Collections.Generic
11
+ Imports Newtonsoft.Json
12
+ Imports Newtonsoft.Json.Linq
13
+
14
+ Namespace Global.MyApp.Contract
15
+
16
+ Public Class Customer
17
+ <JsonProperty("id")>
18
+ Public Property Id As String
19
+
20
+ <JsonProperty("name")>
21
+ Public Property Name As String
22
+ End Class
23
+
24
+ Public Class CustomersListRequest
25
+ <JsonProperty("keyword", NullValueHandling:=NullValueHandling.Ignore)>
26
+ Public Property Keyword As String
27
+ End Class
28
+
29
+ Public Class CustomersListResponse
30
+ <JsonProperty("items")>
31
+ Public Property Items As List(Of Customer) = New List(Of Customer)()
32
+ End Class
33
+
34
+ Public Class ProgressEvent
35
+ <JsonProperty("percent")>
36
+ Public Property Percent As Double
37
+ End Class
38
+
39
+ End Namespace