ENGLISH·COURSE API
    Preparing search index...
    • The store that answers for a content key.

      Parameters

      • key: string

        The content key, exactly as it appears in the manifest

      • manifest: {
            version: 1;
            stores: Record<
                string,
                | { driver: "local"; baseUrl: string; pathPrefix: string }
                | {
                    driver: "s3";
                    bucket: string;
                    region: string;
                    endpoint?: string;
                    forcePathStyle: boolean;
                    pathPrefix: string;
                    visibility: "public" | "signed";
                    publicUrl?: string;
                    signedUrlTtlSeconds?: number;
                }
                | {
                    driver: "gcs";
                    bucket: string;
                    apiEndpoint?: string;
                    pathPrefix: string;
                    visibility: "public"
                    | "signed";
                    publicUrl?: string;
                    signedUrlTtlSeconds?: number;
                },
            >;
            default: string;
            routes: { prefix: string; store: string }[];
            overrides: Record<string, string>;
            assets: Record<string, { store?: string; objectPath?: string }>;
        }

        The parsed location manifest

        • version: 1
        • stores: Record<
              string,
              | { driver: "local"; baseUrl: string; pathPrefix: string }
              | {
                  driver: "s3";
                  bucket: string;
                  region: string;
                  endpoint?: string;
                  forcePathStyle: boolean;
                  pathPrefix: string;
                  visibility: "public" | "signed";
                  publicUrl?: string;
                  signedUrlTtlSeconds?: number;
              }
              | {
                  driver: "gcs";
                  bucket: string;
                  apiEndpoint?: string;
                  pathPrefix: string;
                  visibility: "public"
                  | "signed";
                  publicUrl?: string;
                  signedUrlTtlSeconds?: number;
              },
          >
        • default: string

          Store that answers for a key matching no override and no route.

        • routes: { prefix: string; store: string }[]
        • overrides: Record<string, string>

          Exact key → store name, for single assets that escape their prefix.

        • assets: Record<string, { store?: string; objectPath?: string }>

          Exact key → declared placement. Outranks every other layer.

      Returns string

      The name of the store that owns this key

      Resolution order is a declared assets entry, then an exact override, then the LONGEST matching route prefix, then the default. Three layers because placement comes in three shapes: a module migrates as a prefix, a stray file moves as one key, and an asset whose real path does not follow its key needs that path declared. Expressing any one through another is impractical.

      A prefix matches on path boundaries, not as a substring, so course/ never captures coursework/.