@ishibashi0112/webview2-bridge-gen 0.2.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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +60 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/define.d.ts +19 -0
  8. package/dist/define.d.ts.map +1 -0
  9. package/dist/define.js +8 -0
  10. package/dist/define.js.map +1 -0
  11. package/dist/emit-ts.d.ts +15 -0
  12. package/dist/emit-ts.d.ts.map +1 -0
  13. package/dist/emit-ts.js +113 -0
  14. package/dist/emit-ts.js.map +1 -0
  15. package/dist/emit-vb.d.ts +22 -0
  16. package/dist/emit-vb.d.ts.map +1 -0
  17. package/dist/emit-vb.js +467 -0
  18. package/dist/emit-vb.js.map +1 -0
  19. package/dist/emitted.d.ts +6 -0
  20. package/dist/emitted.d.ts.map +1 -0
  21. package/dist/emitted.js +2 -0
  22. package/dist/emitted.js.map +1 -0
  23. package/dist/generate.d.ts +47 -0
  24. package/dist/generate.d.ts.map +1 -0
  25. package/dist/generate.js +103 -0
  26. package/dist/generate.js.map +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/naming.d.ts +8 -0
  32. package/dist/naming.d.ts.map +1 -0
  33. package/dist/naming.js +42 -0
  34. package/dist/naming.js.map +1 -0
  35. package/dist/schema.d.ts +45 -0
  36. package/dist/schema.d.ts.map +1 -0
  37. package/dist/schema.js +21 -0
  38. package/dist/schema.js.map +1 -0
  39. package/dist/to-schema.d.ts +10 -0
  40. package/dist/to-schema.d.ts.map +1 -0
  41. package/dist/to-schema.js +75 -0
  42. package/dist/to-schema.js.map +1 -0
  43. package/dist/vb-runtime.d.ts +12 -0
  44. package/dist/vb-runtime.d.ts.map +1 -0
  45. package/dist/vb-runtime.js +50 -0
  46. package/dist/vb-runtime.js.map +1 -0
  47. package/package.json +73 -0
  48. package/vb-runtime/README.md +10 -0
  49. package/vb-runtime/runtime/Dispatcher.vb +145 -0
  50. package/vb-runtime/runtime/IBridgeEmitter.vb +16 -0
  51. package/vb-runtime/runtime/JsonRpc.vb +124 -0
  52. package/vb-runtime/winforms/WebViewBridge.vb +100 -0
