@formspec/build 0.1.0-alpha.53 → 0.1.0-alpha.54

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.
@@ -1 +1 @@
1
- {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
@@ -469,6 +469,46 @@ declare interface CustomTypeRegistration_2 {
469
469
  * Note: `"__integerBrand"` is reserved for the builtin Integer type.
470
470
  */
471
471
  readonly brand?: string;
472
+ /**
473
+ * Optional callback to extract a payload from the TypeScript type at
474
+ * analysis time. The returned value is stored on the custom type node
475
+ * and later passed to `toJsonSchema`.
476
+ *
477
+ * Use this to carry type-level information (e.g., a generic argument's
478
+ * resolved literal value) through the IR into schema generation.
479
+ *
480
+ * **Parameters:** typed as `unknown` because `@formspec/core` does not
481
+ * depend on the TypeScript compiler API. Implementations should cast to
482
+ * `ts.Type` and `ts.TypeChecker`. Both parameters originate from the
483
+ * host program's type checker — extensions may rely on host-program
484
+ * symbol identity.
485
+ *
486
+ * **Contract:**
487
+ * - Must be a pure function of `(type, checker)` — no I/O or shared state.
488
+ * - May be invoked multiple times for the same type (no memoization is provided).
489
+ * - Must return a JSON-serializable `ExtensionPayloadValue`. Returning live
490
+ * compiler objects (e.g., `ts.Type`) will corrupt any IR caching.
491
+ * - Errors thrown by the callback are attributed to the extension and
492
+ * reported as build diagnostics.
493
+ * - Returning `undefined` is coerced to `null` at the call site.
494
+ *
495
+ * @param type - The resolved TypeScript type (cast to `ts.Type`).
496
+ * @param checker - The TypeScript type checker (cast to `ts.TypeChecker`).
497
+ * @returns A JSON-serializable payload, or `null` if no payload can be extracted.
498
+ *
499
+ * @example
500
+ * ```typescript
501
+ * extractPayload: (type: unknown, checker: unknown) => {
502
+ * const tsType = type as ts.Type;
503
+ * const tsChecker = checker as ts.TypeChecker;
504
+ * const prop = tsType.getProperty('target');
505
+ * if (!prop) return null;
506
+ * const propType = tsChecker.getTypeOfSymbol(prop);
507
+ * return propType.isStringLiteral() ? propType.value : null;
508
+ * }
509
+ * ```
510
+ */
511
+ readonly extractPayload?: (type: unknown, checker: unknown) => ExtensionPayloadValue;
472
512
  /**
473
513
  * Converts the custom type's payload into a JSON Schema fragment.
474
514
  *
@@ -469,6 +469,46 @@ declare interface CustomTypeRegistration_2 {
469
469
  * Note: `"__integerBrand"` is reserved for the builtin Integer type.
470
470
  */
471
471
  readonly brand?: string;
472
+ /**
473
+ * Optional callback to extract a payload from the TypeScript type at
474
+ * analysis time. The returned value is stored on the custom type node
475
+ * and later passed to `toJsonSchema`.
476
+ *
477
+ * Use this to carry type-level information (e.g., a generic argument's
478
+ * resolved literal value) through the IR into schema generation.
479
+ *
480
+ * **Parameters:** typed as `unknown` because `@formspec/core` does not
481
+ * depend on the TypeScript compiler API. Implementations should cast to
482
+ * `ts.Type` and `ts.TypeChecker`. Both parameters originate from the
483
+ * host program's type checker — extensions may rely on host-program
484
+ * symbol identity.
485
+ *
486
+ * **Contract:**
487
+ * - Must be a pure function of `(type, checker)` — no I/O or shared state.
488
+ * - May be invoked multiple times for the same type (no memoization is provided).
489
+ * - Must return a JSON-serializable `ExtensionPayloadValue`. Returning live
490
+ * compiler objects (e.g., `ts.Type`) will corrupt any IR caching.
491
+ * - Errors thrown by the callback are attributed to the extension and
492
+ * reported as build diagnostics.
493
+ * - Returning `undefined` is coerced to `null` at the call site.
494
+ *
495
+ * @param type - The resolved TypeScript type (cast to `ts.Type`).
496
+ * @param checker - The TypeScript type checker (cast to `ts.TypeChecker`).
497
+ * @returns A JSON-serializable payload, or `null` if no payload can be extracted.
498
+ *
499
+ * @example
500
+ * ```typescript
501
+ * extractPayload: (type: unknown, checker: unknown) => {
502
+ * const tsType = type as ts.Type;
503
+ * const tsChecker = checker as ts.TypeChecker;
504
+ * const prop = tsType.getProperty('target');
505
+ * if (!prop) return null;
506
+ * const propType = tsChecker.getTypeOfSymbol(prop);
507
+ * return propType.isStringLiteral() ? propType.value : null;
508
+ * }
509
+ * ```
510
+ */
511
+ readonly extractPayload?: (type: unknown, checker: unknown) => ExtensionPayloadValue;
472
512
  /**
473
513
  * Converts the custom type's payload into a JSON Schema fragment.
474
514
  *
@@ -469,6 +469,46 @@ declare interface CustomTypeRegistration_2 {
469
469
  * Note: `"__integerBrand"` is reserved for the builtin Integer type.
470
470
  */
471
471
  readonly brand?: string;
472
+ /**
473
+ * Optional callback to extract a payload from the TypeScript type at
474
+ * analysis time. The returned value is stored on the custom type node
475
+ * and later passed to `toJsonSchema`.
476
+ *
477
+ * Use this to carry type-level information (e.g., a generic argument's
478
+ * resolved literal value) through the IR into schema generation.
479
+ *
480
+ * **Parameters:** typed as `unknown` because `@formspec/core` does not
481
+ * depend on the TypeScript compiler API. Implementations should cast to
482
+ * `ts.Type` and `ts.TypeChecker`. Both parameters originate from the
483
+ * host program's type checker — extensions may rely on host-program
484
+ * symbol identity.
485
+ *
486
+ * **Contract:**
487
+ * - Must be a pure function of `(type, checker)` — no I/O or shared state.
488
+ * - May be invoked multiple times for the same type (no memoization is provided).
489
+ * - Must return a JSON-serializable `ExtensionPayloadValue`. Returning live
490
+ * compiler objects (e.g., `ts.Type`) will corrupt any IR caching.
491
+ * - Errors thrown by the callback are attributed to the extension and
492
+ * reported as build diagnostics.
493
+ * - Returning `undefined` is coerced to `null` at the call site.
494
+ *
495
+ * @param type - The resolved TypeScript type (cast to `ts.Type`).
496
+ * @param checker - The TypeScript type checker (cast to `ts.TypeChecker`).
497
+ * @returns A JSON-serializable payload, or `null` if no payload can be extracted.
498
+ *
499
+ * @example
500
+ * ```typescript
501
+ * extractPayload: (type: unknown, checker: unknown) => {
502
+ * const tsType = type as ts.Type;
503
+ * const tsChecker = checker as ts.TypeChecker;
504
+ * const prop = tsType.getProperty('target');
505
+ * if (!prop) return null;
506
+ * const propType = tsChecker.getTypeOfSymbol(prop);
507
+ * return propType.isStringLiteral() ? propType.value : null;
508
+ * }
509
+ * ```
510
+ */
511
+ readonly extractPayload?: (type: unknown, checker: unknown) => ExtensionPayloadValue;
472
512
  /**
473
513
  * Converts the custom type's payload into a JSON Schema fragment.
474
514
  *
package/dist/build.d.ts CHANGED
@@ -469,6 +469,46 @@ declare interface CustomTypeRegistration_2 {
469
469
  * Note: `"__integerBrand"` is reserved for the builtin Integer type.
470
470
  */
471
471
  readonly brand?: string;
472
+ /**
473
+ * Optional callback to extract a payload from the TypeScript type at
474
+ * analysis time. The returned value is stored on the custom type node
475
+ * and later passed to `toJsonSchema`.
476
+ *
477
+ * Use this to carry type-level information (e.g., a generic argument's
478
+ * resolved literal value) through the IR into schema generation.
479
+ *
480
+ * **Parameters:** typed as `unknown` because `@formspec/core` does not
481
+ * depend on the TypeScript compiler API. Implementations should cast to
482
+ * `ts.Type` and `ts.TypeChecker`. Both parameters originate from the
483
+ * host program's type checker — extensions may rely on host-program
484
+ * symbol identity.
485
+ *
486
+ * **Contract:**
487
+ * - Must be a pure function of `(type, checker)` — no I/O or shared state.
488
+ * - May be invoked multiple times for the same type (no memoization is provided).
489
+ * - Must return a JSON-serializable `ExtensionPayloadValue`. Returning live
490
+ * compiler objects (e.g., `ts.Type`) will corrupt any IR caching.
491
+ * - Errors thrown by the callback are attributed to the extension and
492
+ * reported as build diagnostics.
493
+ * - Returning `undefined` is coerced to `null` at the call site.
494
+ *
495
+ * @param type - The resolved TypeScript type (cast to `ts.Type`).
496
+ * @param checker - The TypeScript type checker (cast to `ts.TypeChecker`).
497
+ * @returns A JSON-serializable payload, or `null` if no payload can be extracted.
498
+ *
499
+ * @example
500
+ * ```typescript
501
+ * extractPayload: (type: unknown, checker: unknown) => {
502
+ * const tsType = type as ts.Type;
503
+ * const tsChecker = checker as ts.TypeChecker;
504
+ * const prop = tsType.getProperty('target');
505
+ * if (!prop) return null;
506
+ * const propType = tsChecker.getTypeOfSymbol(prop);
507
+ * return propType.isStringLiteral() ? propType.value : null;
508
+ * }
509
+ * ```
510
+ */
511
+ readonly extractPayload?: (type: unknown, checker: unknown) => ExtensionPayloadValue;
472
512
  /**
473
513
  * Converts the custom type's payload into a JSON Schema fragment.
474
514
  *
package/dist/cli.cjs CHANGED
@@ -4440,10 +4440,22 @@ function resolveTypeNode(type, checker, file, typeRegistry, visiting, sourceNode
4440
4440
  sourceNode
4441
4441
  );
4442
4442
  if (customTypeLookup !== null) {
4443
+ const typeId = customTypeIdFromLookup(customTypeLookup);
4444
+ let payload = null;
4445
+ if (customTypeLookup.registration.extractPayload !== void 0) {
4446
+ try {
4447
+ payload = customTypeLookup.registration.extractPayload(type, checker) ?? null;
4448
+ } catch (cause) {
4449
+ throw new Error(
4450
+ `extractPayload for custom type "${customTypeLookup.registration.typeName}" in extension "${customTypeLookup.extensionId}" threw`,
4451
+ { cause }
4452
+ );
4453
+ }
4454
+ }
4443
4455
  return {
4444
4456
  kind: "custom",
4445
- typeId: customTypeIdFromLookup(customTypeLookup),
4446
- payload: null
4457
+ typeId,
4458
+ payload
4447
4459
  };
4448
4460
  }
4449
4461
  const primitiveAlias = tryResolveNamedPrimitiveAlias(