{"version":3,"sources":["../src/index.ts","../src/types/fs.ts","../src/types/themes.ts","../src/types/data.ts","../src/types/index.ts","../src/util/comlink.ts","../src/util/handshake.ts","../src/api/fs/index.ts","../src/api/fs/watching.ts","../src/api/replDb.ts","../src/api/me.ts","../src/api/theme.ts","../src/api/messages.ts","../src/api/data.ts","../src/api/session.ts","../src/api/experimental/index.ts","../src/api/experimental/auth.ts","../src/auth/ed25519.ts","../src/auth/base64.ts","../src/auth/verify.ts","../src/api/experimental/editor.ts","../src/api/commands.ts","../src/commands/index.ts","../src/api/internal/index.ts","../src/api/exec.ts","../src/api/debug.ts","../package.json","../src/util/patchConsole.ts"],"sourcesContent":["import { HandshakeStatus, ReplitInitArgs, ReplitInitOutput } from \"./types\";\nimport { extensionPort, proxy } from \"./util/comlink\";\nimport { getHandshakeStatus, setHandshakeStatus } from \"./util/handshake\";\nexport * from \"./api\";\nexport { extensionPort, proxy };\nexport * from \"./types\";\nexport * from \"./commands\";\nimport * as replit from \".\";\n\nimport { version } from \"../package.json\";\nimport { patchConsole } from \"./util/patchConsole\";\n\nexport { version };\n\nfunction promiseWithTimeout<T>(promise: Promise<T>, timeout: number) {\n  return Promise.race([\n    promise,\n    new Promise((_resolve, reject) =>\n      setTimeout(() => reject(new Error(\"timeout\")), timeout)\n    ),\n  ]);\n}\n\nasync function windowIsReady() {\n  return new Promise<void>((resolve) => {\n    if (document.readyState === \"complete\") {\n      resolve();\n      return;\n    }\n\n    const loadHandler = () => {\n      resolve();\n      window.removeEventListener(\"load\", loadHandler);\n    };\n\n    window.addEventListener(\"load\", loadHandler);\n  });\n}\n\nexport async function init(args?: ReplitInitArgs): Promise<ReplitInitOutput> {\n  if (extensionPort === null) {\n    throw new Error(\"Extension must be initialized in a browser context\");\n  }\n\n  const onExtensionClick = () => {\n    extensionPort.activatePane();\n  };\n\n  const windDown = () => {\n    window.document.removeEventListener(\"click\", onExtensionClick);\n  };\n\n  try {\n    if (window) {\n      await windowIsReady();\n    }\n\n    await promiseWithTimeout(\n      extensionPort.handshake({\n        clientName: \"@replit/extensions\",\n        clientVersion: version,\n      }),\n      args?.timeout || 2000\n    );\n\n    patchConsole();\n\n    setHandshakeStatus(HandshakeStatus.Ready);\n\n    if (window) {\n      window.document.addEventListener(\"click\", onExtensionClick);\n    }\n  } catch (e) {\n    setHandshakeStatus(HandshakeStatus.Error);\n    console.error(e);\n    windDown();\n    throw e;\n  }\n\n  return {\n    dispose: windDown,\n    status: getHandshakeStatus(),\n  };\n}\n","/**\n * A Filesystem node type\n */\nexport enum FsNodeType {\n  File = \"FILE\",\n  Directory = \"DIRECTORY\",\n}\n\n/**\n * A base interface for nodes, just includes\n * the type of the node and the path, This interface\n * does not expose the node's content/children\n */\nexport interface FsNode {\n  path: string;\n  type: FsNodeType;\n}\n\n/**\n * An array of Filesystem Nodes\n */\nexport type FsNodeArray = Array<FsNode>;\n\n/**\n * A directory child node - a file or a folder.\n */\nexport interface DirectoryChildNode {\n  filename: string;\n  type: FsNodeType;\n}\n\n/**\n * A file change event type\n */\nexport enum ChangeEventType {\n  Create = \"CREATE\",\n  Move = \"MOVE\",\n  Delete = \"DELETE\",\n  Modify = \"MODIFY\",\n}\n\n/**\n * Fired when a file is moved\n */\nexport interface MoveEvent {\n  eventType: ChangeEventType.Move;\n  node: FsNode;\n  to: string;\n}\n\n/**\n * Fired when a file is deleted\n */\nexport interface DeleteEvent {\n  eventType: ChangeEventType.Delete;\n  node: FsNode;\n}\n\n/**\n * Fires when a non-text file is changed\n */\nexport type WatchFileOnChangeListener<T extends string | Blob = string> = (\n  newContent: T\n) => void;\n\n/**\n * Fires when watching a non-text file fails\n */\nexport type WatchFileOnErrorListener = (error: string) => void;\n\n/**\n * Fires when a non-text file is moved or deleted\n */\nexport type WatchFileOnMoveOrDeleteListener = (\n  moveOrDeleteEvent: MoveEvent | DeleteEvent\n) => void;\n\n/**\n * A set of listeners for watching a non-text file\n */\nexport interface WatchFileListeners<T extends string | Blob = string> {\n  onChange: WatchFileOnChangeListener<T>;\n  onError?: WatchFileOnErrorListener;\n  onMoveOrDelete?: WatchFileOnMoveOrDeleteListener;\n}\n\n/**\n * A written text change for the WriteChange function exposed by WatchTextFileListeners.onReady\n */\nexport interface TextChange {\n  from: number;\n  to?: number;\n  insert?: string;\n}\n\n/**\n * Writes a change to a watched file using the TextChange interface\n */\nexport type WriteChange = (changes: TextChange | Array<TextChange>) => void;\n\n/**\n * Returns the latest content of a watched file as a string\n */\nexport type GetLatestContent = () => string;\n\n/**\n * A set of listeners and values exposed by WatchTextFileListeners.onReady\n */\nexport interface TextFileReadyEvent {\n  writeChange: WriteChange;\n  getLatestContent: GetLatestContent;\n  initialContent: string;\n}\n\n/**\n * Signifies a change when a text file's text content is updated\n */\nexport interface TextFileOnChangeEvent {\n  changes: Array<TextChange>;\n  latestContent: string;\n}\n\n/**\n * Fires when a text file watcher is ready\n */\nexport type WatchTextFileOnReadyListener = (\n  readyEvent: TextFileReadyEvent\n) => void;\n\n/**\n * Fires when a watched text file's text content is updated\n */\nexport type WatchTextFileOnChangeListener = (\n  changeEvent: TextFileOnChangeEvent\n) => void;\n\n/**\n * Fires when watching a text file fails\n */\nexport type WatchTextFileOnErrorListener = (error: string) => void;\n\n/**\n * Fires when a watched text file is moved or deleted\n */\nexport type WatchTextFileOnMoveOrDeleteListener = (\n  moveOrDeleteEvent: MoveEvent | DeleteEvent\n) => void;\n\n/**\n * A set of listeners for watching a text file\n */\nexport interface WatchTextFileListeners {\n  onReady: WatchTextFileOnReadyListener;\n  onChange?: WatchTextFileOnChangeListener;\n  onError?: WatchTextFileOnErrorListener;\n  onMoveOrDelete?: WatchTextFileOnMoveOrDeleteListener;\n}\n\n/**\n * Fires when watching a directory fails\n */\nexport type WatchDirOnErrorListener = (\n  err: Error,\n  extraInfo?: Record<string, any>\n) => void;\n\n/**\n * Fires when a directory's child nodes change\n */\nexport type WatchDirOnChangeListener = (children: FsNodeArray) => void;\n\n/**\n * Fires when a watched directory is moved or deleted\n */\nexport type WatchDirOnMoveOrDeleteListener = (\n  event: DeleteEvent | MoveEvent\n) => void;\n\n/**\n * A set of listeners for watching a directory\n */\nexport interface WatchDirListeners {\n  onChange: WatchDirOnChangeListener;\n  onMoveOrDelete?: WatchDirOnMoveOrDeleteListener;\n  onError: WatchDirOnErrorListener;\n}\n","import { User } from \"./data\";\n\n/**\n * Alias for strings\n */\nexport type CssColor = string;\n\n/**\n * Global theme values interface\n */\nexport interface ThemeValuesGlobal {\n  __typename?: string;\n  backgroundRoot: CssColor;\n  backgroundDefault: CssColor;\n  backgroundHigher: CssColor;\n  backgroundHighest: CssColor;\n  backgroundOverlay: CssColor;\n  foregroundDefault: CssColor;\n  foregroundDimmer: CssColor;\n  foregroundDimmest: CssColor;\n  outlineDimmest: CssColor;\n  outlineDimmer: CssColor;\n  outlineDefault: CssColor;\n  outlineStronger: CssColor;\n  outlineStrongest: CssColor;\n  accentPrimaryDimmest: CssColor;\n  accentPrimaryDimmer: CssColor;\n  accentPrimaryDefault: CssColor;\n  accentPrimaryStronger: CssColor;\n  accentPrimaryStrongest: CssColor;\n  accentPositiveDimmest: CssColor;\n  accentPositiveDimmer: CssColor;\n  accentPositiveDefault: CssColor;\n  accentPositiveStronger: CssColor;\n  accentPositiveStrongest: CssColor;\n  accentNegativeDimmest: CssColor;\n  accentNegativeDimmer: CssColor;\n  accentNegativeDefault: CssColor;\n  accentNegativeStronger: CssColor;\n  accentNegativeStrongest: CssColor;\n  redDimmest: CssColor;\n  redDimmer: CssColor;\n  redDefault: CssColor;\n  redStronger: CssColor;\n  redStrongest: CssColor;\n  orangeDimmest: CssColor;\n  orangeDimmer: CssColor;\n  orangeDefault: CssColor;\n  orangeStronger: CssColor;\n  orangeStrongest: CssColor;\n  yellowDimmest: CssColor;\n  yellowDimmer: CssColor;\n  yellowDefault: CssColor;\n  yellowStronger: CssColor;\n  yellowStrongest: CssColor;\n  limeDimmest: CssColor;\n  limeDimmer: CssColor;\n  limeDefault: CssColor;\n  limeStronger: CssColor;\n  limeStrongest: CssColor;\n  greenDimmest: CssColor;\n  greenDimmer: CssColor;\n  greenDefault: CssColor;\n  greenStronger: CssColor;\n  greenStrongest: CssColor;\n  tealDimmest: CssColor;\n  tealDimmer: CssColor;\n  tealDefault: CssColor;\n  tealStronger: CssColor;\n  tealStrongest: CssColor;\n  blueDimmest: CssColor;\n  blueDimmer: CssColor;\n  blueDefault: CssColor;\n  blueStronger: CssColor;\n  blueStrongest: CssColor;\n  blurpleDimmest: CssColor;\n  blurpleDimmer: CssColor;\n  blurpleDefault: CssColor;\n  blurpleStronger: CssColor;\n  blurpleStrongest: CssColor;\n  purpleDimmest: CssColor;\n  purpleDimmer: CssColor;\n  purpleDefault: CssColor;\n  purpleStronger: CssColor;\n  purpleStrongest: CssColor;\n  magentaDimmest: CssColor;\n  magentaDimmer: CssColor;\n  magentaDefault: CssColor;\n  magentaStronger: CssColor;\n  magentaStrongest: CssColor;\n  pinkDimmest: CssColor;\n  pinkDimmer: CssColor;\n  pinkDefault: CssColor;\n  pinkStronger: CssColor;\n  pinkStrongest: CssColor;\n  greyDimmest: CssColor;\n  greyDimmer: CssColor;\n  greyDefault: CssColor;\n  greyStronger: CssColor;\n  greyStrongest: CssColor;\n  brownDimmest: CssColor;\n  brownDimmer: CssColor;\n  brownDefault: CssColor;\n  brownStronger: CssColor;\n  brownStrongest: CssColor;\n  black: CssColor;\n  white: CssColor;\n}\n\n/**\n * Enumerated Color Scheme\n */\nexport enum ColorScheme {\n  Light = \"light\",\n  Dark = \"dark\",\n}\n\n/**\n * Custom Theme GraphQL type\n */\nexport interface CustomTheme {\n  author: User;\n  colorScheme: ColorScheme;\n  hasUnpublishedChanges: boolean;\n  id: number;\n  isCurrentUserThemeAuthor: boolean;\n  isInstalledByCurrentUser: boolean;\n  latestThemeVersion: ThemeVersion;\n  numInstalls?: number;\n  slug?: string;\n  status?: \"public\" | \"private\";\n  title?: string;\n}\n\n/**\n * Theme Syntax Highlighting Tag\n */\nexport interface ThemeSyntaxHighlightingTag {\n  __typename: string;\n  name: string;\n  modifiers: null | Array<string>;\n}\n\n/**\n * Theme Syntax Highlighting Modifier\n */\nexport interface ThemeSyntaxHighlightingModifier {\n  textDecoration?: string;\n  fontSize?: string;\n  fontWeight?: string;\n  fontStyle?: string;\n  color?: string;\n}\n\n/**\n * Theme Editor Syntax Highlighting\n */\nexport interface ThemeEditorSyntaxHighlighting {\n  __typename: string;\n  tags: Array<ThemeSyntaxHighlightingTag>;\n  values: ThemeSyntaxHighlightingModifier;\n}\n\n/**\n * Editor Theme Values, an array of ThemeEditorSyntaxHighlighting\n */\nexport interface ThemeValuesEditor {\n  syntaxHighlighting: Array<ThemeEditorSyntaxHighlighting>;\n}\n\n/**\n * Both global and editor theme values\n */\nexport interface ThemeValues {\n  __typename?: string;\n  editor: ThemeValuesEditor;\n  global: ThemeValuesGlobal;\n}\n\n/**\n * Theme Version GraphQL type\n */\nexport interface ThemeVersion {\n  __typename?: string;\n  id: number;\n  hue: number;\n  lightness: number;\n  saturation: number;\n  timeUpdated?: string;\n  description?: string;\n  customTheme?: CustomTheme;\n  values?: ThemeValues;\n}\n\n/**\n * Fires with the new theme values when the current theme changes\n */\nexport type OnThemeChangeValuesListener = (values: ThemeValuesGlobal) => void;\n\n/**\n * Fires with the new theme data when the current theme changes\n */\nexport type OnThemeChangeListener = (theme: ThemeVersion) => void;\n","/**\n * A Replit user\n */\nexport interface User {\n  id: number;\n  username: string;\n  image: string;\n  bio?: string;\n\n  // SocialUserData fragment\n  url?: string;\n  socials?: Array<UserSocial>;\n  firstName?: string;\n  lastName?: string;\n  displayName?: string;\n  fullName?: string;\n  followCount?: number;\n  followerCount?: number;\n\n  // PlanUserData fragment\n  isUserHacker?: boolean;\n  isUserPro?: boolean;\n\n  // RolesUserData fragment\n  roles?: Array<UserRole>;\n}\n\n/**\n * Extended values for the current user\n */\nexport interface CurrentUser extends User {}\n\n/**\n * A user social media link\n */\nexport interface UserSocial {\n  id: number;\n  url: string;\n  type: UserSocialType;\n}\n\n/**\n * An enumerated type of social media links\n */\nexport enum UserSocialType {\n  twitter = \"twitter\",\n  github = \"github\",\n  linkedin = \"linkedin\",\n  website = \"website\",\n  youtube = \"youtube\",\n  twitch = \"twitch\",\n  facebook = \"facebook\",\n  discord = \"discord\",\n}\n\n/**\n * A user role\n */\nexport interface UserRole {\n  id: number;\n  name: string;\n  key: string;\n  tagline: string;\n}\n\n/**\n * A Repl\n */\nexport interface Repl {\n  id: string;\n  url: string;\n  title: string;\n  description: string;\n  timeCreated: string;\n  slug: string;\n  isPrivate: boolean;\n\n  // SocialReplData fragment\n  likeCount?: number;\n  publicForkCount?: number;\n  runCount?: number;\n  commentCount?: number;\n  tags?: Array<Tag>;\n  iconUrl?: string;\n  imageUrl?: string;\n\n  // CommentsReplData fragment\n  comments?: ReplCommentConnection;\n\n  // OwnerData fragment\n  owner?: ReplOwner;\n\n  // MultiplayersData fragment\n  multiplayers?: Array<User>;\n}\n\n/**\n * A Repl Owner, can be either a User or a Team\n */\nexport interface ReplOwner {\n  id: number;\n  username: string;\n  image: string;\n  __typename: string;\n  description?: string;\n}\n\n/**\n * A Repl tag\n */\nexport interface Tag {\n  id: string;\n  isOfficial: boolean;\n}\n\n/**\n * A Repl Comment\n */\nexport interface ReplComment {\n  id: number;\n  body: string;\n  user: User;\n}\n\n/**\n * An array of ReplComments as items\n */\nexport interface ReplCommentConnection {\n  items: Array<ReplComment>;\n}\n\n/**\n * Editor Preferences\n */\nexport interface EditorPreferences {\n  __typename: string;\n  fontSize: number;\n  indentIsSpaces: boolean;\n  indentSize: number;\n  keyboardHandler: string;\n  wrapping: boolean;\n  codeIntelligence: boolean;\n  codeSuggestion: boolean;\n  multiselectModifierKey: string;\n  minimapDisplay: string;\n}\n\n/**\n * Options for user queries\n */\nexport interface UserDataInclusion {\n  includeSocialData?: boolean;\n  includeRoles?: boolean;\n  includePlan?: boolean;\n}\n\n/**\n * Options for the currentUser query\n */\nexport interface CurrentUserDataInclusion {\n  includeSocialData?: boolean;\n  includeRoles?: boolean;\n  includePlan?: boolean;\n}\n\n/**\n * Options for repl queries\n */\nexport interface ReplDataInclusion {\n  includeSocialData?: boolean;\n  includeComments?: boolean;\n  includeOwner?: boolean;\n  includeMultiplayers?: boolean;\n}\n\n/**\n * A graphql response\n */\nexport type GraphResponse<T> = Promise<T | never>;\n\n/**\n * A graphql response for the repl query\n */\nexport type ReplQueryOutput = GraphResponse<{ repl: Repl }>;\n\n/**\n * A graphql response for the userByUsername query\n */\nexport type UserByUsernameQueryOutput = GraphResponse<{ userByUsername: User }>;\n\n/**\n * A graphql response for the user query\n */\nexport type UserQueryOutput = GraphResponse<{ user: User }>;\n\n/**\n * A graphql response for the currentUser query\n */\nexport type CurrentUserQueryOutput = GraphResponse<{ user: CurrentUser }>;\n","import {\n  DirectoryChildNode,\n  WatchFileListeners,\n  WatchTextFileListeners,\n  WatchDirListeners,\n} from \"./fs\";\nimport {\n  UserDataInclusion,\n  UserQueryOutput,\n  UserByUsernameQueryOutput,\n  ReplDataInclusion,\n  ReplQueryOutput,\n  CurrentUserQueryOutput,\n  CurrentUserDataInclusion,\n  EditorPreferences,\n} from \"./data\";\nimport {\n  ThemeValuesGlobal,\n  ThemeVersion,\n  OnThemeChangeValuesListener,\n  OnThemeChangeListener,\n} from \"./themes\";\nimport { OnActiveFileChangeListener } from \"./session\";\nimport Comlink from \"comlink\";\nimport { Data } from \"../api/debug\";\nimport { CommandFnArgs, CommandProxy, CreateCommand } from \"../commands\";\n\nexport * from \"./fs\";\nexport * from \"./themes\";\nexport * from \"./data\";\nexport * from \"./session\";\nexport * from \"./exec\";\nexport * from \"./auth\";\n\n/**\n * An enumerated set of values for the Handshake between the workspace and an extension\n */\nexport enum HandshakeStatus {\n  Ready = \"ready\",\n  Error = \"error\",\n  Loading = \"loading\",\n}\n\n/**\n * The Replit init() function arguments\n */\nexport interface ReplitInitArgs {\n  timeout?: number;\n}\n\n/**\n * The output of the Replit init() function\n */\nexport interface ReplitInitOutput {\n  dispose: () => void;\n  status: HandshakeStatus;\n}\n\n/**\n * A cleanup/disposer function (void)\n */\nexport type DisposerFunction = () => void;\n\n/**\n * The Extension Port\n */\nexport type ExtensionPortAPI = {\n  handshake: (handshakeArgs: { clientName: string; clientVersion: string }) => {\n    success: true;\n  };\n\n  // fs Module\n  readFile: (\n    path: string,\n    encoding: \"utf8\" | \"binary\" | null\n  ) => Promise<\n    | { content: string }\n    | {\n        error: string;\n      }\n  >;\n  writeFile: (\n    path: string,\n    content: string | Blob\n  ) => Promise<\n    | { success: boolean }\n    | {\n        error: string;\n      }\n  >;\n  readDir: (path: string) => Promise<{\n    children: Array<DirectoryChildNode>;\n    error: string;\n  }>;\n  createDir: (path: string) => Promise<{\n    success: boolean;\n    error: string | null;\n  }>;\n  deleteFile: (path: string) => Promise<\n    | {}\n    | {\n        error: string;\n      }\n  >;\n  deleteDir: (path: string) => Promise<\n    | {}\n    | {\n        error: string;\n      }\n  >;\n  move: (\n    path: string,\n    to: string\n  ) => Promise<{\n    success: boolean;\n    error: string | null;\n  }>;\n  copyFile: (\n    path: string,\n    to: string\n  ) => Promise<{\n    success: boolean;\n    error: string | null;\n  }>;\n  watchFile: (\n    path: string,\n    watcher: WatchFileListeners,\n    encoding: \"utf8\" | \"binary\" | null\n  ) => DisposerFunction;\n  watchTextFile: (path: string, watcher: WatchTextFileListeners) => () => void;\n  watchDir: (path: string, watcher: WatchDirListeners) => DisposerFunction;\n\n  // replDb Module\n  setReplDbValue: (key: string, value: string) => Promise<void>;\n  getReplDbValue: (key: string) =>\n    | {\n        error: string | null;\n      }\n    | string;\n  listReplDbKeys: (prefix: string) => Promise<\n    | { keys: string[] }\n    | {\n        error: string;\n      }\n  >;\n  deleteReplDbKey: (key: string) => Promise<void>;\n\n  activatePane: () => Promise<void>;\n\n  // theme\n  getCurrentThemeValues: () => Promise<ThemeValuesGlobal>;\n  onThemeChangeValues: (\n    callback: OnThemeChangeValuesListener\n  ) => Promise<DisposerFunction>;\n  getCurrentTheme: () => Promise<ThemeVersion>;\n  onThemeChange: (callback: OnThemeChangeListener) => Promise<DisposerFunction>;\n\n  filePath: string;\n\n  // messages Module\n  showConfirm: (text: string, length?: number) => string;\n  showError: (text: string, length?: number) => string;\n  showNotice: (text: string, length?: number) => string;\n  showWarning: (text: string, length?: number) => string;\n  hideMessage: (id: string) => void;\n  hideAllMessages: () => void;\n\n  // data Module\n  currentUser: (args: CurrentUserDataInclusion) => CurrentUserQueryOutput;\n  userById: (args: { id: number } & UserDataInclusion) => UserQueryOutput;\n  userByUsername: (\n    args: { username: string } & UserDataInclusion\n  ) => UserByUsernameQueryOutput;\n  currentRepl: (args: ReplDataInclusion) => ReplQueryOutput;\n  replById: (args: { id: string } & ReplDataInclusion) => ReplQueryOutput;\n  replByUrl: (args: { url: string } & ReplDataInclusion) => ReplQueryOutput;\n\n  // session Module\n  watchActiveFile: (callback: OnActiveFileChangeListener) => DisposerFunction;\n  getActiveFile: () => Promise<string | null>;\n\n  commands: {\n    registerCommand: (command: CommandProxy) => void;\n    registerCreateCommand: (\n      data: {\n        commandId: string;\n        contributions: Array<string>;\n      },\n      create: (createArgs: CommandFnArgs) => Promise<CommandProxy | null>\n    ) => void;\n  };\n\n  experimental: ExperimentalAPI;\n  internal: InternalAPI;\n  debug: DebugAPI;\n\n  exec: (args: {\n    splitStderr?: boolean;\n    args: Array<string>;\n    env?: {\n      [key: string]: string;\n    };\n    onOutput: (output: string) => void;\n    onStdErr: (stderr: string) => void;\n    onError: (error: string) => void;\n  }) => Promise<{\n    dispose: () => void;\n    promise: Promise<{\n      exitCode: number;\n      error: string | null;\n    }>;\n  }>;\n};\n\nexport type ExperimentalAPI = {\n  editor: {\n    getPreferences: () => Promise<EditorPreferences>;\n  };\n\n  auth: {\n    getAuthToken: () => Promise<string>;\n  };\n};\n\nexport type DebugAPI = {\n  info: (message: string, data?: Data) => Promise<void>;\n  warn: (message: string, data?: Data) => Promise<void>;\n  error: (message: string, data?: Data) => Promise<void>;\n};\n\nexport type InternalAPI = {};\n\nexport type Promisify<T> = T extends Promise<unknown> ? T : Promise<T>;\n\nexport type RemoteProperty<T> = T extends Function | Comlink.ProxyMarked\n  ? Comlink.Remote<T>\n  : T extends object\n  ? T\n  : Promisify<T>; //  We don't want to promisify objects, but we do want to promisify all other primitives\n\nexport type RemoteObject<T> = {\n  [P in keyof T]: RemoteProperty<T[P]>;\n};\n\nexport type ExtensionPort = RemoteObject<ExtensionPortAPI>;\n","import * as Comlink from \"comlink\";\nimport { ExtensionPort } from \"../types\";\n\nexport const extensionPort = (() =>\n  typeof window !== \"undefined\"\n    ? (Comlink.wrap(\n        Comlink.windowEndpoint(self.parent, self, \"*\")\n      ) as any as ExtensionPort)\n    : null)() as ExtensionPort;\n\nexport const proxy = Comlink.proxy;\nexport const releaseProxy = Comlink.releaseProxy;\n","import { HandshakeStatus } from \"../types\";\n\nlet handshakeStatus: HandshakeStatus = HandshakeStatus.Loading;\n\nexport const setHandshakeStatus = (status: HandshakeStatus) => {\n  handshakeStatus = status;\n};\n\nexport const getHandshakeStatus = () => handshakeStatus;\n","import { extensionPort, proxy } from \"../..//util/comlink\";\nimport {\n  WatchDirListeners,\n  WatchFileListeners,\n  WatchTextFileListeners,\n} from \"../../types\";\nimport { fileWatcherManager } from \"./watching\";\n\n/**\n * Reads the file specified at `path` and returns an object containing the contents, or an object containing an error if there was one. Required [permissions](/extensions/api/manifest#scopetype): `read`.\n */\nexport async function readFile(\n  path: string,\n  encoding: \"utf8\" | \"binary\" | null = \"utf8\"\n) {\n  return extensionPort.readFile(path, encoding);\n}\n\n/**\n * Writes the file specified at `path` with the contents `content`. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function writeFile(path: string, content: string | Blob) {\n  return extensionPort.writeFile(path, content);\n}\n\n/**\n * Reads the directory specified at `path` and returns an object containing the contents, or an object containing an error if there was one. Required [permissions](/extensions/api/manifest#scopetype): `read`.\n */\nexport async function readDir(path: string) {\n  return extensionPort.readDir(path);\n}\n\n/**\n * Creates a directory at the specified path. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function createDir(path: string) {\n  return extensionPort.createDir(path);\n}\n\n/**\n * Deletes the file at the specified path. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function deleteFile(path: string) {\n  return extensionPort.deleteFile(path);\n}\n\n/**\n * Deletes the directory at the specified path. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function deleteDir(path: string) {\n  return extensionPort.deleteDir(path);\n}\n\n/**\n * Moves the file or directory at `from` to `to`. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function move(path: string, to: string) {\n  return extensionPort.move(path, to);\n}\n\n/**\n * Copies the file at `from` to `to`. Required [permissions](/extensions/api/manifest#scopetype): `read`, `write-exec`.\n */\nexport async function copyFile(path: string, to: string) {\n  return extensionPort.copyFile(path, to);\n}\n\n/**\n * Watches the file at `path` for changes with the provided `listeners`. Returns a dispose method which cleans up the listeners. Required [permissions](/extensions/api/manifest#scopetype): `read`.\n */\nexport async function watchFile(\n  path: string,\n  listeners: WatchFileListeners,\n  encoding: \"utf8\" | \"binary\" = \"binary\"\n) {\n  // Note: comlink does not let us test for functions being present, so we provide default functions for all callbacks in case the user does not pass those, to keep the API flexible\n  return extensionPort.watchFile(\n    path,\n    proxy({\n      onMoveOrDelete: () => {},\n      onError: () => {},\n      ...listeners,\n    }),\n    encoding\n  );\n}\n\n/**\n * Watches file events (move, create, delete) in the specified directory at the given `path`. Returns a dispose method which cleans up the listeners. Required [permissions](/extensions/api/manifest#scopetype): `read`.\n */\nexport async function watchDir(path: string, listeners: WatchDirListeners) {\n  return extensionPort.watchDir(\n    path,\n    proxy({\n      onMoveOrDelete: () => {},\n      ...listeners,\n    })\n  );\n}\n\n/**\n * Watches a text file at `path` for changes with the provided `listeners`. Returns a dispose method which cleans up the listeners.\n *\n * Use this for watching text files, and receive changes as versioned operational transform (OT) operations annotated with their source.\n *\n * Required [permissions](/extensions/api/manifest#scopetype): `read`.\n */\nexport function watchTextFile(path: string, listeners: WatchTextFileListeners) {\n  return fileWatcherManager.watch(path, listeners);\n}\n","import { ChangeSet, ChangeSpec, Text } from \"@codemirror/state\";\nimport { extensionPort, proxy } from \"../../util/comlink\";\nimport { TextChange, WatchTextFileListeners } from \"../../types\";\n\n/**\n * A helper to change a ChangeSet into a simpler serializable & human readable format\n */\nfunction changeSetToSimpleTextChange(changes: ChangeSet): Array<TextChange> {\n  const simpleChanges: Array<TextChange> = [];\n\n  changes.iterChanges((fromA, toA, _fromB, _toB, text) => {\n    const change: TextChange = { from: fromA };\n\n    if (toA > fromA) {\n      change.to = toA;\n    }\n\n    if (text.length) {\n      change.insert = text.sliceString(0);\n    }\n\n    simpleChanges.push(change);\n  });\n\n  return simpleChanges;\n}\n\n/**\n * watches a file via comlink, notifies listeners about changes.\n * it handles synchronization between local and remote text states.\n * properly disposes resources when no longer needed.\n */\nclass TextFileWatcher {\n  /*\n   * TODO: what do we do with out of order messages, postMessage has no guarantees of order\n   * TODO: we need versioning to guarantee correctness. Related to above, using async/await doesn't guarantee that our change got applied before the next incoming change and vice versa\n   */\n  private state: {\n    localText: Text;\n    remoteText: Text;\n    unconfirmedChanges: Set<{ changes: ChangeSet }>;\n    requestWriteChange: (changes: ChangeSpec) => Promise<void>;\n  } | null;\n  private isDisposed: boolean;\n  public dispose: () => void;\n\n  constructor(\n    private path: string,\n    private listeners: {\n      onReady: () => void;\n      onChange: NonNullable<WatchTextFileListeners[\"onChange\"]>;\n      onMoveOrDelete: NonNullable<WatchTextFileListeners[\"onMoveOrDelete\"]>;\n      onError: NonNullable<WatchTextFileListeners[\"onError\"]>;\n    }\n  ) {\n    this.state = null;\n    this.isDisposed = false;\n    this.dispose = () => {\n      this.isDisposed = true;\n    };\n\n    if (!extensionPort) {\n      throw new Error(\"Expected extensionPort\");\n    }\n\n    extensionPort\n      .watchTextFile(\n        this.path,\n        proxy({\n          onReady: this.handleReady.bind(this) as any, // wrongly typed at extensionPort\n          onChange: this.handleChange.bind(this),\n          onMoveOrDelete: (event) => {\n            listeners.onMoveOrDelete(event);\n          },\n          onError: (error) => {\n            listeners.onError(error);\n          },\n        })\n      )\n      .then((portDispose) => {\n        if (this.isDisposed) {\n          portDispose();\n\n          return;\n        }\n\n        this.dispose = () => {\n          this.isDisposed = true;\n          portDispose();\n        };\n      });\n  }\n\n  public writeChange(changes: ChangeSpec) {\n    if (this.isDisposed) {\n      throw new Error(\"Wrote change on a disposed TextFileWatcher\");\n    }\n\n    if (!this.state) {\n      throw new Error(\"Tried to write changes before ready\");\n    }\n\n    const changeSet = ChangeSet.of(changes, this.state.localText.length);\n    this.state.localText = changeSet.apply(this.state.localText);\n\n    this.enqueueChangeSet(changeSet);\n  }\n\n  public getLatestContent() {\n    if (this.isDisposed) {\n      throw new Error(\"Cannot get content of a disposed TextFileWatcher\");\n    }\n\n    if (!this.state) {\n      throw new Error(\"Called getLatestContent on an unready TextFileWatcher\");\n    }\n\n    return this.state.localText.sliceString(0);\n  }\n\n  public getIsReady() {\n    if (this.isDisposed) {\n      throw new Error(\"Cannot get isReady of a disposed TextFileWatcher\");\n    }\n\n    return Boolean(this.state);\n  }\n\n  private async handleReady({\n    writeChange,\n    initialContent,\n  }: {\n    writeChange: (changes: ChangeSpec) => Promise<void>;\n    initialContent: Promise<string>;\n  }) {\n    if (this.isDisposed) {\n      return;\n    }\n\n    const content = Text.of((await initialContent).split(\"\\n\"));\n    this.state = {\n      requestWriteChange: writeChange,\n      localText: content,\n      remoteText: content,\n      unconfirmedChanges: new Set(),\n    };\n\n    this.listeners.onReady();\n  }\n\n  private handleChange({ changes: changeJSON }: { changes: any }) {\n    if (this.isDisposed) {\n      return;\n    }\n\n    if (!this.state) {\n      throw new Error(\"unexpected handleOnChange called before handleOnReady\");\n    }\n\n    let changes = ChangeSet.fromJSON(changeJSON);\n\n    this.state.remoteText = changes.apply(this.state.remoteText);\n\n    for (const unconfirmed of this.state.unconfirmedChanges) {\n      const unconfirmedUpdated = unconfirmed.changes.map(changes);\n      changes = changes.map(unconfirmed.changes, true);\n      unconfirmed.changes = unconfirmedUpdated;\n    }\n\n    this.state.localText = changes.apply(this.state.localText);\n\n    this.listeners.onChange({\n      changes: changeSetToSimpleTextChange(changes),\n      latestContent: this.getLatestContent(),\n    });\n  }\n\n  private async enqueueChangeSet(changes: ChangeSet) {\n    if (this.isDisposed) {\n      throw new Error(\"Wrote change on a disposed TextFileWatcher\");\n    }\n\n    if (!this.state) {\n      throw new Error(\"Tried to write changes before ready\");\n    }\n\n    // Store in a ref since the ChangeSet is immutable, and it will change when fastfowarded\n    const ref = { changes };\n    this.state.unconfirmedChanges.add(ref);\n    await this.state.requestWriteChange(\n      changeSetToSimpleTextChange(ref.changes)\n    );\n\n    this.state.unconfirmedChanges.delete(ref);\n    this.state.remoteText = ref.changes.apply(this.state.remoteText);\n  }\n}\n\n/**\n * A class that manages multiple `TextFileWatcher` instances\n * ensuring that there's only one watcher per file to make sure\n * we are handling synchronization properly, having multiple watchers\n * will cause issues with the `TextFileWatcher` implementation.\n * Notifies listeners when a file is ready or when there are changes.\n * Automatically disposes watchers when there are no more listeners.\n * This should be a singleton, but it's not enforced for testability.\n */\nclass FileWatcherManager {\n  private files: Map<\n    string,\n    {\n      listeners: Set<WatchTextFileListeners>;\n      watcher: TextFileWatcher;\n    }\n  >;\n\n  constructor() {\n    this.files = new Map();\n  }\n\n  public watch(path: string, listeners: WatchTextFileListeners) {\n    if (this.files.has(path)) {\n      this.watchExisting(path, listeners);\n    } else {\n      this.watchNew(path, listeners);\n    }\n\n    return () => {\n      const file = this.files.get(path);\n\n      if (!file) {\n        return;\n      }\n\n      file.listeners.delete(listeners);\n      if (file.listeners.size === 0) {\n        this.dispose(path);\n      }\n    };\n  }\n\n  private dispose(path: string) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      return;\n    }\n\n    file.watcher.dispose();\n    this.files.delete(path);\n  }\n\n  private watchNew(path: string, listeners: WatchTextFileListeners) {\n    const watcher = new TextFileWatcher(path, {\n      onReady: () => {\n        this.handleReady(path);\n      },\n      onChange: (changeEvent) => {\n        this.handleChange(path, changeEvent);\n      },\n      onMoveOrDelete: (event) => {\n        this.handleMoveOrDelete(path, event);\n      },\n      onError: (error) => {\n        this.handleError(path, error);\n      },\n    });\n\n    this.files.set(path, {\n      listeners: new Set([listeners]),\n      watcher,\n    });\n  }\n\n  private watchExisting(path: string, listeners: WatchTextFileListeners) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      throw new Error(\"file is not watched\");\n    }\n\n    file.listeners.add(listeners);\n  }\n\n  private handleChange(\n    path: string,\n    changeEvent: Parameters<NonNullable<WatchTextFileListeners[\"onChange\"]>>[0]\n  ) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      throw new Error(\"Unexpected change on a non-watched file\");\n    }\n\n    if (!file.watcher.getIsReady()) {\n      throw new Error(\"Unexpected change on a non-ready file\");\n    }\n\n    for (const { onChange } of file.listeners) {\n      if (!onChange) {\n        continue;\n      }\n\n      onChange(changeEvent);\n    }\n  }\n\n  private handleReady(path: string) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      throw new Error(\"Unexpected change on a non-watched file\");\n    }\n\n    if (!file.watcher.getIsReady()) {\n      throw new Error(\"Got ready on a non-ready file :/\");\n    }\n\n    const initialContent = file.watcher.getLatestContent();\n    for (const { onReady, onChange } of file.listeners) {\n      onReady({\n        initialContent,\n        getLatestContent: () => file.watcher.getLatestContent(),\n        writeChange: (changes: TextChange | Array<TextChange>) => {\n          file.watcher.writeChange(changes);\n\n          for (const { onChange: otherOnChange } of file.listeners) {\n            if (onChange === otherOnChange) {\n              // we don't want to notify the originator, they already know about the change\n              continue;\n            }\n\n            if (!otherOnChange) {\n              continue;\n            }\n\n            otherOnChange({\n              changes: Array.isArray(changes) ? changes : [changes],\n              latestContent: file.watcher.getLatestContent(),\n            });\n          }\n        },\n      });\n    }\n  }\n\n  private handleError(path: string, error: string) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      throw new Error(\"Unexpected error on a non-watched file\");\n    }\n\n    for (const { onError } of file.listeners) {\n      if (!onError) {\n        continue;\n      }\n\n      onError(error);\n    }\n\n    this.dispose(path);\n  }\n\n  private handleMoveOrDelete(\n    path: string,\n    event: Parameters<NonNullable<WatchTextFileListeners[\"onMoveOrDelete\"]>>[0]\n  ) {\n    const file = this.files.get(path);\n\n    if (!file) {\n      throw new Error(\"Unexpected move or delete event on a non-watched file\");\n    }\n\n    for (const { onMoveOrDelete } of file.listeners) {\n      if (!onMoveOrDelete) {\n        continue;\n      }\n\n      onMoveOrDelete(event);\n    }\n\n    this.dispose(path);\n  }\n}\n\nexport const fileWatcherManager = new FileWatcherManager();\n","import { extensionPort } from \"../util/comlink\";\n\n/**\n * Sets the value for a given key. Required [permissions](/extensions/api/manifest#scopetype): `repldb:read`, `repldb:write`.\n */\nexport async function set(args: { key: string; value: any }) {\n  return extensionPort.setReplDbValue(args.key, args.value);\n}\n\n/**\n * Returns a value associated with the given key. Required [permissions](/extensions/api/manifest#scopetype): `repldb:read`.\n */\nexport async function get(args: { key: string }) {\n  return extensionPort.getReplDbValue(args.key);\n}\n\n/**\n * Lists keys in the replDb. Accepts an optional `prefix`, which filters for keys beginning with the given prefix. Required [permissions](/extensions/api/manifest#scopetype): `repldb:read`.\n */\nexport async function list(args: { prefix?: string } = {}) {\n  return extensionPort.listReplDbKeys(args?.prefix || \"\");\n}\n\n/**\n * Deletes a key in the replDb. Required [permissions](/extensions/api/manifest#scopetype): `repldb:read`, `repldb:write`.\n */\nexport async function del(args: { key: string }) {\n  return extensionPort.deleteReplDbKey(args.key);\n}\n","import { extensionPort } from \"../util/comlink\";\n\n/**\n * Returns the path to the current file the extension is opened with, if it is a [File Handler](/extensions/basics/key-concepts#file-handler).\n */\nexport function filePath() {\n  return extensionPort.filePath;\n}\n","import { proxy } from \"comlink\";\nimport {\n  DisposerFunction,\n  OnThemeChangeListener,\n  OnThemeChangeValuesListener,\n  ThemeValuesGlobal,\n} from \"../types\";\nimport { extensionPort } from \"../util/comlink\";\n\n/**\n * Returns all metadata on the current theme including syntax highlighting, description, HSL, token values, and more.\n */\nexport async function getCurrentTheme() {\n  return await extensionPort.getCurrentTheme();\n}\n\n/**\n * Returns the current theme's global token values.\n */\nexport async function getCurrentThemeValues(): Promise<ThemeValuesGlobal> {\n  return await extensionPort.getCurrentThemeValues();\n}\n\n/**\n * Fires the `callback` parameter function with the updated theme when the user's theme changes.\n */\nexport async function onThemeChange(\n  callback: OnThemeChangeListener\n): Promise<DisposerFunction> {\n  return await extensionPort.onThemeChange(proxy(callback));\n}\n\n/**\n * Fires the `callback` parameter function with the updated theme values when the user's theme changes.\n */\nexport async function onThemeChangeValues(\n  callback: OnThemeChangeValuesListener\n): Promise<DisposerFunction> {\n  return await extensionPort.onThemeChangeValues(proxy(callback));\n}\n","import { extensionPort } from \"../util/comlink\";\n\n/**\n * Shows a confirmation toast message within the Replit workspace for `length` milliseconds.  Returns the ID of the message as a UUID\n */\nexport const showConfirm = async (str: string, length: number = 4000) => {\n  if (typeof str !== \"string\") {\n    throw new Error(\"Messages must be strings\");\n  }\n\n  return extensionPort.showConfirm(str, length);\n};\n\n/**\n * Shows an error toast message within the Replit workspace for `length` milliseconds.  Returns the ID of the message as a UUID\n */\nexport const showError = async (str: string, length: number = 4000) => {\n  if (typeof str !== \"string\") {\n    throw new Error(\"Messages must be strings\");\n  }\n\n  return extensionPort.showError(str, length);\n};\n\n/**\n * Shows a notice toast message within the Replit workspace for `length` milliseconds.  Returns the ID of the message as a UUID\n */\nexport const showNotice = async (str: string, length: number = 4000) => {\n  if (typeof str !== \"string\") {\n    throw new Error(\"Messages must be strings\");\n  }\n\n  return extensionPort.showNotice(str, length);\n};\n\n/**\n * Shows a warning toast message within the Replit workspace for `length` milliseconds.  Returns the ID of the message as a UUID\n */\nexport const showWarning = async (str: string, length: number = 4000) => {\n  if (typeof str !== \"string\") {\n    throw new Error(\"Messages must be strings\");\n  }\n\n  return extensionPort.showWarning(str, length);\n};\n\n/**\n * Hides a message by its IDs\n */\nexport const hideMessage = async (id: string) => {\n  return extensionPort.hideMessage(id);\n};\n\n/**\n * Hides all toast messages visible on the screens\n */\nexport const hideAllMessages = async () => {\n  return extensionPort.hideAllMessages();\n};\n","import {\n  ReplDataInclusion,\n  UserDataInclusion,\n  CurrentUserDataInclusion,\n} from \"../types\";\nimport { extensionPort } from \"../util/comlink\";\n\n/**\n * Fetches the current user via graphql\n */\nexport async function currentUser(args: CurrentUserDataInclusion = {}) {\n  return await extensionPort.currentUser(args);\n}\n\n/**\n * Fetches a user by their id via graphql\n */\nexport async function userById(args: { id: number } & UserDataInclusion) {\n  if (typeof args.id !== \"number\") {\n    throw new Error(\n      `Query parameter \"id\" must be a number.  Found type ${typeof args.id} instead.`\n    );\n  }\n\n  return await extensionPort.userById(args);\n}\n\n/**\n * Fetches a user by their username via graphql\n */\nexport async function userByUsername(\n  args: { username: string } & UserDataInclusion\n) {\n  if (typeof args.username !== \"string\") {\n    throw new Error(\n      `Query parameter \"username\" must be a string.  Found type ${typeof args.username} instead.`\n    );\n  }\n\n  return await extensionPort.userByUsername(args);\n}\n\n/**\n * Fetches the current Repl via graphql\n */\nexport async function currentRepl(args: ReplDataInclusion = {}) {\n  return await extensionPort.currentRepl(args);\n}\n\n/**\n * Fetches a Repl by its ID via graphql\n */\nexport async function replById(args: { id: string } & ReplDataInclusion) {\n  if (typeof args.id !== \"string\") {\n    throw new Error(\n      `Query parameter \"id\" must be a string.  Found type ${typeof args.id} instead.`\n    );\n  }\n\n  return await extensionPort.replById(args);\n}\n\n/**\n * Fetches a Repl by its URL via graphql\n */\nexport async function replByUrl(args: { url: string } & ReplDataInclusion) {\n  if (typeof args.url !== \"string\") {\n    throw new Error(\n      `Query parameter \"url\" must be a string.  Found type ${typeof args.url} instead.`\n    );\n  }\n\n  return await extensionPort.replByUrl(args);\n}\n","import { DisposerFunction, OnActiveFileChangeListener } from \"../types\";\nimport { extensionPort, proxy } from \"../util/comlink\";\n\n/**\n * Sets up a listener to handle when the active file is changed\n */\nexport function onActiveFileChange(\n  listener: OnActiveFileChangeListener\n): DisposerFunction {\n  let dispose = () => {\n    console.log(\"disposing existing watcher\");\n  };\n\n  extensionPort.watchActiveFile(proxy(listener)).then((d: () => void) => {\n    dispose = d;\n  });\n\n  return () => {\n    dispose();\n  };\n}\n\n/**\n * Returns the current file the user is focusing\n */\nexport async function getActiveFile() {\n  return await extensionPort.getActiveFile();\n}\n","export * as auth from \"./auth\";\nexport * as editor from \"./editor\";\n\n// deprecated from the experimental namespace\nexport * as commands from \"../commands\";\n","import { extensionPort } from \"../../util/comlink\";\nimport { AuthenticateResult } from \"../../types\";\nimport { verifyJWTAndDecode, decodeProtectedHeader } from \"../../auth/verify\";\n\n/**\n * Returns a unique JWT token that can be used to verify that an extension has been loaded on Replit by a particular user\n */\nexport async function getAuthToken() {\n  return extensionPort.experimental.auth.getAuthToken();\n}\n\n/**\n * Verifies a provided JWT token and returns the decoded token.\n */\nexport async function verifyAuthToken(\n  token: string\n): Promise<{ payload: any; protectedHeader: any }> {\n  const tokenHeaders = decodeProtectedHeader(token);\n\n  if (tokenHeaders.typ !== \"JWT\") {\n    throw new Error(\"Expected typ: JWT\");\n  }\n\n  if (tokenHeaders.alg !== \"EdDSA\") {\n    throw new Error(\"Expected alg: EdDSA\");\n  }\n\n  if (!tokenHeaders.kid) {\n    throw new Error(\"Expected `kid` to be defined\");\n  }\n\n  const res = await fetch(\n    `https://replit.com/data/extensions/publicKey/${tokenHeaders.kid}`\n  );\n\n  const { ok, value: publicKey } = await res.json();\n\n  if (!ok) {\n    throw new Error(\"Extension Auth: Failed to fetch public key\");\n  }\n\n  try {\n    const decodedToken = await verifyJWTAndDecode(token, publicKey);\n\n    return decodedToken;\n  } catch (e) {\n    throw new Error(\"Extension Auth: Failed to verify token\");\n  }\n}\n\n/**\n * Performs authentication and returns the user and installation information\n */\nexport async function authenticate(): Promise<AuthenticateResult> {\n  const token = await getAuthToken();\n  const decodedToken = await verifyAuthToken(token);\n\n  if (\n    typeof decodedToken.payload.userId !== \"number\" ||\n    typeof decodedToken.payload.installationId !== \"string\" ||\n    typeof decodedToken.payload.extensionId !== \"string\"\n  ) {\n    throw new Error(\"Failed to authenticate\");\n  }\n\n  return {\n    user: {\n      id: decodedToken.payload.userId,\n    },\n    installation: {\n      id: decodedToken.payload.installationId,\n      extensionId: decodedToken.payload.extensionId,\n    },\n  };\n}\n","/**\n * This is a polyfill for ed25519 support in the browser, which is currently not available as part of the\n * WebCrypto API. The polyfill code is vendored from https://www.npmjs.com/package/@yoursunny/webcrypto-ed25519,\n * and modified to use a modern and more secure version of @noble/curves.\n */\n\nimport { ed25519 as ed } from \"@noble/curves/ed25519\";\nimport { bytesToHex } from \"@noble/curves/abstract/utils\";\nimport * as asn1 from \"@root/asn1\";\n// @ts-expect-error no typing\nimport { toBase64Url as b64encode, toBuffer as b64decode } from \"b64u-lite\";\n\nexport const C = {\n  wicgAlgorithm: \"Ed25519\",\n  nodeAlgorithm: \"NODE-ED25519\",\n  nodeNamedCurve: \"NODE-ED25519\",\n  kty: \"OKP\",\n  crv: \"Ed25519\",\n  oid: \"2B6570\".toLowerCase(),\n};\n\nexport function isEd25519Algorithm(a: any) {\n  return (\n    a === C.wicgAlgorithm ||\n    a === C.nodeAlgorithm ||\n    a.name === C.wicgAlgorithm ||\n    (a.name === C.nodeAlgorithm && a.namedCurve === C.nodeNamedCurve)\n  );\n}\n\nexport const Ed25519Algorithm: KeyAlgorithm = {\n  name: C.wicgAlgorithm,\n};\n\nfunction asUint8Array(b: BufferSource): Uint8Array {\n  if (b instanceof Uint8Array) {\n    return b;\n  }\n  if (b instanceof ArrayBuffer) {\n    return new Uint8Array(b);\n  }\n  return new Uint8Array(b.buffer, b.byteOffset, b.byteLength);\n}\n\nfunction asArrayBuffer(b: Uint8Array): ArrayBuffer {\n  if (b.byteLength === b.buffer.byteLength) {\n    return b.buffer;\n  }\n  return b.buffer.slice(b.byteOffset, b.byteLength);\n}\n\nconst slot = \"8d9df0f7-1363-4d2c-8152-ce4ed78f27d8\";\n\ninterface Ed25519CryptoKey extends CryptoKey {\n  [slot]: Uint8Array;\n}\n\nclass Ponyfill implements Record<keyof SubtleCrypto, Function> {\n  constructor(private readonly super_: SubtleCrypto) {\n    this.orig_ = {} as any;\n    for (const method of [\n      \"generateKey\",\n      \"exportKey\",\n      \"importKey\",\n      \"encrypt\",\n      \"decrypt\",\n      \"wrapKey\",\n      \"unwrapKey\",\n      \"deriveBits\",\n      \"deriveKey\",\n      \"sign\",\n      \"verify\",\n      \"digest\",\n    ] as const) {\n      if (this[method]) {\n        this.orig_[method] = super_[method];\n      } else {\n        this[method] = super_[method].bind(super_) as any;\n      }\n    }\n  }\n\n  private readonly orig_: Record<keyof SubtleCrypto, Function>;\n\n  public async generateKey(\n    algorithm: KeyAlgorithm,\n    extractable: boolean,\n    keyUsages: Iterable<KeyUsage>\n  ): Promise<CryptoKeyPair> {\n    if (isEd25519Algorithm(algorithm)) {\n      const pvt = ed.utils.randomPrivateKey();\n      const pub = await ed.getPublicKey(pvt);\n\n      const usages = Array.from(keyUsages);\n      const privateKey: Ed25519CryptoKey = {\n        algorithm,\n        extractable,\n        type: \"private\",\n        usages,\n        [slot]: pvt,\n      };\n      const publicKey: Ed25519CryptoKey = {\n        algorithm,\n        extractable: true,\n        type: \"public\",\n        usages,\n        [slot]: pub,\n      };\n      return { privateKey, publicKey };\n    }\n    return this.orig_.generateKey.apply(this.super_, arguments);\n  }\n\n  public async exportKey(\n    format: KeyFormat,\n    key: CryptoKey\n  ): Promise<JsonWebKey | ArrayBuffer> {\n    if (isEd25519Algorithm(key.algorithm) && key.extractable) {\n      const raw = (key as Ed25519CryptoKey)[slot];\n      switch (format) {\n        case \"jwk\": {\n          const jwk: JsonWebKey = {\n            kty: C.kty,\n            crv: C.crv,\n          };\n          if (key.type === \"public\") {\n            jwk.x = b64encode(raw);\n          } else {\n            jwk.d = b64encode(raw);\n            jwk.x = b64encode(await ed.getPublicKey(raw));\n          }\n          return jwk;\n        }\n        case \"spki\": {\n          return asArrayBuffer(\n            asn1.pack([\n              \"30\",\n              [\n                [\"30\", [[\"06\", \"2B6570\"]]],\n                [\"03\", raw],\n              ],\n            ])\n          );\n        }\n      }\n    }\n    return this.orig_.exportKey.apply(this.super_, arguments);\n  }\n\n  public async importKey(\n    format: KeyFormat,\n    keyData: JsonWebKey | BufferSource,\n    algorithm: Algorithm,\n    extractable: boolean,\n    keyUsages: Iterable<KeyUsage>\n  ): Promise<CryptoKey> {\n    if (isEd25519Algorithm(algorithm)) {\n      const usages = Array.from(keyUsages);\n      switch (format) {\n        case \"jwk\": {\n          const jwk = keyData as JsonWebKey;\n          if (jwk.kty !== C.kty || jwk.crv !== C.crv || !jwk.x) {\n            break;\n          }\n\n          const key: Ed25519CryptoKey = {\n            algorithm,\n            extractable,\n            type: jwk.d ? \"private\" : \"public\",\n            usages,\n            [slot]: b64decode(jwk.d ?? jwk.x),\n          };\n          return key;\n        }\n        case \"spki\": {\n          const der = asn1.parseVerbose(asUint8Array(keyData as BufferSource));\n          const algo = der.children?.[0]?.children?.[0]?.value;\n          const raw = der.children?.[1]?.value;\n          if (\n            !(algo instanceof Uint8Array) ||\n            bytesToHex(algo) !== C.oid ||\n            !(raw instanceof Uint8Array)\n          ) {\n            break;\n          }\n          const key: Ed25519CryptoKey = {\n            algorithm,\n            extractable: true,\n            type: \"public\",\n            usages,\n            [slot]: raw,\n          };\n          return key;\n        }\n      }\n    }\n    return this.orig_.importKey.apply(this.super_, arguments);\n  }\n\n  public async sign(\n    algorithm: AlgorithmIdentifier,\n    key: CryptoKey,\n    data: BufferSource\n  ): Promise<ArrayBuffer> {\n    if (\n      isEd25519Algorithm(algorithm) &&\n      isEd25519Algorithm(key.algorithm) &&\n      key.type === \"private\" &&\n      key.usages.includes(\"sign\")\n    ) {\n      return asArrayBuffer(\n        await ed.sign(asUint8Array(data), (key as Ed25519CryptoKey)[slot])\n      );\n    }\n    return this.orig_.sign.apply(this.super_, arguments);\n  }\n\n  public async verify(\n    algorithm: AlgorithmIdentifier,\n    key: CryptoKey,\n    signature: BufferSource,\n    data: BufferSource\n  ): Promise<boolean> {\n    if (\n      isEd25519Algorithm(algorithm) &&\n      isEd25519Algorithm(key.algorithm) &&\n      key.type === \"public\" &&\n      key.usages.includes(\"verify\")\n    ) {\n      const s = asUint8Array(signature);\n      const m = asUint8Array(data);\n      const p = (key as Ed25519CryptoKey)[slot];\n      return ed.verify(s, m, p);\n    }\n    return this.orig_.verify.apply(this.super_, arguments);\n  }\n}\ninterface Ponyfill extends Record<keyof SubtleCrypto, Function> {}\n\nexport function ponyfillEd25519(subtle = crypto.subtle): SubtleCrypto | null {\n  if (!subtle) {\n    // This is for JSDOM compatibility, since that environment doesn't support the crypto.subtle API at all.\n    // It shouldn't happen on a real browser\n    console.warn(`polyfill ed25519: crypto.subtle is not available`);\n    return null;\n  }\n\n  return new Ponyfill(subtle) as unknown as SubtleCrypto;\n}\n\nexport function polyfillEd25519(): boolean {\n  const ponyfill = ponyfillEd25519();\n\n  if (!ponyfill) {\n    return false;\n  }\n\n  Object.defineProperty(globalThis.crypto, \"subtle\", {\n    value: ponyfill,\n    configurable: true,\n  });\n\n  return true;\n}\n","export const decoder = new TextDecoder();\n\nexport const decodeBrowser = (input: Uint8Array | string) => {\n  const decodeBase64 = (encoded: string): Uint8Array => {\n    const binary = atob(encoded);\n    const bytes = new Uint8Array(binary.length);\n    for (let i = 0; i < binary.length; i++) {\n      bytes[i] = binary.charCodeAt(i);\n    }\n    return bytes;\n  };\n\n  let encoded = input;\n  if (encoded instanceof Uint8Array) {\n    encoded = decoder.decode(encoded);\n  }\n  encoded = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/\\s/g, \"\");\n  try {\n    return decodeBase64(encoded);\n  } catch {\n    throw new TypeError(\"The input to be decoded is not correctly encoded.\");\n  }\n};\n\nexport const decodeNode = (input: Uint8Array | string) => {\n  function normalize(input: string | Uint8Array) {\n    let encoded = input;\n    if (encoded instanceof Uint8Array) {\n      encoded = decoder.decode(encoded);\n    }\n    return encoded;\n  }\n\n  return Buffer.from(normalize(input), \"base64\");\n};\n\nexport function decode(input: Uint8Array | string) {\n  if (typeof process === \"undefined\") {\n    // browser\n    return decodeBrowser(input);\n  } else {\n    return decodeNode(input);\n  }\n}\n","import { ponyfillEd25519 } from \"./ed25519\";\nimport * as base64 from \"./base64\";\n\nconst TOLERANCE = 60;\n\nexport function decodeComponentToJSON(component: string) {\n  try {\n    return JSON.parse(decoder.decode(base64.decode(component)));\n  } catch (e) {\n    throw new Error(\"Invalid JWT. Failed to parse component\");\n  }\n}\n\nexport function decodeProtectedHeader(token: string) {\n  const { 0: protectedHeader } = token.split(\".\");\n\n  if (typeof protectedHeader !== \"string\") {\n    throw new Error(\"Invalid JWT. JWT must have 3 parts\");\n  }\n\n  return decodeComponentToJSON(protectedHeader);\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction concat(...buffers: Uint8Array[]): Uint8Array {\n  const size = buffers.reduce((acc, { length }) => acc + length, 0);\n  const buf = new Uint8Array(size);\n  let i = 0;\n  buffers.forEach((buffer) => {\n    buf.set(buffer, i);\n    i += buffer.length;\n  });\n  return buf;\n}\n\nexport async function verifyJWTAndDecode(token: string, key: string) {\n  if (typeof token !== \"string\") {\n    throw new TypeError(\"JWT must be a string\");\n  }\n\n  const {\n    0: protectedHeader,\n    1: payload,\n    2: signature,\n    length,\n  } = token.split(\".\");\n\n  if (\n    length !== 3 ||\n    typeof protectedHeader !== \"string\" ||\n    typeof payload !== \"string\" ||\n    typeof signature !== \"string\"\n  ) {\n    throw new Error(\"Invalid Token. Token must have 3 parts\");\n  }\n\n  // 1. Check header for alg and typ\n  let parsedProt = decodeComponentToJSON(protectedHeader);\n\n  const { alg, typ } = parsedProt;\n\n  if (!typ || typeof typ !== \"string\") {\n    throw new Error(\"Invalid Token. Missing typ in protected header\");\n  }\n\n  if (typ !== \"JWT\") {\n    throw new Error(\"Invalid JWT. Expected typ to be JWT\");\n  }\n\n  if (!alg || typeof alg !== \"string\") {\n    throw new Error(\"Invalid JWT. Missing alg in protected header\");\n  }\n\n  if (alg !== \"EdDSA\") {\n    throw new Error(\"Invalid JWT. Expected alg to be EdDSA\");\n  }\n\n  // 2. Validate the signature\n  const data = concat(\n    encoder.encode(protectedHeader ?? \"\"),\n    encoder.encode(\".\"),\n    encoder.encode(payload ?? \"\")\n  );\n  const decodedSignature = base64.decode(signature);\n  const verified = await verifySignature(key, decodedSignature, data);\n\n  if (!verified) {\n    throw new Error(\"Invalid JWT. Signature verification failed\");\n  }\n\n  let parsedPayload = decodeComponentToJSON(payload);\n\n  // 3. Validate claims in the payload\n  const now = Math.floor(Date.now() / 1000);\n\n  let iat = parsedPayload.iat;\n  if (typeof iat !== \"number\") {\n    throw new Error(\"Invalid JWT. Missing claim iat in payload\");\n  }\n\n  if (iat > now + TOLERANCE) {\n    throw new Error(\"Invalid JWT. iat claim must be in the past\");\n  }\n\n  let exp = parsedPayload.exp;\n  if (typeof exp !== \"number\") {\n    throw new Error(\"Invalid JWT. Missing claim exp in payload\");\n  }\n\n  if (exp < now + TOLERANCE) {\n    throw new Error(\"Expired JWT. exp claim must be in the future\");\n  }\n\n  return {\n    protectedHeader: parsedProt,\n    payload: parsedPayload,\n  };\n}\n\nconst verifySignature = async (\n  key: string,\n  sig: Uint8Array | Buffer,\n  data: Uint8Array | Buffer\n) => {\n  if (typeof process === \"undefined\") {\n    // Browser\n    return verifyBrowser(key, sig, data);\n  } else {\n    // Node\n    return verifyNode(key, sig, data);\n  }\n};\n\nconst verifyBrowser = async (\n  key: string,\n  signature: Uint8Array | Buffer,\n  data: Uint8Array | Buffer\n) => {\n  const subtle = ponyfillEd25519(crypto.subtle);\n\n  if (!subtle) {\n    throw new Error(\"Ed25519 is not supported in this browser\");\n  }\n\n  let decodedKey = base64.decode(\n    key.replace(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\\s)/g, \"\")\n  );\n\n  const cryptoKey = await subtle.importKey(\n    \"spki\",\n    decodedKey,\n    { name: \"Ed25519\" },\n    false,\n    [\"verify\"]\n  );\n\n  const res = await subtle.verify(\n    { name: \"Ed25519\" },\n    cryptoKey,\n    signature,\n    data\n  );\n\n  return res;\n};\n\nconst verifyNode = async (\n  key: string,\n  signature: Uint8Array | Buffer,\n  data: Uint8Array | Buffer\n) => {\n  try {\n    const crypto: typeof import(\"crypto\") = require(\"crypto\");\n\n    const keyObject = crypto.createPublicKey(key);\n\n    if (keyObject.type !== \"public\") {\n      throw new TypeError(\"The key is not a public key\");\n    }\n\n    if (keyObject.asymmetricKeyType !== \"ed25519\") {\n      throw new TypeError(\"The key is not of type ed25519\");\n    }\n\n    return await crypto.verify(undefined, data, keyObject, signature);\n  } catch {\n    return false;\n  }\n};\n","import { EditorPreferences } from \"../../types\";\nimport { extensionPort } from \"../../util/comlink\";\n\n/**\n * Returns the current user's editor preferences.\n */\nexport async function getPreferences(): Promise<EditorPreferences> {\n  return await extensionPort.experimental.editor.getPreferences();\n}\n","import { extensionPort, proxy } from \"../util/comlink\";\nimport {\n  CreateCommand,\n  CommandProxy,\n  ContributionType,\n  Command,\n  CommandFnArgs,\n  CommandSymbol,\n  CommandArgs,\n  isCommandProxy,\n} from \"../commands\";\n\nexport interface AddCommandArgs {\n  /**\n   * The command's unique identifier. This is used to identify the command in Replit's command system\n   */\n  id: string;\n\n  /**\n   * The surfaces that this command should appear in. This is an array of strings\n   */\n  contributions: Array<ContributionType>;\n\n  /**\n   * A Command, or, a function that returns a Command.\n   */\n  command: CommandProxy | CreateCommand;\n}\n\n/**\n * Adds a command to the command system.\n *\n * @param id The command's unique identifier. This is used to identify the command in Replit's command system\n * @param contributions The surfaces that this command should appear in. This is an array of strings\n * @param command A Command, or, a function that returns a Command.\n */\nfunction add({ id, contributions, command }: AddCommandArgs) {\n  if (typeof command === \"function\") {\n    let createCommand = proxy(async (cmdFnArgs: CommandFnArgs) => {\n      const cmd = await command(cmdFnArgs);\n\n      if (!cmd) {\n        return null;\n      }\n\n      return isCommandProxy(cmd) ? cmd : Command(cmd);\n    });\n\n    extensionPort.commands.registerCreateCommand(\n      { commandId: id, contributions },\n      createCommand\n    );\n  } else {\n    let createCommand = proxy(async () => {\n      return isCommandProxy(command) ? command : Command(command);\n    });\n\n    extensionPort.commands.registerCreateCommand(\n      { commandId: id, contributions },\n      createCommand\n    );\n  }\n}\n\nexport { add };\n","import { ProxyMarked } from \"comlink\";\nimport { proxy } from \"../util/comlink\";\n\n/**\n * Surfaces that a command can appear in.\n */\nexport enum ContributionType {\n  CommandBar = \"commandbar\",\n  FiletreeContextMenu = \"filetree-context-menu\",\n  SidebarSearch = \"sidebar-search\",\n  EditorContextMenu = \"editor-context-menu\",\n}\n\nexport type CommandFnArgs = {\n  /**\n   * Whether the command is currently active. That is, the user has selected this command in the command bar.\n   *\n   * Subcommands are computed even if the command is not active, so that the command bar can show people helpful suggestions of what they can do next\n   */\n  active: boolean;\n\n  /**\n   * The current search query. This is the text that the user has typed into the command bar.\n   */\n  search: string;\n\n  /**\n   * The current path. This is the path of commands that the user has selected in the command bar.\n   *\n   * The first element of the array is the \"root\" which contains contextual information about the command. It varies depending on the surface.\n   */\n  path: SerializableValue[];\n};\n\nexport type CommandsFn = (\n  args: CommandFnArgs\n) => Promise<Array<CommandProxy | CommandArgs>>;\n\nexport type CreateCommand = (\n  args: CommandFnArgs\n) =>\n  | CommandProxy\n  | Promise<CommandProxy>\n  | CommandArgs\n  | Promise<CommandArgs>\n  | null;\n\nexport type Run = () => any;\n\nexport type SerializableValue =\n  | string\n  | number\n  | boolean\n  | null\n  | undefined\n  | SerializableValue[]\n  | { [key: string]: SerializableValue };\n\nexport type BaseCommandArgs = {\n  /**\n   * The command's label. This is the primary text that represents your command in the Commandbar.\n   */\n  label: string;\n\n  /**\n   * The command's description. This is the secondary text that appears next to the label in the Commandbar.\n   */\n  description?: string;\n\n  /**\n   * The command's icon. This is a relative path to the icon that will be displayed next to the label in the Commandbar.\n   *\n   * For example, if `public` is your statically served directory and you have an icon at `./public/icons/cmd.svg`, you would set this to `/icons/cmd.svg`\n   */\n  icon?: string;\n};\n\nexport type ActionCommandArgs = BaseCommandArgs & {\n  /**\n   * The function that will be called when someone choses to run this command.\n   */\n  run: Run;\n};\n\nexport type ContextCommandArgs = BaseCommandArgs & {\n  /**\n   * The function that will be called to compute 'subcommands' for this command. The subcommands can be any number of commands,\n   * and even computed dynamically in response to the different arguments passed to this function or some other external state.\n   */\n  commands: CommandsFn;\n};\n\nexport type CommandArgs = ActionCommandArgs | ContextCommandArgs;\n\n/**\n * This validates a CommandArgs object. We make sure that exactly one of `commands` or `run` is defined, and every other argument is serializable.\n */\nfunction validateCommandArgs(cmdArgs: unknown): asserts cmdArgs is CommandArgs {\n  // Make sure cmdArgs is object\n  if (typeof cmdArgs !== \"object\") {\n    throw new Error(\"Command arguments must be an object\");\n  }\n  if (cmdArgs === null) {\n    throw new Error(\"Command arguments must not be null\");\n  }\n\n  // Make sure it contains `commands` or `run`\n  if (!(\"commands\" in cmdArgs) && !(\"run\" in cmdArgs)) {\n    throw new Error(\"One of `commands` or `run` must be defined\");\n  }\n\n  // But not both\n  if (\n    \"commands\" in cmdArgs &&\n    cmdArgs.commands &&\n    \"run\" in cmdArgs &&\n    cmdArgs.run\n  ) {\n    throw new Error(\"Only one of `commands` or `run` must be defined\");\n  }\n\n  // And when provided, they must always be a function\n  if (\"commands\" in cmdArgs && typeof cmdArgs.commands !== \"function\") {\n    throw new Error(\"`commands` must be a function\");\n  }\n\n  if (\"run\" in cmdArgs && typeof cmdArgs.run !== \"function\") {\n    throw new Error(\"`run` must be a function\");\n  }\n\n  // Make sure all other arguments are serializable\n  for (let entry of Object.entries(cmdArgs)) {\n    if (entry[0] === \"commands\" || entry[0] === \"run\") {\n      continue;\n    }\n\n    try {\n      JSON.stringify({ [entry[0]]: entry[1] });\n    } catch (e) {\n      throw new Error(`Command argument '${entry[0]}' is not serializable`);\n    }\n  }\n}\n\nexport const CommandSymbol = Symbol(\"Command\");\n\nexport function isCommandProxy(cmd: object): cmd is CommandProxy {\n  return CommandSymbol in cmd && cmd[CommandSymbol] === true;\n}\n\n/**\n * This function validates a command and wraps it in a proxy so that it can be sent over the wire\n *\n * It:\n * - Validates the command's arguments, separates serializable and non-serializable arguments\n * - Wraps the command in a proxy so that it can be sent over the wire\n * - Wraps the command's `commands` function to ensure that all subcommands are also Command() wrapped\n * - Adds a symbol to the command to identify a wrapped command\n */\nexport function Command(cmdArgs: CommandArgs): CommandProxy {\n  // If the command is already wrapped, just return it.\n  // This is to prevent accidental double-wrapping\n  if (isCommandProxy(cmdArgs)) {\n    throw new Error(\"Command is already wrapped\");\n  }\n\n  // Validate the command's arguments\n  validateCommandArgs(cmdArgs);\n\n  if (\"commands\" in cmdArgs) {\n    const { commands, ...props } = cmdArgs;\n\n    let cmdProxy: CommandProxy = proxy({\n      data: {\n        ...props,\n        type: \"context\",\n      },\n      commands: async (args: CommandFnArgs) => {\n        // Compute subcommands\n        let subCmds = await commands(args);\n\n        // While we expect commands() to return an array, we don't want to throw an error if it doesn't.\n        if (!subCmds || !Array.isArray(subCmds)) {\n          return proxy([]);\n        }\n\n        const commandProxyArray: Array<CommandProxy> = subCmds.map((subCmd) => {\n          // Subcommands can be either a CommandArgs or a CommandProxy.\n          // If it's already a wrapped command, just return it.\n          if (isCommandProxy(subCmd)) {\n            return subCmd;\n          }\n\n          // Otherwise, wrap it in Command()\n          return Command(subCmd);\n        });\n\n        // Return the subcommands as a proxy array\n        return proxy(commandProxyArray);\n      },\n\n      // Attach CommandSymbol to identify a wrapped command\n      [CommandSymbol]: true,\n    });\n\n    return cmdProxy;\n  } else {\n    const { run, ...props } = cmdArgs;\n\n    let cmdProxy: CommandProxy = proxy({\n      data: {\n        ...props,\n        type: \"action\",\n      },\n      run,\n      // Attach CommandSymbol to identify a wrapped command\n      [CommandSymbol]: true,\n    });\n\n    return cmdProxy;\n  }\n}\n\nexport type CommandProxy =\n  | ({\n      data: {\n        type: \"action\";\n        label: string;\n        description?: string;\n        icon?: string;\n      };\n      run?: Run;\n    } & ProxyMarked & { [CommandSymbol]: true })\n  | ({\n      data: {\n        type: \"context\";\n        label: string;\n        description?: string;\n        icon?: string;\n      };\n      commands?: (args: CommandFnArgs) => Promise<Array<CommandProxy>>;\n    } & ProxyMarked & { [CommandSymbol]: true });\n","// internal API goes here\nexport {};\n","import {\n  ExecResult,\n  SpawnOptions,\n  SpawnOutput,\n  SpawnResult,\n} from \"../types/exec\";\nimport { extensionPort, proxy } from \"../util/comlink\";\n\n/**\n * Spawns a command, with given arguments and environment variables. Takes in callbacks,\n * and returns an object containing a promise that resolves when the command exits, and\n * a dispose function to kill the process\n */\nfunction spawn(options: SpawnOptions): SpawnOutput {\n  let execResult = extensionPort.exec(\n    proxy({\n      args: options.args,\n      env: options.env || {},\n      splitStderr: options.splitStderr ?? false,\n      onOutput: (output: string) => {\n        if (options.splitStderr) {\n          options.onStdOut?.(output);\n        } else {\n          options.onOutput?.(output);\n        }\n      },\n      onStdErr: (stderr: string) => {\n        if (options.splitStderr) {\n          options.onStdErr?.(stderr);\n        } else {\n          options.onOutput?.(stderr);\n        }\n      },\n      onError: (err: string) => {\n        throw err;\n      },\n    })\n  );\n\n  let dispose = async () => {\n    (await execResult).dispose();\n  };\n\n  const resultPromise = new Promise<SpawnResult>(async (resolve) => {\n    const { exitCode, error } = await (await execResult).promise;\n\n    resolve({\n      error,\n      exitCode: exitCode ?? 0,\n    });\n  });\n\n  return {\n    resultPromise,\n    dispose,\n  };\n}\n\n/**\n * Executes a command in the shell, with given arguments and environment variables\n */\nasync function exec(\n  command: string,\n  options: {\n    env?: Record<string, string>;\n  } = {}\n): Promise<ExecResult> {\n  let output = \"\";\n  const { resultPromise } = spawn({\n    args: [\"bash\", \"-c\", command],\n    env: options.env ?? {},\n    splitStderr: false,\n    onOutput: (newOutput: string) => {\n      output += newOutput;\n    },\n  });\n\n  const result = await resultPromise;\n\n  if (result.error) {\n    throw new Error(result.error);\n  }\n\n  return {\n    output,\n    exitCode: result.exitCode,\n  };\n}\n\nexport { spawn, exec };\n","import { extensionPort } from \"../util/comlink\";\n\nexport type Primitive = string | boolean | number | null | undefined | never;\n\nexport interface ObjectType {\n  [n: string | number]: Serializable;\n}\n\nexport interface NumericIndexType {\n  [n: number]: Serializable;\n}\n\nexport type Serializable = ObjectType | Primitive | NumericIndexType;\n\nexport type Data = Record<string, Serializable>;\n\nfunction isSerializable(thing: any): thing is Serializable {\n  if ([\"string\", \"number\", \"boolean\", \"undefined\"].includes(typeof thing)) {\n    return true;\n  }\n\n  if (thing === null) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Logs information to the Extension Devtools\n */\nasync function info(message: string, data?: Data) {\n  if (!isSerializable(message)) {\n    // if someone uses console.info / console.log, the wrapper defined in index.ts will log the object to the console.\n    extensionPort.debug.warn(\n      \"Attempted to log non-serializable message. See your browser devtools to access the logged object.\"\n    );\n\n    return;\n  }\n\n  return await extensionPort.debug.info(message, data);\n}\n\n/**\n * Logs a warning to the extension devtools\n */\nasync function warn(message: string, data?: Data) {\n  if (!isSerializable(message)) {\n    // if someone uses console.warn, the wrapper defined in index.ts will log the object to the console.\n    extensionPort.debug.warn(\n      \"Attempted to log non-serializable message. See your browser devtools to access the logged object.\"\n    );\n\n    return;\n  }\n\n  return await extensionPort.debug.warn(message, data);\n}\n\n/**\n * Logs an error message to the extension devtools\n */\nasync function error(message: string, data?: Data) {\n  if (!isSerializable(message)) {\n    // if someone uses console.error, the wrapper defined in index.ts will log the object to the console.\n    extensionPort.debug.warn(\n      \"Attempted to log non-serializable message. See your browser devtools to access the logged object.\"\n    );\n\n    return;\n  }\n\n  return await extensionPort.debug.error(message, data);\n}\n\n// Log is just an alias for info for now\nconst log = info;\n\nexport { info, warn, error, log };\n","{\n  \"name\": \"@replit/extensions\",\n  \"version\": \"1.10.0\",\n  \"description\": \"The Replit Extensions client is a module that allows you to easily interact with the Workspace.\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \".\": {\n      \"types\": \"./src/index.ts\",\n      \"import\": {\n        \"default\": \"./src/index.ts\"\n      }\n    }\n  },\n  \"publishConfig\": {\n    \"exports\": {\n      \"./package.json\": \"./package.json\",\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": {\n          \"default\": \"./dist/index.js\"\n        },\n        \"default\": \"./dist/index.cjs\",\n        \"require\": \"./dist/index.js\"\n      }\n    },\n    \"types\": \"./dist/index.d.ts\"\n  },\n  \"type\": \"module\",\n  \"unpkg\": \"dist/index.global.js\",\n  \"scripts\": {\n    \"build\": \"tsup src/index.ts  --sourcemap --dts --platform browser --format esm,cjs,iife --global-name replit\",\n    \"test:build\": \"jest buildTests\",\n    \"lint\": \"npx prettier --write src/*\",\n    \"lint:check\": \"npx prettier -l src/*\",\n    \"type:check\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist\",\n    \"generate:docs\": \"npx typedoc src/index.ts --json docs/main.json --plugin ./util/signature-plugin/index.cjs\"\n  },\n  \"files\": [\n    \"dist/*\"\n  ],\n  \"keywords\": [\n    \"replit\",\n    \"extensions\",\n    \"api-client\"\n  ],\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@codemirror/state\": \"^6.2.0\",\n    \"@noble/curves\": \"^1.0.0\",\n    \"@root/asn1\": \"^1.0.0\",\n    \"b64u-lite\": \"^1.1.0\",\n    \"comlink\": \"^4.3.1\"\n  },\n  \"devDependencies\": {\n    \"@types/root__asn1\": \"^1.0.2\",\n    \"esbuild\": \"^0.15.18\",\n    \"prettier\": \"^2.7.1\",\n    \"tsup\": \"^6.6.3\",\n    \"typedoc\": \"^0.24.8\",\n    \"typescript\": \"^4.9.3\"\n  }\n}\n","import * as debug from \"../api/debug\";\n\nconst consoleIsPatchedSymbol = Symbol(\"consoleIsPatched\");\n\nexport function patchConsole() {\n  if (isConsolePatched()) {\n    return;\n  }\n\n  const originalLog = console.log;\n  const originalWarn = console.warn;\n  const originalError = console.error;\n  const originalInfo = console.info;\n\n  console.log = (...args: any[]) => {\n    originalLog(...args);\n    debug.log(args[0], { args: args.slice(1) });\n  };\n\n  console.warn = (...args: any[]) => {\n    originalWarn(...args);\n    debug.warn(args[0], { args: args.slice(1) });\n  };\n\n  console.error = (...args: any[]) => {\n    originalError(...args);\n    debug.error(args[0], { args: args.slice(1) });\n  };\n\n  console.info = (...args: any[]) => {\n    originalInfo(...args);\n    debug.info(args[0], { args: args.slice(1) });\n  };\n\n  // @ts-ignore\n  console[consoleIsPatchedSymbol] = true;\n}\n\nexport function isConsolePatched() {\n  // @ts-ignore\n  return Boolean(console[consoleIsPatchedSymbol]);\n}\n"],"mappings":"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","names":["proxy","FsNodeType","ChangeEventType","ColorScheme","UserSocialType","HandshakeStatus","proxy","proxy","error","proxy","import_comlink","proxy","ed","b64encode","b64decode","encoded","input","decoder","crypto","ContributionType","proxy","proxy","proxy","error"]}