@zntc/core 0.1.1 → 0.1.2

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.
@@ -168,6 +168,100 @@ export declare function transpile(source: string, options?: TranspileOptions & {
168
168
  export declare function tokenize(source: string, options?: TokenizeOptions): TokenizeToken[];
169
169
  export declare function configureProfile(profile: string[], level?: 'summary' | 'detailed' | 'per-module' | 'per-pass'): void;
170
170
  export declare function profileReport(format?: 'table' | 'tree' | 'json' | 'csv'): string;
171
+ /** @see {@link NativeModule.tlsSelfCheck} */
172
+ export interface TlsSelfCheckOptions {
173
+ certPath: string;
174
+ keyPath: string;
175
+ }
176
+ /**
177
+ * TLS context init/deinit 만 호출하는 BoringSSL sanity 진입점.
178
+ *
179
+ * cert/key 파일을 한 번 로드해 BoringSSL 의 SSL_CTX 가 정상 생성되는지 검증.
180
+ * Throw 시 message 에 Zig error name 이 포함되어 caller 가 분류 가능
181
+ * (CertLoadFailed / KeyLoadFailed / KeyMismatch 등).
182
+ *
183
+ * NAPI binary 에 BoringSSL 이 static link 되어 있는지 + dlopen 후 symbol resolve
184
+ * 가 동작하는지 빠르게 확인하는 용도. 향후 본격 HTTPS dev server NAPI entry 가
185
+ * 추가되면 그 entry 가 같은 path 사용.
186
+ */
187
+ export declare function tlsSelfCheck(options: TlsSelfCheckOptions): void;
188
+ /** @see {@link NativeModule.startDevServer} */
189
+ export interface StartDevServerOptions {
190
+ rootDir: string;
191
+ /**
192
+ * TCP port (0-65535). Default 12300. 0 은 OS-assigned ephemeral port —
193
+ * `getDevServerPort(handle)` 로 실제 값 조회.
194
+ */
195
+ port?: number;
196
+ /** Bind host. "localhost"/"127.0.0.1" (default) 또는 "0.0.0.0". */
197
+ host?: string;
198
+ /** `--bundle` entry. 지정 시 dev server 가 bundle 결과 서빙. */
199
+ entry?: string;
200
+ /** Open default browser at server URL. Default false. */
201
+ open?: boolean;
202
+ /** HTTPS cert (PEM). keyPath 와 함께 줘야. */
203
+ certPath?: string;
204
+ /** HTTPS key (PEM). certPath 와 함께 줘야. */
205
+ keyPath?: string;
206
+ /**
207
+ * stderr 의 banner + 모든 routine log silence. NAPI embed default true
208
+ * (자체 logger 가정). false 로 명시하면 stderr 출력. quiet 가드되는 카테고리
209
+ * 전체 리스트는 `src/server/dev_server.zig` 의 `DevServer.routineLog` doc
210
+ * (CANONICAL SCOPE LIST) 참조 — 단일 진실 소스.
211
+ *
212
+ * **critical 진단은 quiet 와 무관 항상 stderr** — init failure (cert 로드 /
213
+ * 디렉토리 못 찾음 / overlay sentinel), start fatal (host parse / listen 실패
214
+ * / watch thread spawn), deinit UAF 경고. 사용자가 throw 메시지 너머의 root
215
+ * cause 를 추적할 수 있도록 보장.
216
+ */
217
+ quiet?: boolean;
218
+ /**
219
+ * Lazy on-demand compilation. Default false. When true, the dev server builds
220
+ * with code-splitting + lazy mode (IIFE registry): only the entry chunk is
221
+ * served at `/bundle.js`, and each dynamic `import()` target is compiled on
222
+ * demand when the browser requests its chunk URL. Reduces cold-start time for
223
+ * large apps (parse work is deferred to first use).
224
+ *
225
+ * **Note**: this is honored by the native (`startDevServer`) dev server only.
226
+ * The `zntc dev` web CLI runs a separate JS dev server that does not yet
227
+ * support lazy compilation — tracked as a backlog item.
228
+ */
229
+ lazyCompilation?: boolean;
230
+ }
231
+ /** Opaque handle from {@link startDevServer}. */
232
+ export type DevServerHandle = object;
233
+ /**
234
+ * In-process dev server (HTTP / HTTPS) 를 native thread 에서 시작.
235
+ *
236
+ * 일반 `zntc --serve` 와 동일한 listener / routing / HMR / SSE 동작. NAPI 임베드라
237
+ * Node event loop 는 자유 (별도 thread 에서 listen).
238
+ *
239
+ * 반환된 handle 은 opaque. `stopDevServer(handle)` 로 graceful shutdown. JS GC
240
+ * 가 handle 수거 시 finalizer 가 자동 stop (safety net) — 명시 stop 권장.
241
+ *
242
+ * @example
243
+ * const handle = startDevServer({ rootDir: './public', port: 5173 });
244
+ * try {
245
+ * await new Promise(r => setTimeout(r, 60_000));
246
+ * } finally {
247
+ * stopDevServer(handle);
248
+ * }
249
+ */
250
+ export declare function startDevServer(options: StartDevServerOptions): DevServerHandle;
251
+ /** Graceful shutdown — idempotent. */
252
+ export declare function stopDevServer(handle: DevServerHandle): void;
253
+ /**
254
+ * startDevServer handle 의 실제 listen port.
255
+ *
256
+ * port=0 (OS-assigned ephemeral) 로 시작했을 때 실 bound port 조회. 일반적인
257
+ * test fixture / dynamic 환경에서 free port 자동 할당받고 그 값을 즉시 사용.
258
+ *
259
+ * @example
260
+ * const handle = startDevServer({ rootDir: './public', port: 0 });
261
+ * const port = getDevServerPort(handle);
262
+ * const res = await fetch(`http://127.0.0.1:${port}/`);
263
+ */
264
+ export declare function getDevServerPort(handle: DevServerHandle): number;
171
265
  export type { OutputFile, Diagnostic };
172
266
  /** Return value of `meta.getModuleInfo(id)` in Rollup `manualChunks(id, meta)`. */
173
267
  export interface ManualChunksModuleInfo {
@@ -217,6 +311,9 @@ export interface ManualChunksModuleInfo {
217
311
  /** Modules that this module dynamically imports (`import()`). Includes
218
312
  * external modules. */
219
313
  dynamicallyImportedIds: string[];
314
+ /** Plugin이 load hook의 `{ meta }`로 부여한 메타데이터 (Rollup `info.meta` 호환).
315
+ * plugin이 meta를 설정하지 않은 모듈은 빈 객체 `{}` (#1880 PR2). */
316
+ meta: Record<string, unknown>;
220
317
  }
221
318
  /** The second argument of the `manualChunks` callback — module graph topology lookup. */
222
319
  export interface ManualChunksMeta {
@@ -297,7 +394,13 @@ export interface EmotionOptions {
297
394
  canonicalImport: [string, string];
298
395
  }>>;
299
396
  }
300
- /** Vite-style dev server options used by `zntc dev` / `zntc --serve`. */
397
+ /**
398
+ * Vite-style dev server options used by `zntc dev` / `zntc --serve`.
399
+ *
400
+ * Note: `startDevServer()` (native NAPI) accepts extra options such as
401
+ * `lazyCompilation` — see {@link StartDevServerOptions}. The `zntc dev` web CLI
402
+ * runs a separate JS dev server and does not honor those yet (backlog).
403
+ */
301
404
  export interface DevServerOptions {
302
405
  /** Port to listen on. CLI `--port` overrides this value. */
303
406
  port?: number;
@@ -349,6 +452,29 @@ interface BuildOptionsCommon {
349
452
  minifyIdentifiers?: boolean;
350
453
  minifySyntax?: boolean;
351
454
  splitting?: boolean;
455
+ /**
456
+ * Lazy on-demand compilation primitive (dev-only). Requires `splitting: true` +
457
+ * `devMode: true`. When true, dynamic `import()` targets are left as UNPARSED
458
+ * "lazy seeds" (emit-skipped); the entry references them by stable path-hash name
459
+ * (`__zntc_load_chunk("<stem>-<pathHash>.js")`), and the result exposes
460
+ * {@link NativeBuildResult.lazySeeds}. A dev server compiles each seed on demand
461
+ * by rebuilding with `lazyForceParse: [seedPath]`. Low-level primitive — the web
462
+ * CLI dev server orchestrates this; most users use it indirectly.
463
+ */
464
+ lazyCompilation?: boolean;
465
+ /**
466
+ * Force-parse specific lazy seeds even under `lazyCompilation: true` — array of
467
+ * dynamic-import target paths to compile eagerly instead of deferring. A dev
468
+ * server passes the requested seed's path here to materialize exactly that
469
+ * on-demand chunk. No effect without `lazyCompilation: true`.
470
+ *
471
+ * **Contract**: each entry must be the EXACT path from a {@link NativeBuildResult.lazySeeds}
472
+ * entry's `.path` (the bundler-resolved absolute path — e.g. symlink-resolved
473
+ * `/private/tmp/...`, not your own `./x` specifier). A path that doesn't match a
474
+ * seed is **silently ignored** (that seed stays lazy). Source these from a prior
475
+ * `lazySeeds` result, never reconstruct them.
476
+ */
477
+ lazyForceParse?: string[];
352
478
  /** Rollup `output.inlineDynamicImports` — absorbs the dynamic import target
353
479
  * into the importer's chunk and rewrites the `import("./x")` call into an
354
480
  * `__esm` wrapper init/exports call. Combine with `splitting: true`. The
@@ -424,6 +550,9 @@ interface BuildOptionsCommon {
424
550
  entryNames?: string;
425
551
  chunkNames?: string;
426
552
  assetNames?: string;
553
+ /** CSS chunk path pattern. Default: `[dir]/[name]` (PR B-4b sub-2; esbuild parity).
554
+ * Supports `[name]`, `[hash]` (content), and `[dir]` (entry-relative). */
555
+ cssNames?: string;
427
556
  /** Metro AssetRegistry module path (React Native-only layer).
428
557
  * - `undefined`: determined by the platform preset (with
429
558
  * `platform: "react-native"`, the default path is used automatically)
@@ -470,6 +599,17 @@ interface BuildOptionsCommon {
470
599
  find: string | RegExp;
471
600
  replacement: string;
472
601
  }>;
602
+ /** alias 의 prefix matching 을 끄는 from 목록 — exact 매칭만 허용.
603
+ *
604
+ * `alias` object form 의 기본 동작은 esbuild 처럼 정확/접두사 둘 다 매칭이라
605
+ * `react: "preact/compat"` 가 `react/hooks → preact/compat/hooks` 로도 동작한다.
606
+ * 그러나 alias 값이 **단일 파일** 인 경우 prefix 매칭이 `from/subpath → file.js/subpath`
607
+ * (파일을 디렉토리 취급) 로 깨진다. 이 list 에 from 을 적으면 그 entry 는 exact
608
+ * 매칭만 적용 — subpath import 는 alias 미적용되어 원본 패키지로 resolve.
609
+ *
610
+ * 일반적인 package-to-package alias (`react → preact/compat`) 는 list 에 안 넣음.
611
+ * 주로 wrapper / shim 파일 alias 에서 사용. */
612
+ aliasExact?: string[];
473
613
  /** Fallback resolution — applied **only when** normal resolution fails
474
614
  * (webpack `resolve.fallback` / Metro `resolver.extraNodeModules`-compatible).
475
615
  * If the value is a string, re-resolve to that specifier; if `false`,
@@ -665,6 +805,15 @@ interface BuildOptionsCommon {
665
805
  reactRefresh?: boolean;
666
806
  /** Collect dev mode per-module codes (for HMR rebuilds). */
667
807
  collectModuleCodes?: boolean;
808
+ /**
809
+ * `watch()` 가 *initial* 빌드 결과를 outdir 에 쓰지 않는다 (#3779 follow-up).
810
+ * caller 가 이미 별도 `build()` / `buildSync()` 로 outdir 를 채워 둔 상태에서
811
+ * watch handle 만 띄울 때 사용 — `runServe` 가 `runBundle` 1회 후 `watch()` 를
812
+ * 띄우는 패턴. caller 가 outdir 를 미리 준비하지 않으면 dev server 가 404 — 위험은
813
+ * caller 책임. incremental rebuild 의 출력 동작은 watch handle 이 자동으로 별도
814
+ * 제어. 기본 false (RN dev 등 기존 단독 watch 사용자 호환).
815
+ */
816
+ skipInitialOutput?: boolean;
668
817
  /** Add configurable: true to Object.defineProperty (RN/Hermes-compatible). */
669
818
  configurableExports?: boolean;
670
819
  /** Guarantee ESM execution order — downgrade function declarations to
@@ -711,6 +860,12 @@ interface BuildOptionsCommon {
711
860
  * Avoids the Fabric early-register race (`View config not found for
712
861
  * component 'X'`). */
713
862
  codegenTransform?: boolean;
863
+ /**
864
+ * PR-3: HMR 위상 보존에서 plugin 게이트를 완화하는 **빌드 수준** opt-in 신호(per-plugin 아님).
865
+ * 이 빌드의 모든 plugin 이 결정적·모듈별 순수(ModuleGraph 무접근, 전역 상태/lifecycle 출력 영향
866
+ * 없음)임을 호출자가 보장할 때만 true. RN preset 이 내장 plugin 구성에 대해 자동으로 켠다.
867
+ * 임의 custom plugin 은 비결정 가능하므로 default false. */
868
+ preserveSafePlugins?: boolean;
714
869
  /** Global identifiers to reserve during scope hoisting. */
715
870
  globalIdentifiers?: string[];
716
871
  /** Paths of polyfills to run immediately at bundle start. */
@@ -744,6 +899,14 @@ interface BuildOptionsCommon {
744
899
  onReady?: (event: WatchReadyEvent) => void | Promise<void>;
745
900
  /** watch-mode rebuild callback. */
746
901
  onRebuild?: (event: WatchRebuildEvent) => void | Promise<void>;
902
+ /**
903
+ * watch debounce window in milliseconds — after the first file event, the
904
+ * watcher waits this long for idle before rebuilding, merging rapid saves
905
+ * into one rebuild. Default `16`. Set `0` to rebuild immediately (no debounce;
906
+ * lower latency, but rapid saves may trigger multiple rebuilds). Mirrors the
907
+ * CLI `--watch-delay` flag. Only affects the NAPI `watch()` path.
908
+ */
909
+ watchDelay?: number;
747
910
  /**
748
911
  * Whether to write the `.map` file to disk (Issue #1727 Phase B).
749
912
  *
@@ -797,10 +960,40 @@ export type BuildOptions = (BuildOptionsCommon & {
797
960
  export interface WatchReadyEvent {
798
961
  files: number;
799
962
  bytes: number;
963
+ /**
964
+ * #3796 — initial 빌드의 output 파일 path 목록. caller (예: `runServe`) 가 outdir scan 없이
965
+ * 정확한 outputFiles 정보를 받아 후속 hook (예: `injectBundleCssLinks`) 호출 가능. contents
966
+ * 는 메모리 비용이 커 path 만 노출 — caller 가 fs read 또는 path 기반 분기.
967
+ */
968
+ outputs?: string[];
969
+ /**
970
+ * D105 PR-B-1 — lazy 빌드(`lazyCompilation: true`)일 때만. 미파싱 lazy seed 들의
971
+ * `{ pathHash, path }` (build 결과 {@link NativeBuildResult.lazySeeds} 와 동일 shape).
972
+ * dev 서버가 watch(lazy)로 HMR 을 유지하며 on-demand lazy 라우팅을 구현하기 위한 **토대 데이터**
973
+ * — 요청 청크 URL `<stem>-<pathHash>.js` 의 해시로 seed 경로를 역참조해 on-demand 컴파일
974
+ * (`build({ lazyForceParse: [path] })`)할 수 있다.
975
+ *
976
+ * **범위**: *initial* 빌드(onReady)에서만 노출. rebuild(HMR)에서 동적 import 추가/삭제로
977
+ * seed 집합이 바뀌는 경우의 갱신 전략(델타 vs full-reload)은 PR-B-2(dev 서버 연동)에서 정한다.
978
+ */
979
+ lazySeeds?: Array<{
980
+ pathHash: string;
981
+ path: string;
982
+ }>;
800
983
  }
801
984
  export interface WatchRebuildEvent {
802
985
  success: boolean;
986
+ /** Single error tag from native `@errorName(err)` (catch path). */
803
987
  error?: string;
988
+ /**
989
+ * #3799 — Multiple error diagnostics from bundler (success-but-errors path). When the
990
+ * bundler 자체가 throw 하지 않고 success-결과를 반환했지만 diagnostics 에 error severity
991
+ * 가 있는 경우 채워진다. `error` (single tag) 와 별개 — `errors` 가 있으면 우선 사용.
992
+ */
993
+ errors?: Array<{
994
+ file: string;
995
+ message: string;
996
+ }>;
804
997
  changed?: string[];
805
998
  graphChanged?: boolean;
806
999
  updates?: Array<{
@@ -886,10 +1079,36 @@ export interface WatchRebuildEvent {
886
1079
  emitConcat: number;
887
1080
  /** Source map V3 JSON generation (VLQ encode + sources content + debugId). */
888
1081
  emitSourcemapFinalize: number;
1082
+ /** Link: per-module export map build. */
1083
+ linkBuildExportMap: number;
1084
+ /** Link: import resolution (binding cross-reference). */
1085
+ linkResolveImports: number;
1086
+ /**
1087
+ * Link: canonical_name 계산. lodash 측정에서 ~50ms — RFC #3940 의 RenameTable
1088
+ * 도입 (Phase 2) 후 baseline 으로 활용.
1089
+ */
1090
+ linkComputeRenames: number;
1091
+ /** Link: re-export alias 채우기 (cross-module export name 매핑). */
1092
+ linkPopulateReExportAliases: number;
1093
+ /** Link: import symbol 채우기. */
1094
+ linkPopulateImportSymbols: number;
1095
+ /** Link: namespace access 채우기 (namespace import 사용처). */
1096
+ linkPopulateNamespaceAccesses: number;
889
1097
  };
890
1098
  /** Number of modules reparsed in the incremental graph. Counts cache-missed
891
1099
  * modules only. Not exposed for full builds. */
892
1100
  reparsedModules?: number;
1101
+ /**
1102
+ * D105 PR-C-1: lazy 빌드의 미파싱 seed 목록 `{ pathHash, path }`
1103
+ * ({@link WatchReadyEvent.lazySeeds} 와 동일 shape/공식). `lazyCompilation` 이 켜진
1104
+ * watch 세션에서 매 rebuild 마다 노출 → dev 서버가 rebuild 중 새로 추가/제거된 동적
1105
+ * import seed 집합을 갱신할 수 있다 (onReady 한정이던 PR-B-1 의 rebuild 확장).
1106
+ * lazy 빌드가 아니거나 동적 import 가 없으면 생략(`undefined`).
1107
+ */
1108
+ lazySeeds?: Array<{
1109
+ pathHash: string;
1110
+ path: string;
1111
+ }>;
893
1112
  }
894
1113
  export interface WatchHandle {
895
1114
  stop(): void;
@@ -914,6 +1133,18 @@ export interface WatchHandle {
914
1133
  * `null` if `moduleId` was not included in this rebuild.
915
1134
  */
916
1135
  getHmrSourceMap(moduleId: string): string | null;
1136
+ /**
1137
+ * #4079 PR-2 — 요청된 lazy seed(동적 import 타겟)를 watch 그래프에서 force-parse 하도록
1138
+ * 누적 등록한다. `path` 는 {@link WatchReadyEvent.lazySeeds} / {@link WatchRebuildEvent.lazySeeds}
1139
+ * 의 *정확한* 절대경로여야 한다(번들러 해석 경로 — `resolve()` 로 재구성 금지).
1140
+ *
1141
+ * 호출 즉시 worker 가 다음 rebuild(파일 변경 없이도, ≤200ms 내)에서 그 seed 를 정식 파싱·
1142
+ * emit 하고 그 transitive 정적 deps 를 감시 대상에 포함시킨다(dev materialize — `--lazy`
1143
+ * 라우트를 방문하면 그 안쪽 파일 편집도 HMR 동작). 중복/`stop()` 후 호출은 no-op.
1144
+ *
1145
+ * `lazyCompilation`+`splitting` watch 세션에서만 의미 있다.
1146
+ */
1147
+ requestLazySeed(path: string): void;
917
1148
  }
918
1149
  export interface ZntcPlugin {
919
1150
  name: string;
@@ -945,6 +1176,8 @@ export interface PluginBuild {
945
1176
  contents: string | Uint8Array;
946
1177
  loader?: string;
947
1178
  map?: unknown;
1179
+ /** Rollup `ModuleInfo.meta` 호환 — getModuleInfo(id).meta 로 노출 (#1880 PR2). */
1180
+ meta?: Record<string, unknown>;
948
1181
  }>): void;
949
1182
  onTransform(options: {
950
1183
  filter: RegExp;
@@ -1092,6 +1325,12 @@ export interface AppBuildOptions {
1092
1325
  * the same option representation.
1093
1326
  */
1094
1327
  compiler?: CompilerOptions;
1328
+ /**
1329
+ * Rollup-compatible JS plugins. Same `resolveId`/`load`/`transform` hooks as
1330
+ * `BuildOptions.plugins` — app build pipeline 도 같은 dispatcher 를 받는다
1331
+ * (#2538 4-4 PR-1).
1332
+ */
1333
+ plugins?: ZntcPlugin[];
1095
1334
  }
1096
1335
  /**
1097
1336
  * Options for preparing a Vite-style application for the development server.
@@ -1257,13 +1496,31 @@ export interface RollupPluginContext {
1257
1496
  warn(message: unknown): void;
1258
1497
  /** Register an additional file to watch in watch mode. Currently a no-op (graph mutation not supported). */
1259
1498
  addWatchFile(id: string): void;
1260
- /** Module resolve. Currently unsupported throws an Error when called to notify the plugin author. */
1499
+ /** Module resolve (Rollup `this.resolve` 호환, #1880 PR4). async build() resolveId/load/transform
1500
+ * hook 에서 native resolver(순수 path resolution)로 해석 → `{ id, external }` 또는 null(미해결).
1501
+ * `options`(skipSelf 등)는 현재 no-op (native resolver 가 plugin 을 재진입하지 않아 skipSelf 자명 충족).
1502
+ * 그 외 hook / buildSync / vitePlugin() 어댑터에서는 throw. */
1261
1503
  resolve(source: string, importer?: string | null, options?: unknown): Promise<{
1262
1504
  id: string;
1263
1505
  external?: boolean;
1264
1506
  } | null>;
1265
- /** Emit an additional asset/chunk. Currently unsupported throws an Error when called. */
1507
+ /** Emit an additional asset (Rollup `this.emitFile` 호환, #1880 PR5/6). async build()
1508
+ * resolveId/load/transform hook 에서 `{ type: 'asset', fileName | name, source }` 를 emit →
1509
+ * reference id 반환, 해당 asset 은 `result.outputFiles` 에 나타난다. `fileName` 은 그대로,
1510
+ * `name` 은 source hash 로 파일명 자동 생성(file/copy loader 와 동일 `assetNames` 패턴).
1511
+ * vitePlugin() 어댑터의 resolveId/load/transform hook 에서도 동작(#1880 PR7).
1512
+ * `{ type: 'chunk', id }` 는 id(이미 graph 에 있는 모듈)를 별도 chunk 로 분리(#1880 PR7-2b-i,
1513
+ * splitting:true). 신규 모듈 chunk emit 은 미지원(build 진단). 그 외 hook / buildSync 는 throw.
1514
+ * **반드시 hook 본문에서 동기적으로 호출**해야 한다 — `await` 이후나 detached promise 에서
1515
+ * 호출하면 EmitStore 수명을 벗어나 asset 이 누락되거나 정의되지 않은 동작이 된다 (follow-up). */
1266
1516
  emitFile(file: unknown): string;
1517
+ /** Resolve an emitted file's final output name (Rollup `this.getFileName` 호환, #1880 PR6).
1518
+ * `this.emitFile` 이 돌려준 reference id → 최종 출력 파일명. asset hash 는 source 기반이라 emit
1519
+ * 시점에 확정되므로 같은(또는 먼저 완료된) hook 에서 즉시 조회 가능. 미등록 id 는 throw. */
1520
+ getFileName(referenceId: string): string;
1521
+ /** 모듈 그래프 정보(+plugin meta) 조회 (Rollup `this.getModuleInfo` 호환).
1522
+ * async build() 의 transform hook 에서만 사용 가능 (#1880 PR3). 그 외 hook/buildSync 에선 throw. */
1523
+ getModuleInfo(id: string): ManualChunksModuleInfo | null;
1267
1524
  }
1268
1525
  type ResolveIdResult = string | null | undefined | void | {
1269
1526
  id: string;