Commit 68934ac4 authored by Jiwon Kwon's avatar Jiwon Kwon
Browse files

fix: add baseUrl when relative urls are given

parent 09a99df1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ async function* generateClass(
    readonly #documentLoader?: DocumentLoader;
    readonly #contextLoader?: DocumentLoader;
    readonly #tracerProvider?: TracerProvider;
    protected readonly _baseUrl?: URL;
    readonly #warning?: {
      category: string[];
      message: string;
@@ -95,6 +96,13 @@ async function* generateClass(
    static ${emitOverride(typeUri, types)} get typeId(): URL {
      return new URL(${JSON.stringify(typeUri)});
    }

    /**
     * The base URL used for resolving relative URLs in this object.
     */
    ${emitOverride(typeUri, types)} get baseUrl(): URL | undefined {
      return this._baseUrl;
    }
  `;
  for await (const code of generateFields(typeUri, types)) yield code;
  for await (const code of generateConstructor(typeUri, types)) yield code;
+2 −0
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ export async function* generateDecoder(
      documentLoader?: DocumentLoader,
      contextLoader?: DocumentLoader,
      tracerProvider?: TracerProvider,
      baseUrl?: URL,
    } = {},
  ): Promise<${type.name}> {
    const tracerProvider = options.tracerProvider ?? trace.getTracerProvider();
@@ -324,6 +325,7 @@ export async function* generateDecoder(
      documentLoader?: DocumentLoader,
      contextLoader?: DocumentLoader,
      tracerProvider?: TracerProvider,
      baseUrl?: URL,
    } = {},
  ): Promise<${type.name}> {
    if (typeof json === "undefined") {
+2 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ export async function* generateConstructor(
      documentLoader?: DocumentLoader,
      contextLoader?: DocumentLoader,
      tracerProvider?: TracerProvider,
      baseUrl?: URL,
    } = {},
  ) {
  `;
@@ -97,6 +98,7 @@ export async function* generateConstructor(
    this.#documentLoader = options.documentLoader;
    this.#contextLoader = options.contextLoader;
    this.#tracerProvider = options.tracerProvider;
    this._baseUrl = options.baseUrl;
    if ("$warning" in options) {
      this.#warning = options.$warning as unknown as {
        category: string[];
+13 −6
Original line number Diff line number Diff line
@@ -64,7 +64,8 @@ async function* generateProperty(
        contextLoader?: DocumentLoader,
        suppressError?: boolean,
        tracerProvider?: TracerProvider,
      } = {}
        baseUrl?: URL
      } = {},
    ): Promise<${getTypeNames(property.range, types)} | null> {
      const documentLoader =
        options.documentLoader ?? this._documentLoader ?? getDocumentLoader();
@@ -76,6 +77,7 @@ async function* generateProperty(
        ${JSON.stringify(metadata.name)},
        ${JSON.stringify(metadata.version)},
      );
      const baseUrl = options.baseUrl;
      return await tracer.startActiveSpan("activitypub.lookup_object", async (span) => {
        let fetchResult: RemoteDocument;
        try {
@@ -99,7 +101,7 @@ async function* generateProperty(
        try {
          const obj = await this.#${property.singularName}_fromJsonLd(
            document,
            { documentLoader, contextLoader, tracerProvider }
            { documentLoader, contextLoader, tracerProvider, baseUrl }
          );
          span.setAttribute("activitypub.object.id", (obj.id ?? url).href);
          span.setAttribute(
@@ -133,6 +135,7 @@ async function* generateProperty(
        documentLoader?: DocumentLoader,
        contextLoader?: DocumentLoader,
        tracerProvider?: TracerProvider,
        baseUrl?: URL
      }
    ): Promise<${getTypeNames(property.range, types)}> {
      const documentLoader =
@@ -141,6 +144,7 @@ async function* generateProperty(
        options.contextLoader ?? this._contextLoader ?? getDocumentLoader();
      const tracerProvider = options.tracerProvider ??
        this._tracerProvider ?? trace.getTracerProvider();
      const baseUrl = options.baseUrl;
    `;
    for (const range of property.range) {
      if (!(range in types)) continue;
@@ -149,7 +153,7 @@ async function* generateProperty(
        try {
          return await ${rangeType.name}.fromJsonLd(
            jsonLd,
            { documentLoader, contextLoader, tracerProvider },
            { documentLoader, contextLoader, tracerProvider, baseUrl },
          );
        } catch (e) {
          if (!(e instanceof TypeError)) throw e;
@@ -190,6 +194,7 @@ async function* generateProperty(
          contextLoader?: DocumentLoader,
          suppressError?: boolean,
          tracerProvider?: TracerProvider,
          baseUrl?: URL
        } = {}
      ): Promise<${getTypeNames(property.range, types)} | null> {
        if (this._warning != null) {
@@ -221,7 +226,7 @@ async function* generateProperty(
            ${JSON.stringify(property.compactName)}];
          const obj = Array.isArray(prop) ? prop[0] : prop;
          if (obj != null && typeof obj === "object" && "@context" in obj) {
            return await this.#${property.singularName}_fromJsonLd(obj, options);
            return await this.#${property.singularName}_fromJsonLd(obj, {...options, baseUrl: options.baseUrl});
          }
        }
        `;
@@ -258,6 +263,7 @@ async function* generateProperty(
          contextLoader?: DocumentLoader,
          suppressError?: boolean,
          tracerProvider?: TracerProvider,
          baseUrl?: URL
        } = {}
      ): AsyncIterable<${getTypeNames(property.range, types)}> {
        if (this._warning != null) {
@@ -272,7 +278,7 @@ async function* generateProperty(
          if (v instanceof URL) {
            const fetched =
              await this.#fetch${pascalCase(property.singularName)}(
                v, options);
                v, {...options, baseUrl: options.baseUrl});
            if (fetched == null) continue;
            vs[i] = fetched;
            this._cachedJsonLd = undefined;
@@ -292,7 +298,8 @@ async function* generateProperty(
              ${JSON.stringify(property.compactName)}];
            const obj = Array.isArray(prop) ? prop[i] : prop;
            if (obj != null && typeof obj === "object" && "@context" in obj) {
              yield await this.#${property.singularName}_fromJsonLd(obj, options);
              yield await this.#${property.singularName}_fromJsonLd(obj, {...options, baseUrl: options.baseUrl
              });
              continue;
            }
          }
+6 −4
Original line number Diff line number Diff line
@@ -141,7 +141,7 @@ const scalarTypes: Record<string, ScalarType> = {
    dataCheck(v) {
      return `typeof ${v} === "object" && "@id" in ${v}
        && typeof ${v}["@id"] === "string"
        && ${v}["@id"] !== "" && ${v}["@id"] !== "/"`;
        && ${v}["@id"] !== ""`;
    },
    decoder(v) {
      return `${v}["@id"].startsWith("at://")
@@ -157,6 +157,8 @@ const scalarTypes: Record<string, ScalarType> = {
              : ""
          )
        )
        : ${v}["@id"].startsWith("/") && options.baseUrl
          ? new URL(options.baseUrl + ${v}["@id"])
          : new URL(${v}["@id"])`;
    },
  },
@@ -307,10 +309,10 @@ const scalarTypes: Record<string, ScalarType> = {
    dataCheck(v) {
      return `typeof ${v} === "object" && "@value" in ${v}
        && typeof ${v}["@value"] === "string"
        && ${v}["@value"] !== "" && ${v}["@value"] !== "/"`;
        && ${v}["@value"] !== ""`;
    },
    decoder(v) {
      return `new URL(${v}["@value"])`;
      return `${v}["@value"].startsWith("/") && options.baseUrl ? new URL(options.baseUrl + ${v}["@value"]) : new URL(${v}["@value"])`;
    },
  },
  "fedify:publicKey": {