@@ -0,0 +1,103 @@
1
+ import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { tsImport } from "tsx/esm/api";
5
+ import { emitTs } from "./emit-ts.js";
6
+ import { emitVb } from "./emit-vb.js";
7
+ import { GenerateError } from "./schema.js";
8
+ import { toSchema } from "./to-schema.js";
9
+ import { emitVbRuntime } from "./vb-runtime.js";
10
+ const AUTO_GENERATED_MARK = "<auto-generated>";
11
+ /** 契約を読み込み、schema → TS → VB を生成して書き出す */
12
+ export async function generate(config, opts) {
13
+ const abs = (p) => path.resolve(opts.cwd, p);
14
+ const contract = await loadContract(abs(config.contract), config.contractExport ?? "contract");
15
+ const schema = toSchema(contract);
16
+ const outputs = [];
17
+ outputs.push({
18
+ dir: path.dirname(abs(config.schemaOut)),
19
+ ext: ".json",
20
+ files: [{ path: path.basename(config.schemaOut), content: JSON.stringify(schema, null, 2) + "\n" }],
21
+ });
22
+ if (config.ts) {
23
+ const { outDir, ...tsOpts } = config.ts;
24
+ outputs.push({ dir: abs(outDir), ext: ".ts", files: emitTs(schema, tsOpts) });
25
+ }
26
+ if (config.vb) {
27
+ const { outDir, runtime, winforms, ...vbOpts } = config.vb;
28
+ outputs.push({ dir: abs(outDir), ext: ".vb", files: emitVb(schema, vbOpts) });
29
+ if (runtime)
30
+ outputs.push({ dir: abs(runtime.outDir), ext: ".vb", files: await emitVbRuntime("runtime") });
31
+ if (winforms)
32
+ outputs.push({ dir: abs(winforms.outDir), ext: ".vb", files: await emitVbRuntime("winforms") });
33
+ }
34
+ // 同じディレクトリに複数の出力(例: Generated/ にランタイムも置く)があっても、互いのファイルを消さないよう
35
+ // ディレクトリ単位で「今回出力するファイル」をまとめてから古い生成物を消す
36
+ const keepByDir = new Map();
37
+ for (const o of outputs) {
38
+ const entry = keepByDir.get(o.dir) ?? { ext: o.ext, keep: new Set() };
39
+ for (const f of o.files)
40
+ entry.keep.add(f.path);
41
+ keepByDir.set(o.dir, entry);
42
+ }
43
+ const files = [];
44
+ const stale = [];
45
+ if (!opts.check) {
46
+ for (const [dir, entry] of keepByDir) {
47
+ await mkdir(dir, { recursive: true });
48
+ await removeStaleGenerated(dir, entry.ext, entry.keep);
49
+ }
50
+ }
51
+ for (const o of outputs) {
52
+ for (const f of o.files) {
53
+ const target = path.join(o.dir, f.path);
54
+ files.push(target);
55
+ if (opts.check) {
56
+ const current = await readFile(target, "utf8").catch(() => null);
57
+ // Windows の Git(core.autocrlf=true)が CRLF に変えていても「最新」と判定する。比較は改行を正規化して行う
58
+ if (current === null || normalizeEol(current) !== normalizeEol(f.content))
59
+ stale.push(target);
60
+ }
61
+ else {
62
+ await writeFile(target, f.content, "utf8");
63
+ }
64
+ }
65
+ }
66
+ return { schema, files, stale };
67
+ }
68
+ /**
69
+ * 契約モジュール(.ts)を読み込む。
70
+ * 公開パッケージは JS として実行されるので、TypeScript の契約は tsx の API で変換しながら import する
71
+ * (利用側のアプリに tsx を要求しない。tsx はこのパッケージの dependency)。
72
+ */
73
+ function normalizeEol(text) {
74
+ return text.replace(/\r\n/g, "\n");
75
+ }
76
+ async function loadContract(file, exportName) {
77
+ const mod = (await tsImport(pathToFileURL(file).href, import.meta.url));
78
+ const c = mod[exportName];
79
+ if (!isContractDef(c)) {
80
+ throw new GenerateError(`${file} does not export "${exportName}" created by defineContract()`);
81
+ }
82
+ return c;
83
+ }
84
+ function isContractDef(v) {
85
+ return (typeof v === "object" &&
86
+ v !== null &&
87
+ typeof v.methods === "object" &&
88
+ typeof v.events === "object");
89
+ }
90
+ /** 以前の生成物(auto-generated ヘッダ付き)のうち、今回出力しないものを消す */
91
+ async function removeStaleGenerated(dir, ext, keep) {
92
+ const entries = await readdir(dir, { withFileTypes: true });
93
+ for (const e of entries) {
94
+ if (!e.isFile() || !e.name.endsWith(ext) || keep.has(e.name))
95
+ continue;
96
+ const full = path.join(dir, e.name);
97
+ const head = (await readFile(full, "utf8")).slice(0, 400);
98
+ if (head.includes(AUTO_GENERATED_MARK))
99
+ await rm(full);
100
+ }
101
+ }
102
+ export { emitVbRuntime, genPackageVersion, VB_RUNTIME_FILES } from "./vb-runtime.js";
103
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiChD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAsB,EAAE,IAAsC;IAC3F,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAElC,MAAM,OAAO,GAAyD,EAAE,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC;QACX,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;KACpG,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9E,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3G,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,8DAA8D;IAC9D,uCAAuC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8C,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;QAC9E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACjE,yEAAyE;gBACzE,IAAI,OAAO,KAAK,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,UAAkB;IAC1D,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAA4B,CAAC;IACnG,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,qBAAqB,UAAU,+BAA+B,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,OAAQ,CAAiB,CAAC,OAAO,KAAK,QAAQ;QAC9C,OAAQ,CAAiB,CAAC,MAAM,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,GAAW,EAAE,IAAiB;IAC7E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAsB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { defineContract, type ContractDef, type MethodDef, type NamespaceDef } from "./define.js";
2
+ export { toSchema } from "./to-schema.js";
3
+ export { emitTs, type EmitTsOptions } from "./emit-ts.js";
4
+ export { emitVb, type EmitVbOptions } from "./emit-vb.js";
5
+ export type { EmittedFile } from "./emitted.js";
6
+ export { GenerateError, type ContractSchema, type JsonSchema, type MethodSchema } from "./schema.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // 契約モジュール(contract.ts)とブラウザ側から import される可能性があるため、
2
+ // ここからは Node 固有 API(fs 等)に依存するものを export しない。generate / cli は別 entry。
3
+ export { defineContract } from "./define.js";
4
+ export { toSchema } from "./to-schema.js";
5
+ export { emitTs } from "./emit-ts.js";
6
+ export { emitVb } from "./emit-vb.js";
7
+ export { GenerateError } from "./schema.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sEAAsE;AACtE,OAAO,EAAE,cAAc,EAAuD,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,aAAa,EAA2D,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** 識別子の整形と VB 予約語の回避 */
2
+ export declare function pascalCase(s: string): string;
3
+ export declare function camelCase(s: string): string;
4
+ /** 先頭が数字なら `_` を付け、識別子として成立させる */
5
+ export declare function toIdentifier(s: string): string;
6
+ export declare function vbEscape(identifier: string): string;
7
+ export declare function isTsReserved(identifier: string): boolean;
8
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED,kCAAkC;AAClC,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C;AAkBD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnD;AAQD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAExD"}
package/dist/naming.js ADDED
@@ -0,0 +1,42 @@
1
+ /** 識別子の整形と VB 予約語の回避 */
2
+ export function pascalCase(s) {
3
+ return s
4
+ .split(/[^A-Za-z0-9]+/)
5
+ .filter((w) => w.length > 0)
6
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
7
+ .join("");
8
+ }
9
+ export function camelCase(s) {
10
+ const p = pascalCase(s);
11
+ return p.charAt(0).toLowerCase() + p.slice(1);
12
+ }
13
+ /** 先頭が数字なら `_` を付け、識別子として成立させる */
14
+ export function toIdentifier(s) {
15
+ const p = pascalCase(s);
16
+ if (p.length === 0)
17
+ return "_";
18
+ return /^[0-9]/.test(p) ? `_${p}` : p;
19
+ }
20
+ // VB.NET の予約語(大文字小文字を区別しない)。プロパティ名等にぶつかったら [] で囲む
21
+ const VB_KEYWORDS = new Set(`AddHandler AddressOf Alias And AndAlso As Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate
22
+ CDbl CDec Char CInt Class CLng CObj Const Continue CSByte CShort CSng CStr CType CUInt CULng CUShort Date Decimal
23
+ Declare Default Delegate Dim DirectCast Do Double Each Else ElseIf End EndIf Enum Erase Error Event Exit False
24
+ Finally For Friend Function Get GetType GetXMLNamespace Global GoSub GoTo Handles If Implements Imports In
25
+ Inherits Integer Interface Is IsNot Let Lib Like Long Loop Me Mod Module MustInherit MustOverride MyBase MyClass
26
+ NameOf Namespace Narrowing New Next Not Nothing NotInheritable NotOverridable Object Of On Operator Option
27
+ Optional Or OrElse Out Overloads Overridable Overrides ParamArray Partial Private Property Protected Public
28
+ RaiseEvent ReadOnly ReDim REM RemoveHandler Resume Return SByte Select Set Shadows Shared Short Single Static
29
+ Step Stop String Structure Sub SyncLock Then Throw To True Try TryCast TypeOf UInteger ULong UShort Using
30
+ Variant Wend When While Widening With WithEvents WriteOnly Xor`
31
+ .split(/\s+/)
32
+ .map((k) => k.toLowerCase()));
33
+ export function vbEscape(identifier) {
34
+ return VB_KEYWORDS.has(identifier.toLowerCase()) ? `[${identifier}]` : identifier;
35
+ }
36
+ const TS_RESERVED = new Set(`break case catch class const continue debugger default delete do else enum export extends false finally for
37
+ function if import in instanceof new null return super switch this throw true try typeof var void while with
38
+ yield let static implements interface package private protected public await`.split(/\s+/));
39
+ export function isTsReserved(identifier) {
40
+ return TS_RESERVED.has(identifier);
41
+ }
42
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,CAAC;SACL,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,kDAAkD;AAClD,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB;;;;;;;;;+DAS6D;KAC1D,KAAK,CAAC,KAAK,CAAC;KACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC/B,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,UAAkB;IACzC,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AACpF,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB;;6EAE2E,CAAC,KAAK,CAAC,KAAK,CAAC,CACzF,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * contract.schema.json の形(ジェネレータの中間表現)。
3
+ * zod からここまで落とした後、エミッタは JSON Schema だけを読む。
4
+ */
5
+ /** JSON Schema(draft 2020-12)のうち、ジェネレータが解釈する部分 */
6
+ export interface JsonSchema {
7
+ $ref?: string;
8
+ type?: string | string[];
9
+ properties?: Record<string, JsonSchema>;
10
+ required?: string[];
11
+ additionalProperties?: boolean | JsonSchema;
12
+ propertyNames?: JsonSchema;
13
+ items?: JsonSchema;
14
+ enum?: unknown[];
15
+ const?: unknown;
16
+ anyOf?: JsonSchema[];
17
+ oneOf?: JsonSchema[];
18
+ allOf?: JsonSchema[];
19
+ format?: string;
20
+ description?: string;
21
+ title?: string;
22
+ default?: unknown;
23
+ [keyword: string]: unknown;
24
+ }
25
+ export interface MethodSchema {
26
+ input: JsonSchema;
27
+ output: JsonSchema;
28
+ }
29
+ export interface ContractSchema {
30
+ $schema: string;
31
+ /** ジェネレータの中間表現バージョン。互換性が壊れたら上げる */
32
+ contractVersion: 1;
33
+ /** zod の `.meta({ id })` が付いたスキーマ。`$ref: "#/$defs/<id>"` で参照される */
34
+ $defs: Record<string, JsonSchema>;
35
+ methods: Record<string, Record<string, MethodSchema>>;
36
+ events: Record<string, JsonSchema>;
37
+ }
38
+ export declare const DEFS_PREFIX = "#/$defs/";
39
+ export declare function refName(ref: string): string;
40
+ /** ジェネレータが対応していない契約に出会ったときのエラー。`path` は契約内の位置 */
41
+ export declare class GenerateError extends Error {
42
+ readonly path?: string | undefined;
43
+ constructor(message: string, path?: string | undefined);
44
+ }
45
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5C,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,eAAe,EAAE,CAAC,CAAC;IACnB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED,iDAAiD;AACjD,qBAAa,aAAc,SAAQ,KAAK;IACT,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;gBAAvC,OAAO,EAAE,MAAM,EAAW,IAAI,CAAC,EAAE,MAAM,YAAA;CAIpD"}
package/dist/schema.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * contract.schema.json の形(ジェネレータの中間表現)。
3
+ * zod からここまで落とした後、エミッタは JSON Schema だけを読む。
4
+ */
5
+ export const DEFS_PREFIX = "#/$defs/";
6
+ export function refName(ref) {
7
+ if (!ref.startsWith(DEFS_PREFIX)) {
8
+ throw new GenerateError(`Unsupported $ref "${ref}" (only "${DEFS_PREFIX}<id>" is supported)`);
9
+ }
10
+ return ref.slice(DEFS_PREFIX.length);
11
+ }
12
+ /** ジェネレータが対応していない契約に出会ったときのエラー。`path` は契約内の位置 */
13
+ export class GenerateError extends Error {
14
+ path;
15
+ constructor(message, path) {
16
+ super(path ? `${message} (at ${path})` : message);
17
+ this.path = path;
18
+ this.name = "GenerateError";
19
+ }
20
+ }
21
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,aAAa,CAAC,qBAAqB,GAAG,YAAY,WAAW,qBAAqB,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,iDAAiD;AACjD,MAAM,OAAO,aAAc,SAAQ,KAAK;IACA;IAAtC,YAAY,OAAe,EAAW,IAAa;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QADd,SAAI,GAAJ,IAAI,CAAS;QAEjD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { ContractDef } from "./define.js";
2
+ import { type ContractSchema } from "./schema.js";
3
+ /**
4
+ * zod 契約 → contract.schema.json。
5
+ * 契約全体を 1 つの zod object に包んでから `z.toJSONSchema()` を 1 回だけ呼ぶ。
6
+ * こうすると `.meta({ id })` の付いたスキーマがルートの `$defs` に 1 回だけ集約され、
7
+ * 各所からは `#/$defs/<id>` で参照される。
8
+ */
9
+ export declare function toSchema(contract: ContractDef): ContractSchema;
10
+ //# sourceMappingURL=to-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-schema.d.ts","sourceRoot":"","sources":["../src/to-schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAiB,KAAK,cAAc,EAAmB,MAAM,aAAa,CAAC;AAIlF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,CAoD9D"}
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { GenerateError } from "./schema.js";
3
+ const IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
4
+ /**
5
+ * zod 契約 → contract.schema.json。
6
+ * 契約全体を 1 つの zod object に包んでから `z.toJSONSchema()` を 1 回だけ呼ぶ。
7
+ * こうすると `.meta({ id })` の付いたスキーマがルートの `$defs` に 1 回だけ集約され、
8
+ * 各所からは `#/$defs/<id>` で参照される。
9
+ */
10
+ export function toSchema(contract) {
11
+ validateNames(contract);
12
+ const methodsShape = {};
13
+ for (const [ns, methods] of Object.entries(contract.methods)) {
14
+ const nsShape = {};
15
+ for (const [name, def] of Object.entries(methods)) {
16
+ nsShape[name] = z.object({ input: def.input, output: def.output });
17
+ }
18
+ methodsShape[ns] = z.object(nsShape);
19
+ }
20
+ const root = z.object({
21
+ methods: z.object(methodsShape),
22
+ events: z.object(contract.events),
23
+ });
24
+ const raw = z.toJSONSchema(root, {
25
+ target: "draft-2020-12",
26
+ io: "output",
27
+ unrepresentable: "throw",
28
+ });
29
+ const rootProps = raw.properties ?? {};
30
+ const methodsNode = rootProps["methods"]?.properties ?? {};
31
+ const eventsNode = rootProps["events"]?.properties ?? {};
32
+ const methods = {};
33
+ for (const ns of Object.keys(contract.methods)) {
34
+ const nsNode = methodsNode[ns]?.properties ?? {};
35
+ methods[ns] = {};
36
+ for (const name of Object.keys(contract.methods[ns])) {
37
+ const m = nsNode[name]?.properties;
38
+ if (!m?.["input"] || !m["output"]) {
39
+ throw new GenerateError("Failed to extract method schema", `methods.${ns}.${name}`);
40
+ }
41
+ methods[ns][name] = { input: m["input"], output: m["output"] };
42
+ }
43
+ }
44
+ const events = {};
45
+ for (const name of Object.keys(contract.events)) {
46
+ const e = eventsNode[name];
47
+ if (!e)
48
+ throw new GenerateError("Failed to extract event schema", `events.${name}`);
49
+ events[name] = e;
50
+ }
51
+ return {
52
+ $schema: "https://json-schema.org/draft/2020-12/schema",
53
+ contractVersion: 1,
54
+ $defs: raw["$defs"] ?? {},
55
+ methods,
56
+ events,
57
+ };
58
+ }
59
+ function validateNames(contract) {
60
+ for (const [ns, methods] of Object.entries(contract.methods)) {
61
+ if (!IDENT.test(ns))
62
+ throw new GenerateError(`Invalid namespace name "${ns}"`, `methods.${ns}`);
63
+ if (ns === "event")
64
+ throw new GenerateError(`Namespace "event" is reserved for events`, `methods.${ns}`);
65
+ for (const name of Object.keys(methods)) {
66
+ if (!IDENT.test(name))
67
+ throw new GenerateError(`Invalid method name "${name}"`, `methods.${ns}.${name}`);
68
+ }
69
+ }
70
+ for (const name of Object.keys(contract.events)) {
71
+ if (!IDENT.test(name))
72
+ throw new GenerateError(`Invalid event name "${name}"`, `events.${name}`);
73
+ }
74
+ }
75
+ //# sourceMappingURL=to-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-schema.js","sourceRoot":"","sources":["../src/to-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { EmittedFile } from "./emitted.js";
2
+ export type VbRuntimeKind = "runtime" | "winforms";
3
+ /** 同梱している VB ランタイムのファイル名 */
4
+ export declare const VB_RUNTIME_FILES: Record<VbRuntimeKind, readonly string[]>;
5
+ /** この gen パッケージのバージョン(生成ヘッダに埋める。src/ からも dist/ からも ../package.json) */
6
+ export declare function genPackageVersion(): string;
7
+ export declare function vbRuntimeHeader(kind: VbRuntimeKind, version: string): string;
8
+ /** 同梱ランタイムを読み、auto-generated ヘッダを付けて EmittedFile にする */
9
+ export declare function emitVbRuntime(kind: VbRuntimeKind, options?: {
10
+ version?: string;
11
+ }): Promise<EmittedFile[]>;
12
+ //# sourceMappingURL=vb-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vb-runtime.d.ts","sourceRoot":"","sources":["../src/vb-runtime.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAEnD,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAGrE,CAAC;AAOF,uEAAuE;AACvE,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAU5E;AAED,wDAAwD;AACxD,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CASnH"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * VB ランタイム(JsonRpc / Dispatcher / IBridgeEmitter / WebViewBridge)を生成物として書き出す。
3
+ *
4
+ * NuGet(WebView2Bridge.Runtime / WebView2Bridge.WinForms)を使わず、npm の gen だけで
5
+ * アプリを成立させるための機能。ソースはパッケージ同梱の vb-runtime/(dotnet/ のコピー)。
6
+ * 名前空間は NuGet 版と同じ(WebView2Bridge.Runtime / WebView2Bridge.WinForms)なので、
7
+ * 契約から生成されるコードと呼び出し側は、どちらを使っても変わらない。
8
+ *
9
+ * Node 固有(fs)なので index.ts からは export しない(generate と同じ entry)。
10
+ */
11
+ import { readFile } from "node:fs/promises";
12
+ import { createRequire } from "node:module";
13
+ /** 同梱している VB ランタイムのファイル名 */
14
+ export const VB_RUNTIME_FILES = {
15
+ runtime: ["JsonRpc.vb", "Dispatcher.vb", "IBridgeEmitter.vb"],
16
+ winforms: ["WebViewBridge.vb"],
17
+ };
18
+ const VB_RUNTIME_DESCRIPTION = {
19
+ runtime: "JSON-RPC runtime (namespace WebView2Bridge.Runtime; needs Newtonsoft.Json)",
20
+ winforms: "WinForms bridge (namespace WebView2Bridge.WinForms; needs Microsoft.Web.WebView2 and the runtime)",
21
+ };
22
+ /** この gen パッケージのバージョン(生成ヘッダに埋める。src/ からも dist/ からも ../package.json) */
23
+ export function genPackageVersion() {
24
+ const require = createRequire(import.meta.url);
25
+ const pkg = require("../package.json");
26
+ return pkg.version;
27
+ }
28
+ export function vbRuntimeHeader(kind, version) {
29
+ return [
30
+ "' <auto-generated>",
31
+ `' webview2-bridge VB ${VB_RUNTIME_DESCRIPTION[kind]}`,
32
+ `' copied by @ishibashi0112/webview2-bridge-gen ${version} from its bundled vb-runtime/${kind}/.`,
33
+ "' DO NOT EDIT. Changes will be lost when `pnpm gen` runs.",
34
+ "' To update, upgrade the npm package and run the generator again.",
35
+ "' </auto-generated>",
36
+ "",
37
+ ].join("\n");
38
+ }
39
+ /** 同梱ランタイムを読み、auto-generated ヘッダを付けて EmittedFile にする */
40
+ export async function emitVbRuntime(kind, options = {}) {
41
+ const version = options.version ?? genPackageVersion();
42
+ const base = new URL(`../vb-runtime/${kind}/`, import.meta.url);
43
+ const out = [];
44
+ for (const name of VB_RUNTIME_FILES[kind]) {
45
+ const body = await readFile(new URL(name, base), "utf8");
46
+ out.push({ path: name, content: vbRuntimeHeader(kind, version) + body.replace(/\r\n/g, "\n") });
47
+ }
48
+ return out;
49
+ }
50
+ //# sourceMappingURL=vb-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vb-runtime.js","sourceRoot":"","sources":["../src/vb-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC;IAC7D,QAAQ,EAAE,CAAC,kBAAkB,CAAC;CAC/B,CAAC;AAEF,MAAM,sBAAsB,GAAkC;IAC5D,OAAO,EAAE,4EAA4E;IACrF,QAAQ,EAAE,mGAAmG;CAC9G,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;IAC9D,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAmB,EAAE,OAAe;IAClE,OAAO;QACL,oBAAoB;QACpB,4BAA4B,sBAAsB,CAAC,IAAI,CAAC,EAAE;QAC1D,sDAAsD,OAAO,gCAAgC,IAAI,IAAI;QACrG,+DAA+D;QAC/D,uEAAuE;QACvE,qBAAqB;QACrB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB,EAAE,UAAgC,EAAE;IACzF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,iBAAiB,IAAI,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@ishibashi0112/webview2-bridge-gen",
3
+ "version": "0.2.0",
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
+ "keywords": [
6
+ "webview2",
7
+ "winforms",
8
+ "vb.net",
9
+ "zod",
10
+ "json-schema",
11
+ "json-rpc",
12
+ "codegen",
13
+ "react",
14
+ "vite"
15
+ ],
16
+ "license": "MIT",
17
+ "author": "ishibashi0112",
18
+ "homepage": "https://github.com/ishibashi0112/webview2-bridge#readme",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/ishibashi0112/webview2-bridge.git",
22
+ "directory": "packages/gen"
23
+ },
24
+ "bugs": "https://github.com/ishibashi0112/webview2-bridge/issues",
25
+ "type": "module",
26
+ "sideEffects": false,
27
+ "engines": {
28
+ "node": ">=20.19.0"
29
+ },
30
+ "main": "./dist/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./generate": {
38
+ "types": "./dist/generate.d.ts",
39
+ "default": "./dist/generate.js"
40
+ }
41
+ },
42
+ "bin": {
43
+ "webview2-bridge-gen": "./dist/cli.js"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "vb-runtime",
48
+ "README.md",
49
+ "LICENSE"
50
+ ],
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "peerDependencies": {
55
+ "zod": "^4.0.0"
56
+ },
57
+ "dependencies": {
58
+ "tsx": "^4.23.13"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^24.0.0",
62
+ "typescript": "^5.9.3",
63
+ "vitest": "^4.1.11",
64
+ "zod": "^4.5.4"
65
+ },
66
+ "scripts": {
67
+ "build": "pnpm sync:vb-runtime && node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
68
+ "gen": "tsx src/cli.ts",
69
+ "test": "vitest run",
70
+ "typecheck": "tsc --noEmit -p tsconfig.json",
71
+ "sync:vb-runtime": "node scripts/sync-vb-runtime.mjs"
72
+ }
73
+ }
@@ -0,0 +1,10 @@
1
+ # vb-runtime
2
+
3
+ VB.NET ランタイムのコピー。**手で編集しない。**
4
+
5
+ 唯一の正はリポジトリの `dotnet/WebView2Bridge.Runtime/*.vb` と `dotnet/WebView2Bridge.WinForms/WebViewBridge.vb`。
6
+ `pnpm --filter @ishibashi0112/webview2-bridge-gen sync:vb-runtime`(`pnpm build` でも自動実行)でここへコピーされ、
7
+ npm パッケージに同梱される。`vb-runtime.test.ts` が dotnet/ と一致していることを検証する。
8
+
9
+ 利用側アプリでは `webview2-bridge.gen.json` の `vb.runtime.outDir` / `vb.winforms.outDir` を設定すると、
10
+ `webview2-bridge-gen` がこれらを auto-generated ヘッダ付きで書き出す(NuGet は不要)。