@gadgetinc/ggt 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/lib/__generated__/graphql.d.ts +45 -45
- package/lib/commands/help.js +1 -1
- package/lib/commands/help.js.map +1 -1
- package/lib/commands/login.d.ts +1 -1
- package/lib/commands/login.js +1 -1
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/logout.d.ts +1 -1
- package/lib/commands/logout.js +2 -2
- package/lib/commands/logout.js.map +1 -1
- package/lib/commands/sync.d.ts +4 -4
- package/lib/commands/sync.js +13 -23
- package/lib/commands/sync.js.map +1 -1
- package/lib/commands/whoami.d.ts +1 -1
- package/lib/commands/whoami.js +2 -2
- package/lib/commands/whoami.js.map +1 -1
- package/lib/{lib → utils}/base-command.d.ts +0 -0
- package/lib/{lib → utils}/base-command.js +1 -1
- package/lib/utils/base-command.js.map +1 -0
- package/lib/{lib → utils}/client.d.ts +1 -1
- package/lib/{lib → utils}/client.js +3 -3
- package/lib/utils/client.js.map +1 -0
- package/lib/{lib → utils}/context.d.ts +0 -0
- package/lib/{lib → utils}/context.js +0 -0
- package/lib/utils/context.js.map +1 -0
- package/lib/{lib → utils}/errors.d.ts +10 -3
- package/lib/{lib → utils}/errors.js +61 -122
- package/lib/utils/errors.js.map +1 -0
- package/lib/{lib → utils}/flags.d.ts +0 -0
- package/lib/{lib → utils}/flags.js +0 -0
- package/lib/utils/flags.js.map +1 -0
- package/lib/{lib → utils}/fs-utils.d.ts +0 -0
- package/lib/{lib → utils}/fs-utils.js +1 -1
- package/lib/utils/fs-utils.js.map +1 -0
- package/lib/{lib → utils}/help.d.ts +0 -0
- package/lib/{lib → utils}/help.js +0 -0
- package/lib/utils/help.js.map +1 -0
- package/lib/{lib → utils}/sleep.d.ts +0 -0
- package/lib/{lib → utils}/sleep.js +0 -0
- package/lib/utils/sleep.js.map +1 -0
- package/npm-shrinkwrap.json +679 -507
- package/oclif.manifest.json +1 -1
- package/package.json +4 -4
- package/lib/lib/base-command.js.map +0 -1
- package/lib/lib/client.js.map +0 -1
- package/lib/lib/context.js.map +0 -1
- package/lib/lib/errors.js.map +0 -1
- package/lib/lib/flags.js.map +0 -1
- package/lib/lib/fs-utils.js.map +0 -1
- package/lib/lib/help.js.map +0 -1
- package/lib/lib/sleep.js.map +0 -1
package/lib/commands/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { Flags } from \"@oclif/core\";\nimport assert from \"assert\";\nimport { FSWatcher } from \"chokidar\";\nimport execa from \"execa\";\nimport type { Stats } from \"fs-extra\";\nimport fs from \"fs-extra\";\nimport { prompt } from \"inquirer\";\nimport type { DebouncedFunc } from \"lodash\";\nimport { isString } from \"lodash\";\nimport { debounce } from \"lodash\";\nimport normalizePath from \"normalize-path\";\nimport pMap from \"p-map\";\nimport PQueue from \"p-queue\";\nimport path from \"path\";\nimport dedent from \"ts-dedent\";\nimport which from \"which\";\nimport { BaseCommand } from \"../lib/base-command\";\nimport type { Query } from \"../lib/client\";\nimport { Client } from \"../lib/client\";\nimport { context } from \"../lib/context\";\nimport { FlagError, InvalidSyncFileError, YarnNotFoundError } from \"../lib/errors\";\nimport { app } from \"../lib/flags\";\nimport { ignoreEnoent, Ignorer, isEmptyDir, walkDir } from \"../lib/fs-utils\";\nimport { sleepUntil } from \"../lib/sleep\";\nimport type {\n FileSyncChangedEventInput,\n FileSyncDeletedEventInput,\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables,\n RemoteFilesVersionQuery,\n RemoteFilesVersionQueryVariables,\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables,\n} from \"../__generated__/graphql\";\nimport { FileSyncEncoding } from \"../__generated__/graphql\";\n\nexport default class Sync extends BaseCommand {\n static override priority = 1;\n\n static override summary = \"Sync your Gadget application's source code to and from your local filesystem.\";\n\n static override usage = \"sync [--app=<value>] [DIRECTORY]\";\n\n static override description = dedent`\n Sync provides the ability to sync your Gadget application's source code to and from your local\n filesystem. While \\`ggt sync\\` is running, local file changes are immediately reflected within\n Gadget, while files that are changed remotely are immediately saved to your local filesystem.\n\n Use cases for this include:\n * Developing locally with your own editor like VSCode (https://code.visualstudio.com/)\n * Storing your source code in a Git repository like GitHub (https://github.com/)\n\n Sync includes the concept of a \\`.ignore\\` file. This file can contain a list of files and\n directories that won't be sent to Gadget when syncing.\n\n The following files and directories are always ignored:\n * .gadget\n * .git\n * node_modules\n\n Note:\n * Gadget applications only support installing dependencies with Yarn 1 (https://classic.yarnpkg.com/lang/en/).\n * Since file changes are immediately reflected in Gadget, avoid the following while \\`ggt sync\\` is running:\n * Deleting all your files\n * Moving all your files to a different directory\n `;\n\n static override args = [\n {\n name: \"directory\",\n description: \"The directory to sync files to. If the directory doesn't exist, it will be created.\",\n default: \".\",\n },\n ];\n\n static override flags = {\n app: app({\n summary: \"The Gadget application to sync files to.\",\n }),\n force: Flags.boolean({\n summary: \"Whether to sync even if we can't determine the state of your local files relative to your remote ones.\",\n default: false,\n }),\n \"file-push-delay\": Flags.integer({\n summary: \"Delay in milliseconds before pushing files to your app.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n \"file-stability-threshold\": Flags.integer({\n name: \"file-stability-threshold\",\n summary: \"Time in milliseconds a file's size must remain the same.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 500,\n hidden: true,\n }),\n \"file-poll-interval\": Flags.integer({\n name: \"file-poll-interval\",\n description: \"Interval in milliseconds between polling a file's size.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n };\n\n static override examples = [\n dedent`\n $ ggt sync --app my-app ~/gadget/my-app\n Ready\n Received\n ← routes/GET.js\n ← user/signUp/signIn.js\n Sent\n → routes/GET.js\n ^C Stopping... (press Ctrl+C again to force)\n Done\n `,\n dedent`\n # These are equivalent\n $ ggt sync -a my-app\n $ ggt sync --app my-app\n $ ggt sync --app my-app.gadget.app\n $ ggt sync --app https://my-app.gadget.app\n $ ggt sync --app https://my-app.gadget.app/edit\n `,\n ];\n\n override requireUser = true;\n\n status = SyncStatus.STARTING;\n\n dir!: string;\n\n recentWrites = new Set();\n\n filePushDelay!: number;\n\n queue = new PQueue({ concurrency: 1 });\n\n client!: Client;\n\n ignorer!: Ignorer;\n\n watcher!: FSWatcher;\n\n metadata = {\n app: \"\",\n filesVersion: \"0\",\n mtime: 0,\n };\n\n publish!: DebouncedFunc<() => void>;\n\n stop!: (error?: unknown) => Promise<void>;\n\n relative(to: string): string {\n return path.relative(this.dir, to);\n }\n\n absolute(...pathSegments: string[]): string {\n return path.resolve(this.dir, ...pathSegments);\n }\n\n normalize(filepath: string): string {\n return normalizePath(path.isAbsolute(filepath) ? this.relative(filepath) : filepath);\n }\n\n logPaths(filepaths: string[], { limit = 10, sep = \"-\" } = {}): void {\n let logged = 0;\n for (const filepath of filepaths) {\n this.log(`${sep} ${this.normalize(filepath)}`);\n if (++logged == limit && !this.debugEnabled) break;\n }\n\n if (filepaths.length > logged) {\n this.log(`… ${filepaths.length - logged} more`);\n }\n }\n\n override async init(): Promise<void> {\n await super.init();\n const { args, flags } = await this.parse(Sync);\n\n assert(isString(args[\"directory\"]));\n\n this.dir =\n this.config.windows && args[\"directory\"].startsWith(\"~/\")\n ? path.join(this.config.home, args[\"directory\"].slice(2))\n : path.resolve(args[\"directory\"]);\n\n const getApp = async (): Promise<string> => {\n if (flags.app) return flags.app;\n if (this.metadata.app) return this.metadata.app;\n const selected = await prompt<{ app: string }>({\n type: \"list\",\n name: \"app\",\n message: \"Please select the app to sync to.\",\n choices: await context.getAvailableApps().then((apps) => apps.map((app) => app.slug)),\n });\n return selected.app;\n };\n\n if (await isEmptyDir(this.dir)) {\n this.metadata.app = await getApp();\n } else {\n try {\n this.metadata = await fs.readJson(this.absolute(\".gadget\", \"sync.json\"));\n if (!this.metadata.app) {\n this.metadata.app = await getApp();\n }\n } catch (error) {\n if (!flags.force) {\n throw new InvalidSyncFileError(error, this, flags.app);\n }\n this.metadata.app = await getApp();\n }\n }\n\n if (flags.app && flags.app !== this.metadata.app && !flags.force) {\n throw new FlagError(\n { name: \"app\", char: \"a\" },\n dedent`\n You were about to sync the following app to the following directory:\n\n ${flags.app} → ${this.dir}\n\n However, that directory has already been synced with this app:\n\n ${this.metadata.app}\n\n If you're sure that you want to sync \"${flags.app}\" to \"${this.dir}\", run \\`ggt sync\\` again with the \\`--force\\` flag:\n\n $ ggt sync ${this.argv.join(\" \")} --force\n `\n );\n }\n\n await context.setApp(this.metadata.app);\n\n this.client = new Client();\n\n this.filePushDelay = flags[\"file-push-delay\"];\n\n // local files/folders that should never be published\n this.ignorer = new Ignorer(this.dir, [\"node_modules\", \".gadget\", \".git\"]);\n\n this.watcher = new FSWatcher({\n ignored: (filepath) => this.ignorer.ignores(filepath),\n // don't emit an event for every watched file on boot\n ignoreInitial: true,\n // make sure stats are always present on add/change events\n alwaysStat: true,\n // wait for the entire file to be written before emitting add/change events\n awaitWriteFinish: { pollInterval: flags[\"file-poll-interval\"], stabilityThreshold: flags[\"file-stability-threshold\"] },\n });\n\n this.debug(\"starting\");\n\n if (!which.sync(\"yarn\", { nothrow: true })) {\n throw new YarnNotFoundError();\n }\n\n await fs.ensureDir(this.dir);\n\n const { remoteFilesVersion } = await this.client.queryUnwrap({ query: REMOTE_FILES_VERSION_QUERY });\n const hasRemoteChanges = BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion);\n\n const getChangedFiles = async (): Promise<Map<string, Stats>> => {\n const files = new Map();\n for await (const filepath of walkDir(this.dir, { ignorer: this.ignorer })) {\n const stats = await fs.stat(filepath);\n if (stats.mtime.getTime() > this.metadata.mtime) {\n files.set(this.absolute(filepath), stats);\n }\n }\n return files;\n };\n\n const changedFiles = await getChangedFiles();\n const hasLocalChanges = changedFiles.size > 0;\n if (hasLocalChanges) {\n this.log(\"Local files have changed since the last sync\");\n this.logPaths(Array.from(changedFiles.keys()), { limit: changedFiles.size });\n this.log();\n }\n\n this.debug(\"init %o\", { metadata: this.metadata, remoteFilesVersion, hasRemoteChanges, hasLocalChanges });\n\n let action: Action | undefined;\n if (hasLocalChanges) {\n ({ action } = await prompt({\n type: \"list\",\n name: \"action\",\n choices: [Action.CANCEL, Action.MERGE, Action.RESET],\n message: hasRemoteChanges ? \"Remote files have also changed. How would you like to proceed?\" : \"How would you like to proceed?\",\n }));\n }\n\n switch (action) {\n case Action.MERGE: {\n // get all the changed files again in case more changed\n const files = await getChangedFiles();\n\n // we purposefully don't set the returned remoteFilesVersion here because we haven't processed the in-between versions yet\n await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: {\n input: {\n expectedRemoteFilesVersion: remoteFilesVersion,\n changed: await pMap(files, async ([filepath, stats]) => {\n if (stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n return {\n path: this.normalize(filepath),\n mode: stats.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n };\n }),\n deleted: [],\n },\n },\n });\n break;\n }\n case Action.RESET: {\n await pMap(changedFiles, ([filepath]) => fs.remove(filepath));\n this.metadata.filesVersion = \"0\";\n break;\n }\n case Action.CANCEL: {\n process.exit(0);\n }\n }\n\n this.debug(\"started\");\n }\n\n async run(): Promise<void> {\n let error: unknown;\n\n this.stop = async (e?: unknown) => {\n if (this.status != SyncStatus.RUNNING) return;\n\n error = e;\n this.debug(\"stopping\");\n this.status = SyncStatus.STOPPING;\n\n try {\n unsubscribe();\n this.watcher.removeAllListeners();\n this.publish.flush();\n await this.queue.onIdle();\n } finally {\n await fs.outputJSON(this.absolute(\".gadget\", \"sync.json\"), this.metadata, { spaces: 2 });\n await Promise.allSettled([this.watcher.close(), this.client.dispose()]);\n\n this.debug(\"stopped\");\n this.status = SyncStatus.STOPPED;\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (this.status != SyncStatus.RUNNING) return;\n\n this.log(\" Stopping... (press Ctrl+C again to force)\");\n void this.stop();\n\n // When ggt is run via npx, and the user presses Ctrl+C, npx sends SIGINT twice in quick succession. In order to prevent the second\n // SIGINT from triggering the force exit listener, we wait a bit before registering it. This is a bit of a hack, but it works.\n setTimeout(() => {\n process.once(signal, () => {\n this.log(\" Exiting immediately. Note that files may not have finished syncing.\");\n process.exit(1);\n });\n }, 100).unref();\n });\n }\n\n const unsubscribe = this.client.subscribeUnwrap(\n {\n query: REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION,\n variables: () => ({ localFilesVersion: this.metadata.filesVersion }),\n },\n {\n error: (error) => void this.stop(error),\n next: ({ remoteFileSyncEvents: { remoteFilesVersion, changed, deleted } }) => {\n const remoteFiles = new Map([...deleted, ...changed].map((e) => [e.path, e]));\n\n void this.queue\n .add(async () => {\n if (!remoteFiles.size) {\n // we still need to update filesVersion, otherwise our expectedFilesVersion will be behind the next time we publish\n this.metadata.filesVersion = remoteFilesVersion;\n return;\n }\n\n this.log(\"Received\");\n this.logPaths(Array.from(remoteFiles.keys()), { sep: \"←\" });\n\n await pMap(\n remoteFiles,\n async ([relativePath, file]) => {\n const filepath = this.absolute(relativePath);\n this.recentWrites.add(filepath);\n\n if (\"content\" in file) {\n await fs.ensureDir(path.dirname(filepath), { mode: 0o755 });\n if (!file.path.endsWith(\"/\")) {\n await fs.writeFile(filepath, Buffer.from(file.content, file.encoding ?? FileSyncEncoding.Utf8), { mode: file.mode });\n }\n if (filepath == this.absolute(\"yarn.lock\")) {\n await execa(\"yarn\", [\"install\"], { cwd: this.dir }).catch((err) => {\n this.debug(\"yarn install failed\");\n this.debug(err.message);\n });\n }\n } else {\n await fs.remove(filepath);\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n }\n },\n { stopOnError: false }\n );\n\n this.metadata.filesVersion = remoteFilesVersion;\n })\n .catch(this.stop);\n },\n }\n );\n\n const localFilesBuffer = new Map<string, { mode: number; mtime: number } | false>();\n\n this.publish = debounce(() => {\n const localFiles = new Map(localFilesBuffer.entries());\n localFilesBuffer.clear();\n\n void this.queue\n .add(async () => {\n const changed: FileSyncChangedEventInput[] = [];\n const deleted: FileSyncDeletedEventInput[] = [];\n\n await pMap(\n localFiles,\n async ([filepath, file]) => {\n if (file) {\n try {\n changed.push({\n path: this.normalize(filepath),\n mode: file.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n });\n } catch (error) {\n // A file could have been changed and then deleted before we process the change event, so the readFile above will raise\n // an ENOENT. This is normal operation, so just ignore this event.\n ignoreEnoent(error);\n }\n } else {\n deleted.push({ path: this.normalize(filepath) });\n }\n },\n { stopOnError: false }\n );\n\n if (changed.length > 0 || deleted.length > 0) {\n this.log(\"Sent\");\n this.logPaths(Array.from(localFiles.keys()), { sep: \"→\" });\n\n const data = await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: { input: { expectedRemoteFilesVersion: this.metadata.filesVersion, changed, deleted } },\n });\n\n const { remoteFilesVersion } = data.publishFileSyncEvents;\n this.debug(\"remote files version after publishing %s\", remoteFilesVersion);\n\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n this.metadata.filesVersion = remoteFilesVersion;\n }\n }\n })\n .catch(this.stop);\n }, this.filePushDelay);\n\n this.watcher\n .add(`${this.dir}/**/*`)\n .on(\"error\", (error) => void this.stop(error))\n .on(\"all\", (event, filepath, stats) => {\n const relativePath = this.relative(filepath);\n\n if (event === \"addDir\") {\n this.debug(\"skipping event caused by added directory %s\", relativePath);\n return;\n }\n\n if (stats?.isSymbolicLink?.()) {\n this.debug(\"skipping event caused by symlink %s\", relativePath);\n return;\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n } else if (this.ignorer.ignores(filepath)) {\n this.debug(\"skipping event caused by ignored file %s\", relativePath);\n return;\n }\n\n // we only update the mtime if the file is not ignored, because if we restart and the mtime is set to an ignored file, then it could\n // be greater than the mtime of all non ignored files and we'll think that local files have changed when only an ignored one has\n if (stats && stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n if (this.recentWrites.delete(filepath)) {\n this.debug(\"skipping event caused by recent write %s\", relativePath);\n return;\n }\n\n this.debug(\"file changed %s\", relativePath);\n\n switch (event) {\n case \"add\":\n case \"change\":\n assert(stats, \"missing stats on add/change event\");\n localFilesBuffer.set(filepath, { mode: stats.mode, mtime: stats.mtime.getTime() });\n break;\n case \"unlink\":\n case \"unlinkDir\":\n localFilesBuffer.set(filepath, false);\n break;\n }\n\n this.publish();\n });\n\n this.log(\"Ready\");\n this.status = SyncStatus.RUNNING;\n\n await sleepUntil(() => this.status == SyncStatus.STOPPED, { timeout: Infinity });\n\n if (error) {\n this.notify({ subtitle: \"Uh oh!\", message: \"An error occurred while syncing files\" });\n throw error;\n } else {\n this.log(\"Done\");\n }\n }\n}\n\nexport enum SyncStatus {\n STARTING,\n RUNNING,\n STOPPING,\n STOPPED,\n}\n\nexport enum Action {\n CANCEL = \"Cancel (Ctrl+C)\",\n MERGE = \"Merge local files with remote ones\",\n RESET = \"Reset local files to remote ones\",\n}\n\nexport const REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION: Query<\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables\n> = /* GraphQL */ `\n subscription RemoteFileSyncEvents($localFilesVersion: String!) {\n remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n deleted {\n path\n }\n }\n }\n`;\n\nexport const REMOTE_FILES_VERSION_QUERY: Query<RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables> = /* GraphQL */ `\n query RemoteFilesVersion {\n remoteFilesVersion\n }\n`;\n\nexport const PUBLISH_FILE_SYNC_EVENTS_MUTATION: Query<\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables\n> = /* GraphQL */ `\n mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {\n publishFileSyncEvents(input: $input) {\n remoteFilesVersion\n }\n }\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":";;;;AAAA,sCAAoC;AACpC,4DAA4B;AAC5B,uCAAqC;AACrC,0DAA0B;AAE1B,gEAA0B;AAC1B,uCAAkC;AAElC,mCAAkC;AAClC,mCAAkC;AAClC,4EAA2C;AAC3C,0DAAyB;AACzB,8DAA6B;AAC7B,wDAAwB;AACxB,kEAA+B;AAC/B,0DAA0B;AAC1B,wDAAoD;AAEpD,4CAAyC;AACzC,8CAA2C;AAC3C,4CAAmG;AACnG,0CAAqC;AACrC,gDAA+E;AAC/E,0CAA4C;AAW5C,sDAA4D;AAE5D,MAAqB,IAAK,SAAQ,0BAAW;IAA7C;;QA8FE;;;;mBAAuB,IAAI;WAAC;QAE5B;;;;mBAAS,UAAU,CAAC,QAAQ;WAAC;QAE7B;;;;;WAAa;QAEb;;;;mBAAe,IAAI,GAAG,EAAE;WAAC;QAEzB;;;;;WAAuB;QAEvB;;;;mBAAQ,IAAI,iBAAM,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;WAAC;QAEvC;;;;;WAAgB;QAEhB;;;;;WAAkB;QAElB;;;;;WAAoB;QAEpB;;;;mBAAW;gBACT,GAAG,EAAE,EAAE;gBACP,YAAY,EAAE,GAAG;gBACjB,KAAK,EAAE,CAAC;aACT;WAAC;QAEF;;;;;WAAoC;QAEpC;;;;;WAA0C;IAuY5C,CAAC;IArYC,QAAQ,CAAC,EAAU;QACjB,OAAO,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,GAAG,YAAsB;QAChC,OAAO,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAA,wBAAa,EAAC,cAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvF,CAAC;IAED,QAAQ,CAAC,SAAmB,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE;QAC1D,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,MAAM;SACpD;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC;SACjD;IACH,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAA,gBAAM,EAAC,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC,GAAG;YACN,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;gBACvD,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,KAAK,IAAqB,EAAE;YACzC,IAAI,KAAK,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAM,EAAkB;gBAC7C,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,mCAAmC;gBAC5C,OAAO,EAAE,MAAM,iBAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACtF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,GAAG,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;SACpC;aAAM;YACL,IAAI;gBACF,IAAI,CAAC,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;iBACpC;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBAChB,MAAM,IAAI,6BAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;iBACxD;gBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;aACpC;SACF;QAED,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YAChE,MAAM,IAAI,gCAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;SACpD;QAED,MAAM,iBAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAE3B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAE9C,qDAAqD;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAS,CAAC;YAC3B,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YACrD,qDAAqD;YACrD,aAAa,EAAE,IAAI;YACnB,0DAA0D;YAC1D,UAAU,EAAE,IAAI;YAChB,2EAA2E;YAC3E,gBAAgB,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,0BAA0B,CAAC,EAAE;SACvH,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvB,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1C,MAAM,IAAI,0BAAiB,EAAE,CAAC;SAC/B;QAED,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,kCAA0B,EAAE,CAAC,CAAC;QACpG,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEzF,MAAM,eAAe,GAAG,KAAK,IAAiC,EAAE;YAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,IAAA,kBAAO,EAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;gBACzE,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC/C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;iBAC3C;aACF;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9C,IAAI,eAAe,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,GAAG,EAAE,CAAC;SACZ;QAED,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC;QAE1G,IAAI,MAA0B,CAAC;QAC/B,IAAI,eAAe,EAAE;YACnB,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,iBAAM,EAAC;gBACzB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpD,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,gEAAgE,CAAC,CAAC,CAAC,gCAAgC;aAChI,CAAC,CAAC,CAAC;SACL;QAED,QAAQ,MAAM,EAAE;YACd,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjB,uDAAuD;gBACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;gBAEtC,0HAA0H;gBAC1H,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC5B,KAAK,EAAE,yCAAiC;oBACxC,SAAS,EAAE;wBACT,KAAK,EAAE;4BACL,0BAA0B,EAAE,kBAAkB;4BAC9C,OAAO,EAAE,MAAM,IAAA,eAAI,EAAC,KAAK,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE;gCACrD,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;oCAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;iCAC7C;gCAED,OAAO;oCACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;oCAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;oCAChB,OAAO,EAAE,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;oCAC9C,QAAQ,EAAE,0BAAgB,CAAC,MAAM;iCAClC,CAAC;4BACJ,CAAC,CAAC;4BACF,OAAO,EAAE,EAAE;yBACZ;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;aACP;YACD,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjB,MAAM,IAAA,eAAI,EAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC;gBACjC,MAAM;aACP;YACD,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACjB;SACF;QAED,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,KAAc,CAAC;QAEnB,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,CAAW,EAAE,EAAE;YAChC,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO;gBAAE,OAAO;YAE9C,KAAK,GAAG,CAAC,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;YAElC,IAAI;gBACF,WAAW,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aAC3B;oBAAS;gBACR,MAAM,kBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzF,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAExE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;aAClC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE;YACnD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO;oBAAE,OAAO;gBAE9C,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBACvD,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEjB,mIAAmI;gBACnI,8HAA8H;gBAC9H,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;wBACxB,IAAI,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;wBACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC,CAAC;gBACL,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAC7C;YACE,KAAK,EAAE,4CAAoC;YAC3C,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;SACrE,EACD;YACE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,IAAI,EAAE,CAAC,EAAE,oBAAoB,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;gBAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC;qBACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACzF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC3B,CAAC;gBAEF,KAAK,IAAI,CAAC,KAAK;qBACZ,GAAG,CAAC,KAAK,IAAI,EAAE;oBACd,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;wBACrB,mHAAmH;wBACnH,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,kBAAkB,CAAC;wBAChD,OAAO;qBACR;oBAED,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBAE5D,MAAM,IAAA,eAAI,EACR,WAAW,EACX,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;wBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;wBAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAEhC,IAAI,SAAS,IAAI,IAAI,EAAE;4BACrB,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;4BAC5D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gCAC5B,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,0BAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;6BACtH;4BACD,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gCAC1C,MAAM,IAAA,eAAK,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oCAChE,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oCAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gCAC1B,CAAC,CAAC,CAAC;6BACJ;yBACF;6BAAM;4BACL,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;yBAC3B;wBAED,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;4BACrC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;yBACvB;oBACH,CAAC,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;oBAEF,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,kBAAkB,CAAC;gBAClD,CAAC,CAAC;qBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CACF,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAmD,CAAC;QAEpF,IAAI,CAAC,OAAO,GAAG,IAAA,iBAAQ,EAAC,GAAG,EAAE;YAC3B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAEzB,KAAK,IAAI,CAAC,KAAK;iBACZ,GAAG,CAAC,KAAK,IAAI,EAAE;gBACd,MAAM,OAAO,GAAgC,EAAE,CAAC;gBAChD,MAAM,OAAO,GAAgC,EAAE,CAAC;gBAEhD,MAAM,IAAA,eAAI,EACR,UAAU,EACV,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;oBACzB,IAAI,IAAI,EAAE;wBACR,IAAI;4BACF,OAAO,CAAC,IAAI,CAAC;gCACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gCAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;gCACf,OAAO,EAAE,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gCAC9C,QAAQ,EAAE,0BAAgB,CAAC,MAAM;6BAClC,CAAC,CAAC;yBACJ;wBAAC,OAAO,KAAK,EAAE;4BACd,uHAAuH;4BACvH,kEAAkE;4BAClE,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAC;yBACrB;qBACF;yBAAM;wBACL,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;qBAClD;gBACH,CAAC,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;gBAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBAE3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;wBACzC,KAAK,EAAE,yCAAiC;wBACxC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,0BAA0B,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;qBACnG,CAAC,CAAC;oBAEH,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC;oBAC1D,IAAI,CAAC,KAAK,CAAC,0CAA0C,EAAE,kBAAkB,CAAC,CAAC;oBAE3E,IAAI,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;wBACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,kBAAkB,CAAC;qBACjD;iBACF;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvB,IAAI,CAAC,OAAO;aACT,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;aACvB,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC7C,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE7C,IAAI,KAAK,KAAK,QAAQ,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,6CAA6C,EAAE,YAAY,CAAC,CAAC;gBACxE,OAAO;aACR;YAED,IAAI,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;gBAC7B,IAAI,CAAC,KAAK,CAAC,qCAAqC,EAAE,YAAY,CAAC,CAAC;gBAChE,OAAO;aACR;YAED,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;gBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aACvB;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC;gBACrE,OAAO;aACR;YAED,oIAAoI;YACpI,gIAAgI;YAChI,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aAC7C;YAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;gBACtC,IAAI,CAAC,KAAK,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC;gBACrE,OAAO;aACR;YAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAE5C,QAAQ,KAAK,EAAE;gBACb,KAAK,KAAK,CAAC;gBACX,KAAK,QAAQ;oBACX,IAAA,gBAAM,EAAC,KAAK,EAAE,mCAAmC,CAAC,CAAC;oBACnD,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACnF,MAAM;gBACR,KAAK,QAAQ,CAAC;gBACd,KAAK,WAAW;oBACd,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACtC,MAAM;aACT;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;QAEjC,MAAM,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEjF,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;YACtF,MAAM,KAAK,CAAC;SACb;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAClB;IACH,CAAC;;AA9fH,uBA+fC;AA9fQ;;;;WAAoB,CAAC;GAAC;AAEtB;;;;WAAmB,+EAA+E;GAAC;AAEnG;;;;WAAiB,kCAAkC;GAAC;AAEpD;;;;WAAuB,IAAA,mBAAM,EAAA;;;;;;;;;;;;;;;;;;;;;;GAsBnC;GAAC;AAEK;;;;WAAgB;QACrB;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,qFAAqF;YAClG,OAAO,EAAE,GAAG;SACb;KACF;GAAC;AAEK;;;;WAAiB;QACtB,GAAG,EAAE,IAAA,WAAG,EAAC;YACP,OAAO,EAAE,0CAA0C;SACpD,CAAC;QACF,KAAK,EAAE,YAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,wGAAwG;YACjH,OAAO,EAAE,KAAK;SACf,CAAC;QACF,iBAAiB,EAAE,YAAK,CAAC,OAAO,CAAC;YAC/B,OAAO,EAAE,yDAAyD;YAClE,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,IAAI;SACb,CAAC;QACF,0BAA0B,EAAE,YAAK,CAAC,OAAO,CAAC;YACxC,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,0DAA0D;YACnE,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,IAAI;SACb,CAAC;QACF,oBAAoB,EAAE,YAAK,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,yDAAyD;YACtE,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,IAAI;SACb,CAAC;KACH;GAAC;AAEK;;;;WAAoB;QACzB,IAAA,mBAAM,EAAA;;;;;;;;;;KAUL;QACD,IAAA,mBAAM,EAAA;;;;;;;KAOL;KACF;GAAC;AAqaJ,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,mDAAQ,CAAA;IACR,iDAAO,CAAA;IACP,mDAAQ,CAAA;IACR,iDAAO,CAAA;AACT,CAAC,EALW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAKrB;AAED,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,oCAA0B,CAAA;IAC1B,sDAA4C,CAAA;IAC5C,oDAA0C,CAAA;AAC5C,CAAC,EAJW,MAAM,GAAN,cAAM,KAAN,cAAM,QAIjB;AAEY,QAAA,oCAAoC,GAG/B;;;;;;;;;;;;;;;CAejB,CAAC;AAEW,QAAA,0BAA0B,GAAmF;;;;CAIzH,CAAC;AAEW,QAAA,iCAAiC,GAG5B;;;;;;CAMjB,CAAC","sourcesContent":["import { Flags } from \"@oclif/core\";\nimport assert from \"assert\";\nimport { FSWatcher } from \"chokidar\";\nimport execa from \"execa\";\nimport type { Stats } from \"fs-extra\";\nimport fs from \"fs-extra\";\nimport { prompt } from \"inquirer\";\nimport type { DebouncedFunc } from \"lodash\";\nimport { isString } from \"lodash\";\nimport { debounce } from \"lodash\";\nimport normalizePath from \"normalize-path\";\nimport pMap from \"p-map\";\nimport PQueue from \"p-queue\";\nimport path from \"path\";\nimport dedent from \"ts-dedent\";\nimport which from \"which\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport type { Query } from \"../utils/client\";\nimport { Client } from \"../utils/client\";\nimport { context } from \"../utils/context\";\nimport { InvalidSyncAppFlagError, InvalidSyncFileError, YarnNotFoundError } from \"../utils/errors\";\nimport { app } from \"../utils/flags\";\nimport { ignoreEnoent, Ignorer, isEmptyDir, walkDir } from \"../utils/fs-utils\";\nimport { sleepUntil } from \"../utils/sleep\";\nimport type {\n FileSyncChangedEventInput,\n FileSyncDeletedEventInput,\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables,\n RemoteFilesVersionQuery,\n RemoteFilesVersionQueryVariables,\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables,\n} from \"../__generated__/graphql\";\nimport { FileSyncEncoding } from \"../__generated__/graphql\";\n\nexport default class Sync extends BaseCommand {\n static override priority = 1;\n\n static override summary = \"Sync your Gadget application's source code to and from your local filesystem.\";\n\n static override usage = \"sync [--app=<value>] [DIRECTORY]\";\n\n static override description = dedent`\n Sync provides the ability to sync your Gadget application's source code to and from your local\n filesystem. While \\`ggt sync\\` is running, local file changes are immediately reflected within\n Gadget, while files that are changed remotely are immediately saved to your local filesystem.\n\n Use cases for this include:\n * Developing locally with your own editor like VSCode (https://code.visualstudio.com/)\n * Storing your source code in a Git repository like GitHub (https://github.com/)\n\n Sync includes the concept of a \\`.ignore\\` file. This file can contain a list of files and\n directories that won't be received or sent to Gadget when syncing.\n\n The following files and directories are always ignored:\n * .gadget\n * .git\n * node_modules\n\n Note:\n * Gadget applications only support installing dependencies with Yarn 1 (https://classic.yarnpkg.com/lang/en/).\n * Since file changes are immediately reflected in Gadget, avoid the following while \\`ggt sync\\` is running:\n * Deleting all your files\n * Moving all your files to a different directory\n `;\n\n static override args = [\n {\n name: \"directory\",\n description: \"The directory to sync files to. If the directory doesn't exist, it will be created.\",\n default: \".\",\n },\n ];\n\n static override flags = {\n app: app({\n summary: \"The Gadget application to sync files to.\",\n }),\n force: Flags.boolean({\n summary: \"Whether to sync even if we can't determine the state of your local files relative to your remote ones.\",\n default: false,\n }),\n \"file-push-delay\": Flags.integer({\n summary: \"Delay in milliseconds before pushing files to your app.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n \"file-stability-threshold\": Flags.integer({\n name: \"file-stability-threshold\",\n summary: \"Time in milliseconds a file's size must remain the same.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 500,\n hidden: true,\n }),\n \"file-poll-interval\": Flags.integer({\n name: \"file-poll-interval\",\n description: \"Interval in milliseconds between polling a file's size.\",\n helpGroup: \"file\",\n helpValue: \"ms\",\n default: 100,\n hidden: true,\n }),\n };\n\n static override examples = [\n dedent`\n $ ggt sync --app my-app ~/gadget/my-app\n Ready\n Received\n ← routes/GET.js\n ← user/signUp/signIn.js\n Sent\n → routes/GET.js\n ^C Stopping... (press Ctrl+C again to force)\n Done\n `,\n dedent`\n # These are equivalent\n $ ggt sync -a my-app\n $ ggt sync --app my-app\n $ ggt sync --app my-app.gadget.app\n $ ggt sync --app https://my-app.gadget.app\n $ ggt sync --app https://my-app.gadget.app/edit\n `,\n ];\n\n override requireUser = true;\n\n status = SyncStatus.STARTING;\n\n dir!: string;\n\n recentWrites = new Set();\n\n filePushDelay!: number;\n\n queue = new PQueue({ concurrency: 1 });\n\n client!: Client;\n\n ignorer!: Ignorer;\n\n watcher!: FSWatcher;\n\n metadata = {\n app: \"\",\n filesVersion: \"0\",\n mtime: 0,\n };\n\n publish!: DebouncedFunc<() => void>;\n\n stop!: (error?: unknown) => Promise<void>;\n\n relative(to: string): string {\n return path.relative(this.dir, to);\n }\n\n absolute(...pathSegments: string[]): string {\n return path.resolve(this.dir, ...pathSegments);\n }\n\n normalize(filepath: string): string {\n return normalizePath(path.isAbsolute(filepath) ? this.relative(filepath) : filepath);\n }\n\n logPaths(filepaths: string[], { limit = 10, sep = \"-\" } = {}): void {\n let logged = 0;\n for (const filepath of filepaths) {\n this.log(`${sep} ${this.normalize(filepath)}`);\n if (++logged == limit && !this.debugEnabled) break;\n }\n\n if (filepaths.length > logged) {\n this.log(`… ${filepaths.length - logged} more`);\n }\n }\n\n override async init(): Promise<void> {\n await super.init();\n const { args, flags } = await this.parse(Sync);\n\n assert(isString(args[\"directory\"]));\n\n this.dir =\n this.config.windows && args[\"directory\"].startsWith(\"~/\")\n ? path.join(this.config.home, args[\"directory\"].slice(2))\n : path.resolve(args[\"directory\"]);\n\n const getApp = async (): Promise<string> => {\n if (flags.app) return flags.app;\n if (this.metadata.app) return this.metadata.app;\n const selected = await prompt<{ app: string }>({\n type: \"list\",\n name: \"app\",\n message: \"Please select the app to sync to.\",\n choices: await context.getAvailableApps().then((apps) => apps.map((app) => app.slug)),\n });\n return selected.app;\n };\n\n if (await isEmptyDir(this.dir)) {\n this.metadata.app = await getApp();\n } else {\n try {\n this.metadata = await fs.readJson(this.absolute(\".gadget\", \"sync.json\"));\n if (!this.metadata.app) {\n this.metadata.app = await getApp();\n }\n } catch (error) {\n if (!flags.force) {\n throw new InvalidSyncFileError(error, this, flags.app);\n }\n this.metadata.app = await getApp();\n }\n }\n\n if (flags.app && flags.app !== this.metadata.app && !flags.force) {\n throw new InvalidSyncAppFlagError(this, flags.app);\n }\n\n await context.setApp(this.metadata.app);\n\n this.client = new Client();\n\n this.filePushDelay = flags[\"file-push-delay\"];\n\n // local files/folders that should never be published\n this.ignorer = new Ignorer(this.dir, [\"node_modules\", \".gadget\", \".git\"]);\n\n this.watcher = new FSWatcher({\n ignored: (filepath) => this.ignorer.ignores(filepath),\n // don't emit an event for every watched file on boot\n ignoreInitial: true,\n // make sure stats are always present on add/change events\n alwaysStat: true,\n // wait for the entire file to be written before emitting add/change events\n awaitWriteFinish: { pollInterval: flags[\"file-poll-interval\"], stabilityThreshold: flags[\"file-stability-threshold\"] },\n });\n\n this.debug(\"starting\");\n\n if (!which.sync(\"yarn\", { nothrow: true })) {\n throw new YarnNotFoundError();\n }\n\n await fs.ensureDir(this.dir);\n\n const { remoteFilesVersion } = await this.client.queryUnwrap({ query: REMOTE_FILES_VERSION_QUERY });\n const hasRemoteChanges = BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion);\n\n const getChangedFiles = async (): Promise<Map<string, Stats>> => {\n const files = new Map();\n for await (const filepath of walkDir(this.dir, { ignorer: this.ignorer })) {\n const stats = await fs.stat(filepath);\n if (stats.mtime.getTime() > this.metadata.mtime) {\n files.set(this.absolute(filepath), stats);\n }\n }\n return files;\n };\n\n const changedFiles = await getChangedFiles();\n const hasLocalChanges = changedFiles.size > 0;\n if (hasLocalChanges) {\n this.log(\"Local files have changed since the last sync\");\n this.logPaths(Array.from(changedFiles.keys()), { limit: changedFiles.size });\n this.log();\n }\n\n this.debug(\"init %O\", { metadata: this.metadata, remoteFilesVersion, hasRemoteChanges, hasLocalChanges });\n\n let action: Action | undefined;\n if (hasLocalChanges) {\n ({ action } = await prompt({\n type: \"list\",\n name: \"action\",\n choices: [Action.CANCEL, Action.MERGE, Action.RESET],\n message: hasRemoteChanges ? \"Remote files have also changed. How would you like to proceed?\" : \"How would you like to proceed?\",\n }));\n }\n\n switch (action) {\n case Action.MERGE: {\n // get all the changed files again in case more changed\n const files = await getChangedFiles();\n\n // we purposefully don't set the returned remoteFilesVersion here because we haven't processed the in-between versions yet\n await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: {\n input: {\n expectedRemoteFilesVersion: remoteFilesVersion,\n changed: await pMap(files, async ([filepath, stats]) => {\n if (stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n return {\n path: this.normalize(filepath),\n mode: stats.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n };\n }),\n deleted: [],\n },\n },\n });\n break;\n }\n case Action.RESET: {\n await pMap(changedFiles, ([filepath]) => fs.remove(filepath));\n this.metadata.filesVersion = \"0\";\n break;\n }\n case Action.CANCEL: {\n process.exit(0);\n }\n }\n\n this.debug(\"started\");\n }\n\n async run(): Promise<void> {\n let error: unknown;\n\n this.stop = async (e?: unknown) => {\n if (this.status != SyncStatus.RUNNING) return;\n\n error = e;\n this.debug(\"stopping\");\n this.status = SyncStatus.STOPPING;\n\n try {\n unsubscribe();\n this.watcher.removeAllListeners();\n this.publish.flush();\n await this.queue.onIdle();\n } finally {\n await fs.outputJSON(this.absolute(\".gadget\", \"sync.json\"), this.metadata, { spaces: 2 });\n await Promise.allSettled([this.watcher.close(), this.client.dispose()]);\n\n this.debug(\"stopped\");\n this.status = SyncStatus.STOPPED;\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (this.status != SyncStatus.RUNNING) return;\n\n this.log(\" Stopping... (press Ctrl+C again to force)\");\n void this.stop();\n\n // When ggt is run via npx, and the user presses Ctrl+C, npx sends SIGINT twice in quick succession. In order to prevent the second\n // SIGINT from triggering the force exit listener, we wait a bit before registering it. This is a bit of a hack, but it works.\n setTimeout(() => {\n process.once(signal, () => {\n this.log(\" Exiting immediately. Note that files may not have finished syncing.\");\n process.exit(1);\n });\n }, 100).unref();\n });\n }\n\n const unsubscribe = this.client.subscribeUnwrap(\n {\n query: REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION,\n variables: () => ({ localFilesVersion: this.metadata.filesVersion }),\n },\n {\n error: (error) => void this.stop(error),\n next: ({ remoteFileSyncEvents: { remoteFilesVersion, changed, deleted } }) => {\n const remoteFiles = new Map(\n [...deleted, ...changed]\n .filter((event) => event.path.startsWith(\".gadget/\") || !this.ignorer.ignores(event.path))\n .map((e) => [e.path, e])\n );\n\n void this.queue\n .add(async () => {\n if (!remoteFiles.size) {\n // we still need to update filesVersion, otherwise our expectedFilesVersion will be behind the next time we publish\n this.metadata.filesVersion = remoteFilesVersion;\n return;\n }\n\n this.log(\"Received\");\n this.logPaths(Array.from(remoteFiles.keys()), { sep: \"←\" });\n\n await pMap(\n remoteFiles,\n async ([relativePath, file]) => {\n const filepath = this.absolute(relativePath);\n this.recentWrites.add(filepath);\n\n if (\"content\" in file) {\n await fs.ensureDir(path.dirname(filepath), { mode: 0o755 });\n if (!file.path.endsWith(\"/\")) {\n await fs.writeFile(filepath, Buffer.from(file.content, file.encoding ?? FileSyncEncoding.Utf8), { mode: file.mode });\n }\n if (filepath == this.absolute(\"yarn.lock\")) {\n await execa(\"yarn\", [\"install\"], { cwd: this.dir }).catch((err) => {\n this.debug(\"yarn install failed\");\n this.debug(err.message);\n });\n }\n } else {\n await fs.remove(filepath);\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n }\n },\n { stopOnError: false }\n );\n\n this.metadata.filesVersion = remoteFilesVersion;\n })\n .catch(this.stop);\n },\n }\n );\n\n const localFilesBuffer = new Map<string, { mode: number; mtime: number } | false>();\n\n this.publish = debounce(() => {\n const localFiles = new Map(localFilesBuffer.entries());\n localFilesBuffer.clear();\n\n void this.queue\n .add(async () => {\n const changed: FileSyncChangedEventInput[] = [];\n const deleted: FileSyncDeletedEventInput[] = [];\n\n await pMap(\n localFiles,\n async ([filepath, file]) => {\n if (file) {\n try {\n changed.push({\n path: this.normalize(filepath),\n mode: file.mode,\n content: await fs.readFile(filepath, \"base64\"),\n encoding: FileSyncEncoding.Base64,\n });\n } catch (error) {\n // A file could have been changed and then deleted before we process the change event, so the readFile above will raise\n // an ENOENT. This is normal operation, so just ignore this event.\n ignoreEnoent(error);\n }\n } else {\n deleted.push({ path: this.normalize(filepath) });\n }\n },\n { stopOnError: false }\n );\n\n if (changed.length > 0 || deleted.length > 0) {\n this.log(\"Sent\");\n this.logPaths(Array.from(localFiles.keys()), { sep: \"→\" });\n\n const data = await this.client.queryUnwrap({\n query: PUBLISH_FILE_SYNC_EVENTS_MUTATION,\n variables: { input: { expectedRemoteFilesVersion: this.metadata.filesVersion, changed, deleted } },\n });\n\n const { remoteFilesVersion } = data.publishFileSyncEvents;\n this.debug(\"remote files version after publishing %s\", remoteFilesVersion);\n\n if (BigInt(remoteFilesVersion) > BigInt(this.metadata.filesVersion)) {\n this.metadata.filesVersion = remoteFilesVersion;\n }\n }\n })\n .catch(this.stop);\n }, this.filePushDelay);\n\n this.watcher\n .add(`${this.dir}/**/*`)\n .on(\"error\", (error) => void this.stop(error))\n .on(\"all\", (event, filepath, stats) => {\n const relativePath = this.relative(filepath);\n\n if (event === \"addDir\") {\n this.debug(\"skipping event caused by added directory %s\", relativePath);\n return;\n }\n\n if (stats?.isSymbolicLink?.()) {\n this.debug(\"skipping event caused by symlink %s\", relativePath);\n return;\n }\n\n if (filepath == this.ignorer.filepath) {\n this.ignorer.reload();\n } else if (this.ignorer.ignores(filepath)) {\n this.debug(\"skipping event caused by ignored file %s\", relativePath);\n return;\n }\n\n // we only update the mtime if the file is not ignored, because if we restart and the mtime is set to an ignored file, then it could\n // be greater than the mtime of all non ignored files and we'll think that local files have changed when only an ignored one has\n if (stats && stats.mtime.getTime() > this.metadata.mtime) {\n this.metadata.mtime = stats.mtime.getTime();\n }\n\n if (this.recentWrites.delete(filepath)) {\n this.debug(\"skipping event caused by recent write %s\", relativePath);\n return;\n }\n\n this.debug(\"file changed %s\", relativePath);\n\n switch (event) {\n case \"add\":\n case \"change\":\n assert(stats, \"missing stats on add/change event\");\n localFilesBuffer.set(filepath, { mode: stats.mode, mtime: stats.mtime.getTime() });\n break;\n case \"unlink\":\n case \"unlinkDir\":\n localFilesBuffer.set(filepath, false);\n break;\n }\n\n this.publish();\n });\n\n this.log(\"Ready\");\n this.status = SyncStatus.RUNNING;\n\n await sleepUntil(() => this.status == SyncStatus.STOPPED, { timeout: Infinity });\n\n if (error) {\n this.notify({ subtitle: \"Uh oh!\", message: \"An error occurred while syncing files\" });\n throw error;\n } else {\n this.log(\"Done\");\n }\n }\n}\n\nexport enum SyncStatus {\n STARTING,\n RUNNING,\n STOPPING,\n STOPPED,\n}\n\nexport enum Action {\n CANCEL = \"Cancel (Ctrl+C)\",\n MERGE = \"Merge local files with remote ones\",\n RESET = \"Reset local files to remote ones\",\n}\n\nexport const REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION: Query<\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables\n> = /* GraphQL */ `\n subscription RemoteFileSyncEvents($localFilesVersion: String!) {\n remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n deleted {\n path\n }\n }\n }\n`;\n\nexport const REMOTE_FILES_VERSION_QUERY: Query<RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables> = /* GraphQL */ `\n query RemoteFilesVersion {\n remoteFilesVersion\n }\n`;\n\nexport const PUBLISH_FILE_SYNC_EVENTS_MUTATION: Query<\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables\n> = /* GraphQL */ `\n mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {\n publishFileSyncEvents(input: $input) {\n remoteFilesVersion\n }\n }\n`;\n"]}
|
package/lib/commands/whoami.d.ts
CHANGED
package/lib/commands/whoami.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const ts_dedent_1 = tslib_1.__importDefault(require("ts-dedent"));
|
|
5
|
-
const base_command_1 = require("../
|
|
6
|
-
const context_1 = require("../
|
|
5
|
+
const base_command_1 = require("../utils/base-command");
|
|
6
|
+
const context_1 = require("../utils/context");
|
|
7
7
|
class Whoami extends base_command_1.BaseCommand {
|
|
8
8
|
async run() {
|
|
9
9
|
const user = await context_1.context.getUser();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,kEAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,kEAA+B;AAC/B,wDAAoD;AACpD,8CAA2C;AAE3C,MAAqB,MAAO,SAAQ,0BAAW;IAY7C,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAClC,OAAO;SACR;QAED,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAC/D;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAChD;IACH,CAAC;;AAxBH,yBAyBC;AAxBQ;;;;WAAmB,kEAAkE;GAAC;AAEtF;;;;WAAiB,QAAQ;GAAC;AAE1B;;;;WAAoB;QACzB,IAAA,mBAAM,EAAA;;;KAGL;KACF;GAAC","sourcesContent":["import dedent from \"ts-dedent\";\nimport { BaseCommand } from \"../utils/base-command\";\nimport { context } from \"../utils/context\";\n\nexport default class Whoami extends BaseCommand {\n static override summary = \"Show the name and email address of the currently logged in user.\";\n\n static override usage = \"whoami\";\n\n static override examples = [\n dedent`\n $ ggt whoami\n You are logged in as Jane Doe (jane@example.com)\n `,\n ];\n\n async run(): Promise<void> {\n const user = await context.getUser();\n if (!user) {\n this.log(\"You are not logged in\");\n return;\n }\n\n if (user.name) {\n this.log(`You are logged in as ${user.name} (${user.email})`);\n } else {\n this.log(`You are logged in as ${user.email}`);\n }\n }\n}\n"]}
|
|
File without changes
|
|
@@ -136,8 +136,8 @@ class BaseCommand extends core_1.Command {
|
|
|
136
136
|
*/
|
|
137
137
|
async catch(cause) {
|
|
138
138
|
const error = cause instanceof errors_2.BaseError ? cause : new errors_2.UnexpectedError(cause);
|
|
139
|
-
console.error(error.render());
|
|
140
139
|
await error.capture();
|
|
140
|
+
console.error(error.render());
|
|
141
141
|
// The original implementation of `catch` re-throws the error so that it's caught and printed by oclif's `handle` method. We still want
|
|
142
142
|
// to end up in oclif's `handle` method, but we don't want it to print the error again so we throw an ExitError instead. This will cause
|
|
143
143
|
// `handle` to not print the error, but still exit with the correct exit code.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/utils/base-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config } from \"@oclif/core\";\nimport { Command, Flags, settings } from \"@oclif/core\";\nimport { ExitError } from \"@oclif/core/lib/errors\";\nimport Debug from \"debug\";\nimport getPort from \"get-port\";\nimport type { Server } from \"http\";\nimport { createServer } from \"http\";\nimport { prompt } from \"inquirer\";\nimport type { Notification } from \"node-notifier\";\nimport { notify } from \"node-notifier\";\nimport type WindowsBalloon from \"node-notifier/notifiers/balloon\";\nimport type Growl from \"node-notifier/notifiers/growl\";\nimport type NotificationCenter from \"node-notifier/notifiers/notificationcenter\";\nimport type NotifySend from \"node-notifier/notifiers/notifysend\";\nimport type WindowsToaster from \"node-notifier/notifiers/toaster\";\nimport open from \"open\";\nimport path from \"path\";\nimport { context, GADGET_ENDPOINT } from \"./context\";\nimport { BaseError, UnexpectedError as UnknownError } from \"./errors\";\n\nexport abstract class BaseCommand extends Command {\n /**\n * Determines how high the command is listed in the README. The lower the number, the higher the command is listed. Equal numbers are\n * sorted alphabetically.\n */\n static priority = Infinity;\n\n static override globalFlags = {\n debug: Flags.boolean({\n char: \"D\",\n summary: \"Whether to output debug information.\",\n helpGroup: \"global\",\n default: false,\n }),\n };\n\n /**\n * Determines whether the command requires the user to be logged in or not.\n * If true and the user is not logged in, the user will be prompted to login before the command is run.\n */\n readonly requireUser: boolean = false;\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n\n // TODO: Remove this once the `@oclif/core` warnIfFlagDeprecated function checks global flags as well.\n // warnIfFlagDeprecated throws a null pointer because it assumes all parsed flags are in the flags object (which is not the case for global flags).\n // https://github.com/oclif/core/blob/11c5752cec838d08bb27cd55f0f1aa2390df3c5e/src/command.ts#L259\n this.ctor.flags = { ...this.ctor.flags, ...BaseCommand.globalFlags };\n }\n\n /**\n * Indicates whether the command is being run with the `-D/--debug` flag.\n */\n get debugEnabled(): boolean {\n return !!settings.debug;\n }\n\n override async init(): Promise<void> {\n await super.init();\n const { flags, argv } = await this.parse({ flags: BaseCommand.globalFlags, strict: false });\n\n // remove global flags from argv so that when the implementation calls parse, it doesn't get confused by them\n this.argv = argv;\n\n if (flags.debug) {\n settings.debug = true;\n Debug.enable(`${this.config.bin}:*`);\n }\n\n context.config = this.config;\n\n if (this.requireUser && !(await context.getUser())) {\n const { login } = await prompt<{ login: boolean }>({\n type: \"confirm\",\n name: \"login\",\n message: \"You must be logged in to use this command. Would you like to log in?\",\n });\n\n if (!login) {\n return this.exit(0);\n }\n\n await this.login();\n }\n }\n\n /**\n * Sends a native OS notification to the user.\n *\n * @see {@link https://www.npmjs.com/package/node-notifier node-notifier}\n */\n notify(\n notification:\n | Notification\n | NotificationCenter.Notification\n | NotifySend.Notification\n | WindowsToaster.Notification\n | WindowsBalloon.Notification\n | Growl.Notification\n ): void {\n notify(\n {\n title: \"Gadget\",\n contentImage: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n icon: path.join(this.config.root, \"assets\", \"favicon-128@4x.png\"),\n sound: true,\n timeout: false,\n ...notification,\n },\n (error) => {\n if (error) this.warn(error);\n }\n );\n }\n\n /**\n * Opens the Gadget login page in the user's default browser and waits for the user to login.\n */\n async login(): Promise<void> {\n let server: Server | undefined;\n\n try {\n const port = await getPort();\n const receiveSession = new Promise<void>((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n server = createServer(async (req, res) => {\n const redirectTo = new URL(`${GADGET_ENDPOINT}/auth/cli`);\n\n try {\n if (!req.url) throw new Error(\"missing url\");\n const incomingUrl = new URL(req.url, `http://localhost:${port}`);\n\n const value = incomingUrl.searchParams.get(\"session\");\n if (!value) throw new Error(\"missing session\");\n\n context.session = value;\n\n const user = await context.getUser();\n if (!user) throw new Error(\"missing current user\");\n\n if (user.name) {\n this.log(`Hello, ${user.name} (${user.email})`);\n } else {\n this.log(`Hello, ${user.email}`);\n }\n\n redirectTo.searchParams.set(\"success\", \"true\");\n resolve();\n } catch (error) {\n context.session = undefined;\n redirectTo.searchParams.set(\"success\", \"false\");\n reject(error);\n } finally {\n res.writeHead(303, { Location: redirectTo.toString() });\n res.end();\n }\n });\n\n server.listen(port);\n });\n\n const url = new URL(`${GADGET_ENDPOINT}/auth/login`);\n url.searchParams.set(\"returnTo\", `${GADGET_ENDPOINT}/auth/cli/callback?port=${port}`);\n await open(url.toString());\n\n this.log(\"Your browser has been opened. Please log in to your account.\");\n\n await receiveSession;\n } finally {\n server?.close();\n }\n }\n\n /**\n * Overrides the default `catch` behavior so we can control how errors are printed to the user. This is called automatically by oclif when\n * an error is thrown during the `init` or `run` methods.\n */\n override async catch(cause: Error & { exitCode?: number }): Promise<never> {\n const error = cause instanceof BaseError ? cause : new UnknownError(cause);\n await error.capture();\n console.error(error.render());\n\n // The original implementation of `catch` re-throws the error so that it's caught and printed by oclif's `handle` method. We still want\n // to end up in oclif's `handle` method, but we don't want it to print the error again so we throw an ExitError instead. This will cause\n // `handle` to not print the error, but still exit with the correct exit code.\n //\n // catch: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/command.ts#L261\n // handle: https://github.com/oclif/core/blob/12e31ff2288606e583e03bf774a3244f3136cd10/src/errors/handle.ts#L15\n throw new ExitError(process.exitCode ?? cause.exitCode ?? 1);\n }\n}\n"]}
|
|
@@ -19,7 +19,7 @@ export declare class Client {
|
|
|
19
19
|
queryUnwrap<Data extends JsonObject, Variables extends JsonObject>(payload: Payload<Data, Variables>): Promise<Data>;
|
|
20
20
|
dispose(): Promise<void>;
|
|
21
21
|
}
|
|
22
|
-
export
|
|
22
|
+
export type Query<Data extends JsonObject, Variables extends JsonObject = JsonObject, Extensions extends JsonObject = JsonObject> = string & {
|
|
23
23
|
__TData?: Data;
|
|
24
24
|
__TVariables?: Variables;
|
|
25
25
|
__TExtensions?: Extensions;
|
|
@@ -104,16 +104,16 @@ class Client {
|
|
|
104
104
|
subscribePayload = { ...payload, variables: payload.variables() };
|
|
105
105
|
removeConnectedListener = this._client.on("connected", () => {
|
|
106
106
|
if (this.status == ConnectionStatus.RECONNECTING) {
|
|
107
|
-
// subscribePayload.variables is supposed to be readonly (it's not) and payload.variables
|
|
107
|
+
// subscribePayload.variables is supposed to be readonly (it's not) and payload.variables may have been re-assigned (it won't)
|
|
108
108
|
subscribePayload.variables = payload.variables();
|
|
109
|
-
debug("re-sending query
|
|
109
|
+
debug("re-sending%s", subscribePayload.query.split(" ", 2)[0], subscribePayload.query);
|
|
110
110
|
}
|
|
111
111
|
});
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
114
|
subscribePayload = payload;
|
|
115
115
|
}
|
|
116
|
-
debug("sending
|
|
116
|
+
debug("sending%s", subscribePayload.query.split(/\s+/, 2)[0], subscribePayload.query);
|
|
117
117
|
const unsubscribe = this._client.subscribe(subscribePayload, {
|
|
118
118
|
next: (result) => sink.next(result),
|
|
119
119
|
error: (error) => sink.error(new errors_1.ClientError(subscribePayload, error)),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/utils/client.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport Debug from \"debug\";\nimport type { GraphQLError } from \"graphql\";\nimport type { ExecutionResult, SubscribePayload } from \"graphql-ws\";\nimport { createClient } from \"graphql-ws\";\nimport type { ClientRequestArgs } from \"http\";\nimport { isFunction, noop } from \"lodash\";\nimport type { JsonObject, SetOptional } from \"type-fest\";\nimport type { CloseEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport { context } from \"./context\";\nimport { ClientError } from \"./errors\";\n\nconst debug = Debug(\"ggt:client\");\n\nenum ConnectionStatus {\n CONNECTED,\n DISCONNECTED,\n RECONNECTING,\n}\n\nexport class Client {\n // assume the client is going to connect\n status = ConnectionStatus.CONNECTED;\n\n private _client: ReturnType<typeof createClient>;\n\n constructor() {\n assert(context.app, \"context.app must be set before instantiating the Client\");\n const domain = context.env.productionLike ? \"gadget.app\" : \"ggt.pub:3000\";\n\n this._client = createClient({\n url: `wss://${context.app.slug}.${domain}/edit/api/graphql-ws`,\n shouldRetry: () => true,\n webSocketImpl: class extends WebSocket {\n constructor(address: string | URL, protocols?: string | string[], wsOptions?: WebSocket.ClientOptions | ClientRequestArgs) {\n assert(context.session, \"context.session must be set before instantiating the Client\");\n super(address, protocols, {\n ...wsOptions,\n headers: {\n ...wsOptions?.headers,\n \"user-agent\": context.config.userAgent,\n cookie: `session=${encodeURIComponent(context.session)};`,\n },\n });\n }\n },\n on: {\n connecting: () => {\n switch (this.status) {\n case ConnectionStatus.DISCONNECTED:\n this.status = ConnectionStatus.RECONNECTING;\n debug(\"reconnecting...\");\n break;\n case ConnectionStatus.RECONNECTING:\n debug(\"retrying...\");\n break;\n default:\n debug(\"connecting...\");\n break;\n }\n },\n connected: () => {\n if (this.status === ConnectionStatus.RECONNECTING) {\n debug(\"reconnected\");\n } else {\n debug(\"connected\");\n }\n\n // let the other on connected listeners see what status we're in\n setImmediate(() => (this.status = ConnectionStatus.CONNECTED));\n },\n closed: (e) => {\n const event = e as CloseEvent;\n if (event.wasClean) {\n debug(\"connection closed\");\n return;\n }\n\n if (this.status === ConnectionStatus.CONNECTED) {\n this.status = ConnectionStatus.DISCONNECTED;\n debug(\"disconnected\");\n }\n },\n error: (error) => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n debug(\"failed to reconnect %o\", { error });\n } else {\n debug(\"connection error %o\", { error });\n }\n },\n },\n });\n }\n\n subscribe<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>,\n sink: SetOptional<Sink<Data, Extensions>, \"complete\">\n ): () => void {\n let subscribePayload: SubscribePayload;\n let removeConnectedListener: () => void;\n\n if (isFunction(payload.variables)) {\n // the caller wants us to re-evaluate the variables every time graphql-ws re-subscribes after reconnecting\n subscribePayload = { ...payload, variables: payload.variables() };\n removeConnectedListener = this._client.on(\"connected\", () => {\n if (this.status == ConnectionStatus.RECONNECTING) {\n // subscribePayload.variables is supposed to be readonly (it's not) and payload.variables may have been re-assigned (it won't)\n (subscribePayload as any).variables = (payload.variables as any)();\n debug(\"re-sending%s\", subscribePayload.query.split(\" \", 2)[0], subscribePayload.query);\n }\n });\n } else {\n subscribePayload = payload as SubscribePayload;\n }\n\n debug(\"sending%s\", subscribePayload.query.split(/\\s+/, 2)[0], subscribePayload.query);\n const unsubscribe = this._client.subscribe(subscribePayload, {\n next: (result: ExecutionResult<Data, Extensions>) => sink.next(result),\n error: (error) => sink.error(new ClientError(subscribePayload, error as Error | GraphQLError[] | CloseEvent | ErrorEvent)),\n complete: () => sink.complete?.() ?? noop,\n });\n\n return () => {\n removeConnectedListener?.();\n unsubscribe();\n };\n }\n\n subscribeUnwrap<Data extends JsonObject, Variables extends JsonObject>(\n payload: Payload<Data, Variables>,\n sink: { next: (data: Data) => void; error: (error: ClientError) => void }\n ): () => void {\n const unsubscribe = this.subscribe(payload, {\n ...sink,\n next: (result) => {\n if (result.errors) {\n unsubscribe();\n sink.error(new ClientError(payload, result.errors));\n return;\n }\n\n if (!result.data) {\n sink.error(new ClientError(payload, \"We received a response without data\"));\n unsubscribe();\n return;\n }\n\n sink.next(result.data);\n },\n });\n\n return unsubscribe;\n }\n\n query<Data extends JsonObject, Variables extends JsonObject, Extensions extends JsonObject = JsonObject>(\n payload: Payload<Data, Variables>\n ): Promise<ExecutionResult<Data, Extensions>> {\n return new Promise((resolve, reject) => {\n this.subscribe<Data, Variables, Extensions>(payload, { next: resolve, error: reject });\n });\n }\n\n async queryUnwrap<Data extends JsonObject, Variables extends JsonObject>(payload: Payload<Data, Variables>): Promise<Data> {\n const result = await this.query(payload);\n if (result.errors) throw new ClientError(payload, result.errors);\n if (!result.data) throw new ClientError(payload, \"We received a response without data\");\n return result.data;\n }\n\n async dispose(): Promise<void> {\n await this._client.dispose();\n }\n}\n\nexport type Query<\n Data extends JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject\n> = string & {\n __TData?: Data;\n __TVariables?: Variables;\n __TExtensions?: Extensions;\n};\n\nexport interface Payload<Data extends JsonObject, Variables extends JsonObject> {\n readonly query: Query<Data, Variables>;\n readonly variables?: Variables | (() => Variables) | null;\n}\n\nexport interface Sink<Data extends JsonObject, Extensions extends JsonObject> {\n next(value: ExecutionResult<Data, Extensions>): void;\n error(error: ClientError): void;\n complete(): void;\n}\n"]}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config } from \"@oclif/core\";\nimport assert from \"assert\";\nimport fs from \"fs-extra\";\nimport got, { HTTPError } from \"got\";\nimport { isString } from \"lodash\";\nimport path from \"path\";\nimport { ignoreEnoent } from \"./fs-utils\";\n\nclass Context {\n /**\n * A reference to oclif's {@linkcode Config}.\n *\n * By default, oclif's {@linkcode Config} is only available as an instance property on a Command, but we want to be able to access it from\n * anywhere. To do this, we created this global variable that references the Config. It is set by the init function in the BaseCommand.\n */\n config!: Config;\n\n env = new Env();\n\n app?: App;\n\n private _session?: string;\n\n private _user?: User;\n\n private _availableApps: App[] = [];\n\n private _request = got.extend({\n hooks: {\n beforeRequest: [\n (options) => {\n options.headers[\"user-agent\"] = this.config.userAgent;\n if (options.url.origin === GADGET_ENDPOINT && this.session) {\n options.headers[\"cookie\"] = `session=${encodeURIComponent(this.session)};`;\n }\n },\n ],\n },\n });\n\n get session(): string | undefined {\n if (this._session) return this._session;\n\n try {\n this._session = fs.readFileSync(path.join(this.config.configDir, \"session.txt\"), \"utf-8\");\n return this._session;\n } catch (error) {\n ignoreEnoent(error);\n return undefined;\n }\n }\n\n set session(value: string | undefined) {\n this.clear();\n this._session = value;\n if (this._session) {\n fs.outputFileSync(path.join(this.config.configDir, \"session.txt\"), this._session);\n } else {\n fs.removeSync(path.join(this.config.configDir, \"session.txt\"));\n }\n }\n\n /**\n * @returns The current user, or undefined if the user is not logged in.\n */\n async getUser(): Promise<User | undefined> {\n if (!this.session) return undefined;\n if (this._user) return this._user;\n\n try {\n this._user = await this._request(`${GADGET_ENDPOINT}/auth/api/current-user`).json<User>();\n return this._user;\n } catch (error) {\n if (error instanceof HTTPError && error.response.statusCode === 401) {\n this.session = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * @returns The list of Gadget applications the current user has access to.\n */\n async getAvailableApps(): Promise<App[]> {\n if (!this.session) return [];\n if (this._availableApps.length > 0) return this._availableApps;\n\n this._availableApps = await this._request(`${GADGET_ENDPOINT}/auth/api/apps`).json<App[]>();\n return this._availableApps;\n }\n\n async setApp(value: App | string | undefined): Promise<void> {\n if (isString(value)) {\n const app = await this.getAvailableApps().then((apps) => apps.find((app) => app.name == value || app.slug == value));\n assert(app, `attempted to set app to \"${value}\" but no app with that name or slug was found`);\n this.app = app;\n } else {\n this.app = value;\n }\n }\n\n clear(): void {\n this._session = undefined;\n this._user = undefined;\n this.app = undefined;\n this._availableApps = [];\n }\n}\n\n/**\n * Captures the name and nature of the environment\n */\nclass Env {\n get value(): string {\n return process.env[\"GGT_ENV\"] || \"production\";\n }\n\n get productionLike(): boolean {\n return this.value.startsWith(\"production\");\n }\n\n get developmentLike(): boolean {\n return this.value.startsWith(\"development\");\n }\n\n get testLike(): boolean {\n return this.value.startsWith(\"test\");\n }\n\n get developmentOrTestLike(): boolean {\n return this.developmentLike || this.testLike;\n }\n}\n\nexport interface User {\n id: string | number;\n email: string;\n name?: string;\n}\n\nexport interface App {\n id: string | number;\n name: string;\n slug: string;\n}\n\nexport const context = new Context();\n\nexport const GADGET_ENDPOINT = context.env.productionLike ? \"https://app.gadget.dev\" : \"https://app.ggt.dev:3000\";\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { GraphQLError } from "graphql";
|
|
2
|
-
import newGithubIssueUrl from "new-github-issue-url";
|
|
3
2
|
import type { CloseEvent, ErrorEvent } from "ws";
|
|
4
3
|
import type Sync from "../commands/sync";
|
|
5
4
|
import type { Payload } from "./client";
|
|
@@ -13,6 +12,10 @@ export declare abstract class BaseError extends Error {
|
|
|
13
12
|
* A GGT_CLI_SOMETHING human/machine readable unique identifier for this error.
|
|
14
13
|
*/
|
|
15
14
|
code: string;
|
|
15
|
+
/**
|
|
16
|
+
* The Sentry event ID for this error.
|
|
17
|
+
*/
|
|
18
|
+
sentryEventId?: string;
|
|
16
19
|
/**
|
|
17
20
|
* The underlying *thing* that caused this error.
|
|
18
21
|
*/
|
|
@@ -34,7 +37,6 @@ export declare abstract class BaseError extends Error {
|
|
|
34
37
|
render(): string;
|
|
35
38
|
protected header(): string;
|
|
36
39
|
protected footer(): string;
|
|
37
|
-
protected issueOptions(): newGithubIssueUrl.Options;
|
|
38
40
|
protected abstract body(): string;
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
@@ -64,7 +66,6 @@ export declare class ClientError extends BaseError {
|
|
|
64
66
|
isBug: IsBug;
|
|
65
67
|
constructor(payload: Payload<any, any>, cause: string | Error | readonly GraphQLError[] | CloseEvent | ErrorEvent);
|
|
66
68
|
body(): string;
|
|
67
|
-
protected issueOptions(): newGithubIssueUrl.Options;
|
|
68
69
|
}
|
|
69
70
|
export declare class YarnNotFoundError extends BaseError {
|
|
70
71
|
isBug: IsBug;
|
|
@@ -74,6 +75,9 @@ export declare class YarnNotFoundError extends BaseError {
|
|
|
74
75
|
export declare class FlagError<T extends {
|
|
75
76
|
name: string;
|
|
76
77
|
char?: string;
|
|
78
|
+
} = {
|
|
79
|
+
name: string;
|
|
80
|
+
char?: string;
|
|
77
81
|
}> extends BaseError {
|
|
78
82
|
readonly flag: T;
|
|
79
83
|
readonly description: string;
|
|
@@ -89,3 +93,6 @@ export declare class InvalidSyncFileError extends BaseError {
|
|
|
89
93
|
constructor(cause: unknown, sync: Sync, app: string | undefined);
|
|
90
94
|
protected body(): string;
|
|
91
95
|
}
|
|
96
|
+
export declare class InvalidSyncAppFlagError extends FlagError {
|
|
97
|
+
constructor(sync: Sync, app: string);
|
|
98
|
+
}
|