{"version":3,"sources":["../src/get-template-suggestions.ts","../src/app-client-api.ts"],"names":["getTemplateSuggestions","appClientUrl","query","fetcher","__name","checkAppClientUrl","url","theUrl","urlJoin","err","getDataStore","getAppClientData","serverDataRes","message","prepAppClientData","state","metaState","appClientDataNoMeta","prepareDataForFileSave","urlBase","body","FetcherError","submitDataForFileSave","data","getPluginContent","pluginId","renderTemplate","options","verifyFile","payload","getDiscovery","authHeader","headers","error","inspectTemplate","templateInfo"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n  EndpointPaths,\n  TemplateSuggestionsReqParams,\n  TemplateSuggestionsResBody,\n} from '@knapsack/app/api-info';\nimport { fetcher } from '@knapsack/utils';\n\nexport async function getTemplateSuggestions({\n  appClientUrl,\n  query,\n}: {\n  appClientUrl: string;\n  query: TemplateSuggestionsReqParams;\n}): Promise<TemplateSuggestionsResBody> {\n  return fetcher<TemplateSuggestionsResBody>({\n    url: new URL(\n      '/api/v1/template-suggestions' satisfies EndpointPaths,\n      appClientUrl,\n    ).toString(),\n    query,\n  });\n}\n","import {\n  type KsAppClientData,\n  type KsRenderResults,\n  type Except,\n  type GenericResponse,\n  type KsAppClientDataAndMeta,\n  type KsAppClientDataNoMeta,\n  type KsFileSaverParams,\n} from '@knapsack/types';\nimport { fetcher, FetcherError } from '@knapsack/utils';\nimport urlJoin from 'url-join';\nimport type {\n  PatternRenderData,\n  KnapsackDataStoreSaveBody,\n  EndpointPaths,\n  EndpointFiles,\n  ExtractEndpointData,\n  ExtractEndpointResBody,\n  EndpointPlugins,\n  RouteDiscovery,\n  RouteInspect,\n} from '@knapsack/app/api-info';\n\nexport type { PatternRenderData, EndpointPaths };\n\nexport async function checkAppClientUrl(url: string): Promise<GenericResponse> {\n  try {\n    const theUrl = urlJoin(url, '/api/v1' satisfies EndpointPaths);\n    const res = await fetcher<GenericResponse>({\n      url: theUrl,\n    });\n    return res;\n  } catch (err) {\n    return {\n      ok: false,\n      message: err instanceof Error ? err.message : 'Unknown error',\n    };\n  }\n}\n\nexport async function getDataStore({\n  appClientUrl,\n}: {\n  appClientUrl: string;\n}): Promise<GenericResponse<KsAppClientDataAndMeta>> {\n  try {\n    const data = await fetcher<KsAppClientDataAndMeta>({\n      url: urlJoin(appClientUrl, '/api/v1/data-store' satisfies EndpointPaths),\n    });\n\n    return {\n      ok: true,\n      data,\n    };\n  } catch (err) {\n    return {\n      ok: false,\n      message: err instanceof Error ? err.message : 'Unknown error',\n    };\n  }\n}\n\n// just need a function that can throw an error\nexport async function getAppClientData({\n  appClientUrl,\n}: {\n  appClientUrl: string;\n}): Promise<KsAppClientDataAndMeta> {\n  const serverDataRes = await getDataStore({ appClientUrl });\n  if (!serverDataRes.ok || !serverDataRes.data) {\n    const message = `We're having trouble accessing your server at ${appClientUrl}.`;\n    throw new Error(message);\n  }\n  return serverDataRes.data;\n}\n\n/** Sole job is to strip `metaState` if it's there */\nexport function prepAppClientData(\n  state: KsAppClientData,\n): KsAppClientDataNoMeta {\n  const { metaState, ...appClientDataNoMeta } = state;\n  return appClientDataNoMeta;\n}\n\nexport async function prepareDataForFileSave({\n  urlBase,\n  state,\n}: {\n  urlBase: string;\n  state: KsAppClientDataNoMeta;\n}): Promise<GenericResponse<KsFileSaverParams>> {\n  try {\n    const body: KnapsackDataStoreSaveBody = {\n      state: prepAppClientData(state),\n    };\n    const data = await fetcher<GenericResponse<KsFileSaverParams>>({\n      url: urlJoin(urlBase, '/api/v1/data-store-prep' satisfies EndpointPaths),\n      body,\n    });\n\n    return data;\n  } catch (err) {\n    if (err instanceof FetcherError) {\n      // Preserve the upstream response so the caller can log the actual\n      // headers/body of the failure instead of just \"Error 500\".\n      return {\n        ok: false,\n        message: err.message,\n        meta: {\n          status: err.status,\n          statusText: err.statusText,\n          url: err.url,\n          responseHeaders: err.responseHeaders,\n          responseBody: err.responseBody,\n        },\n      };\n    }\n    return {\n      ok: false,\n      message: err instanceof Error ? err.message : 'Unknown error',\n    };\n  }\n}\n\nexport async function submitDataForFileSave({\n  urlBase,\n  state,\n}: {\n  urlBase: string;\n  state: KsAppClientDataNoMeta;\n}): Promise<void> {\n  const appClientData = prepAppClientData(state);\n  const body: KnapsackDataStoreSaveBody = {\n    state: appClientData,\n  };\n  const data = await fetcher<GenericResponse>({\n    url: urlJoin(urlBase, '/api/v1/data-store' satisfies EndpointPaths),\n    body,\n  });\n\n  if (!data.ok) {\n    throw new Error(`Could not save data to localhost files: ${data.message}`);\n  }\n}\n\nexport async function getPluginContent({\n  pluginId,\n  appClientUrl,\n}: {\n  appClientUrl: string;\n} & Except<ExtractEndpointData<EndpointPlugins>, 'type'>): Promise<\n  ExtractEndpointResBody<EndpointPlugins>\n> {\n  return fetcher({\n    url: urlJoin(\n      appClientUrl,\n      '/api/v1/plugins' satisfies EndpointPlugins['path'],\n    ),\n    body: {\n      pluginId,\n      type: 'getContent',\n    } satisfies ExtractEndpointData<EndpointPlugins>,\n  });\n}\n\nexport async function renderTemplate({\n  options,\n  appClientUrl,\n}: {\n  options: PatternRenderData;\n  appClientUrl: string;\n}): Promise<KsRenderResults> {\n  const data = await fetcher<KsRenderResults>({\n    url: urlJoin(appClientUrl, '/api/v1/render' satisfies EndpointPaths),\n    body: options,\n  });\n  return data;\n}\n\nexport async function verifyFile({\n  appClientUrl,\n  payload,\n}: {\n  appClientUrl: string;\n  payload: ExtractEndpointData<EndpointFiles>['payload'];\n}) {\n  const data = await fetcher<ExtractEndpointResBody<EndpointFiles>>({\n    url: urlJoin(appClientUrl, '/api/v1/files' satisfies EndpointFiles['path']),\n    body: {\n      type: 'verify',\n      payload,\n    } satisfies ExtractEndpointData<EndpointFiles>,\n  });\n  return data.payload;\n}\n\nexport async function getDiscovery({\n  appClientUrl,\n  authHeader,\n}: {\n  appClientUrl: string;\n  authHeader: string;\n}): Promise<\n  | {\n      type: 'success';\n      data: RouteDiscovery['output'];\n    }\n  | { type: 'routeNotAvailable' }\n> {\n  try {\n    const headers: Record<string, string> = {};\n    if (authHeader) {\n      headers.authorization = authHeader;\n    }\n    const data = await fetcher<RouteDiscovery['output']>({\n      url: urlJoin(\n        appClientUrl,\n        '/api/v2/discovery' satisfies RouteDiscovery['path'],\n      ),\n      headers,\n    });\n    if (!data) {\n      throw new Error('No result from discovery');\n    }\n    return {\n      type: 'success',\n      data,\n    };\n  } catch (error) {\n    if (error instanceof FetcherError && error.status === 404) {\n      return {\n        type: 'routeNotAvailable',\n      };\n    }\n    // being extra cautious here to avoid throwing an error\n    return { type: 'routeNotAvailable' };\n  }\n}\n\nexport async function inspectTemplate({\n  appClientUrl,\n  templateInfo,\n  authHeader,\n}: {\n  appClientUrl: string;\n  templateInfo: RouteInspect['input'];\n  authHeader: string;\n}): Promise<RouteInspect['output']> {\n  const headers: Record<string, string> = {};\n  if (authHeader) {\n    headers.authorization = authHeader;\n  }\n  return fetcher({\n    url: urlJoin(\n      appClientUrl,\n      '/api/v2/inspect' satisfies RouteInspect['path'],\n    ),\n    query: templateInfo,\n    headers,\n  });\n}\n"]}