@gadgetinc/ggt 0.2.0 → 0.2.1

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.
@@ -8,6 +8,10 @@ export class FSIgnorer {
8
8
  ignores(filepath) {
9
9
  const relative = path.isAbsolute(filepath) ? path.relative(this._rootDir, filepath) : filepath;
10
10
  if (relative == "") return false;
11
+ // anything above the root dir is ignored
12
+ if (relative == "..") {
13
+ return true;
14
+ }
11
15
  return this._ignorer.ignores(relative);
12
16
  }
13
17
  reload() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/fs-utils.ts"],"sourcesContent":["import Debug from \"debug\";\nimport fs from \"fs-extra\";\nimport type { Ignore } from \"ignore\";\nimport ignore from \"ignore\";\nimport path from \"path\";\n\nconst debug = Debug(\"ggt:fs-utils\");\n\nexport class FSIgnorer {\n readonly filepath;\n\n private _ignorer!: Ignore;\n\n constructor(private readonly _rootDir: string, private readonly _alwaysIgnore: string[]) {\n this.filepath = path.join(this._rootDir, \".ignore\");\n this.reload();\n }\n\n ignores(filepath: string): boolean {\n const relative = path.isAbsolute(filepath) ? path.relative(this._rootDir, filepath) : filepath;\n if (relative == \"\") return false;\n return this._ignorer.ignores(relative);\n }\n\n reload(): void {\n this._ignorer = ignore.default();\n this._ignorer.add(this._alwaysIgnore);\n\n try {\n this._ignorer.add(fs.readFileSync(this.filepath, \"utf-8\"));\n debug(\"reloaded ignore rules from %s\", this.filepath);\n } catch (error) {\n ignoreEnoent(error);\n }\n }\n}\n\nexport interface WalkDirOptions {\n ignorer?: FSIgnorer;\n}\n\nexport async function* walkDir(dir: string, options: WalkDirOptions = {}): AsyncGenerator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (await isEmptyDir(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for await (const entry of await fs.opendir(dir)) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function* walkDirSync(dir: string, options: WalkDirOptions = {}): Generator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (isEmptyDirSync(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDirSync(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function isEmptyDirSync(dir: string, opts = { ignoreEnoent: true }): boolean {\n try {\n const files = fs.readdirSync(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport async function isEmptyDir(dir: string, opts = { ignoreEnoent: true }): Promise<boolean> {\n try {\n const files = await fs.readdir(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport function ignoreEnoent(error: any): void {\n if (error.code === \"ENOENT\") {\n debug(\"ignoring ENOENT error %s\", error.path);\n return;\n }\n throw error;\n}\n"],"names":["Debug","fs","ignore","path","debug","FSIgnorer","ignores","filepath","relative","isAbsolute","_rootDir","_ignorer","reload","default","add","_alwaysIgnore","readFileSync","error","ignoreEnoent","constructor","join","walkDir","dir","options","ignorer","isEmptyDir","entry","opendir","name","isDirectory","isFile","walkDirSync","isEmptyDirSync","readdirSync","withFileTypes","opts","files","length","readdir","code"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/fs-utils.ts"],"sourcesContent":["import Debug from \"debug\";\nimport fs from \"fs-extra\";\nimport type { Ignore } from \"ignore\";\nimport ignore from \"ignore\";\nimport path from \"path\";\n\nconst debug = Debug(\"ggt:fs-utils\");\n\nexport class FSIgnorer {\n readonly filepath;\n\n private _ignorer!: Ignore;\n\n constructor(private readonly _rootDir: string, private readonly _alwaysIgnore: string[]) {\n this.filepath = path.join(this._rootDir, \".ignore\");\n this.reload();\n }\n\n ignores(filepath: string): boolean {\n const relative = path.isAbsolute(filepath) ? path.relative(this._rootDir, filepath) : filepath;\n if (relative == \"\") return false;\n // anything above the root dir is ignored\n if (relative == \"..\") {\n return true;\n }\n return this._ignorer.ignores(relative);\n }\n\n reload(): void {\n this._ignorer = ignore.default();\n this._ignorer.add(this._alwaysIgnore);\n\n try {\n this._ignorer.add(fs.readFileSync(this.filepath, \"utf-8\"));\n debug(\"reloaded ignore rules from %s\", this.filepath);\n } catch (error) {\n ignoreEnoent(error);\n }\n }\n}\n\nexport interface WalkDirOptions {\n ignorer?: FSIgnorer;\n}\n\nexport async function* walkDir(dir: string, options: WalkDirOptions = {}): AsyncGenerator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (await isEmptyDir(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for await (const entry of await fs.opendir(dir)) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDir(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function* walkDirSync(dir: string, options: WalkDirOptions = {}): Generator<string> {\n if (options.ignorer?.ignores(dir)) return;\n\n if (isEmptyDirSync(dir)) {\n yield `${dir}/`;\n return;\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const filepath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkDirSync(filepath, options);\n } else if (entry.isFile() && !options.ignorer?.ignores(filepath)) {\n yield filepath;\n }\n }\n}\n\nexport function isEmptyDirSync(dir: string, opts = { ignoreEnoent: true }): boolean {\n try {\n const files = fs.readdirSync(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport async function isEmptyDir(dir: string, opts = { ignoreEnoent: true }): Promise<boolean> {\n try {\n const files = await fs.readdir(dir);\n return files.length === 0;\n } catch (error) {\n if (opts.ignoreEnoent) {\n ignoreEnoent(error);\n return true;\n }\n throw error;\n }\n}\n\nexport function ignoreEnoent(error: any): void {\n if (error.code === \"ENOENT\") {\n debug(\"ignoring ENOENT error %s\", error.path);\n return;\n }\n throw error;\n}\n"],"names":["Debug","fs","ignore","path","debug","FSIgnorer","ignores","filepath","relative","isAbsolute","_rootDir","_ignorer","reload","default","add","_alwaysIgnore","readFileSync","error","ignoreEnoent","constructor","join","walkDir","dir","options","ignorer","isEmptyDir","entry","opendir","name","isDirectory","isFile","walkDirSync","isEmptyDirSync","readdirSync","withFileTypes","opts","files","length","readdir","code"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/help.ts"],"sourcesContent":["import type { Command } from \"@oclif/core\";\nimport { CommandHelp as OclifCommandHelp, Help as OclifHelp } from \"@oclif/core\";\nimport _ from \"lodash\";\n\nexport default class Help extends OclifHelp {\n override CommandHelpClass = CommandHelp;\n}\n\nclass CommandHelp extends OclifCommandHelp {\n /**\n * By default, oclif tries to format the description so that it fit's within the terminal window. However, if the description is already\n * formatted with `dedent`, then the description gets mangled and the help output is not pretty.\n *\n * This overrides the default behavior to just use the description as-is if it already exists.\n */\n protected override description(): string | undefined {\n if (this.command.description) {\n return this.command.description;\n }\n return super.description();\n }\n\n /**\n * Same as above, but for examples.\n */\n protected override examples(examples: string | string[] | Command.Example[] | undefined): string | undefined {\n if (_.isString(examples)) {\n return examples;\n }\n if (Array.isArray(examples) && examples.every((e) => _.isString(e))) {\n return examples.join(\"\\n\\n\");\n }\n return super.examples(examples);\n }\n}\n"],"names":["CommandHelp","OclifCommandHelp","Help","OclifHelp","_","CommandHelpClass","description","command","examples","isString","Array","isArray","every","e","join"],"mappings":";AACA,SAASA,eAAeC,gBAAgB,EAAEC,QAAQC,SAAS,QAAQ,cAAc;AACjF,OAAOC,OAAO,SAAS;AAER,MAAMF,aAAaC;;;QAChC,uBAASE,oBAAmBL;;AAC9B;AAFA,SAAqBE,kBAEpB;AAED,MAAMF,oBAAoBC;IACxB;;;;;GAKC,GACD,AAAmBK,cAAkC;QACnD,IAAI,IAAI,CAACC,QAAQD,aAAa;YAC5B,OAAO,IAAI,CAACC,QAAQD;QACtB;QACA,OAAO,KAAK,CAACA;IACf;IAEA;;GAEC,GACD,AAAmBE,SAASA,QAA2D,EAAsB;QAC3G,IAAIJ,EAAEK,SAASD,WAAW;YACxB,OAAOA;QACT;QACA,IAAIE,MAAMC,QAAQH,aAAaA,SAASI,MAAM,CAACC,IAAMT,EAAEK,SAASI,KAAK;YACnE,OAAOL,SAASM,KAAK;QACvB;QACA,OAAO,KAAK,CAACN,SAASA;IACxB;AACF"}
1
+ {"version":3,"sources":["../../src/utils/help.ts"],"sourcesContent":["import type { Command } from \"@oclif/core\";\nimport { CommandHelp as OclifCommandHelp, Help as OclifHelp } from \"@oclif/core\";\nimport _ from \"lodash\";\n\nexport default class Help extends OclifHelp {\n override CommandHelpClass = CommandHelp;\n}\n\nclass CommandHelp extends OclifCommandHelp {\n /**\n * By default, oclif tries to format the description so that it fit's within the terminal window. However, if the description is already\n * formatted with `dedent`, then the description gets mangled and the help output is not pretty.\n *\n * This overrides the default behavior to just use the description as-is if it already exists.\n */\n protected override description(): string | undefined {\n if (this.command.description) {\n return this.command.description;\n }\n return super.description();\n }\n\n /**\n * Same as above, but for examples.\n */\n protected override examples(examples: string | string[] | Command.Example[] | undefined): string | undefined {\n if (_.isString(examples)) {\n return examples;\n }\n if (Array.isArray(examples) && examples.every((e) => _.isString(e))) {\n return examples.join(\"\\n\\n\");\n }\n return super.examples(examples);\n }\n}\n"],"names":["CommandHelp","OclifCommandHelp","Help","OclifHelp","_","CommandHelpClass","description","command","examples","isString","Array","isArray","every","e","join"],"mappings":";AACA,SAASA,eAAeC,gBAAgB,EAAEC,QAAQC,SAAS,QAAQ,cAAc;AACjF,OAAOC,OAAO,SAAS;AAER,MAAMF,aAAaC;;;QAChC,uBAASE,oBAAmBL;;AAC9B;AAFA,SAAqBE,kBAEpB;AAED,MAAMF,oBAAoBC;IACxB;;;;;GAKC,GACD,AAAmBK,cAAkC;QACnD,IAAI,IAAI,CAACC,OAAO,CAACD,WAAW,EAAE;YAC5B,OAAO,IAAI,CAACC,OAAO,CAACD,WAAW;QACjC;QACA,OAAO,KAAK,CAACA;IACf;IAEA;;GAEC,GACD,AAAmBE,SAASA,QAA2D,EAAsB;QAC3G,IAAIJ,EAAEK,QAAQ,CAACD,WAAW;YACxB,OAAOA;QACT;QACA,IAAIE,MAAMC,OAAO,CAACH,aAAaA,SAASI,KAAK,CAAC,CAACC,IAAMT,EAAEK,QAAQ,CAACI,KAAK;YACnE,OAAOL,SAASM,IAAI,CAAC;QACvB;QACA,OAAO,KAAK,CAACN,SAASA;IACxB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/promise.ts"],"sourcesContent":["/**\n * Long lived references to Promises stress the garbage collector in JS. Instead of caching resolved Promises, we cache\n * these little data objects instead which reference the resolution or rejection of the Promise, allowing the Promise\n * object to be free'd.\n */\nexport class PromiseWrapper<T> {\n resolution?: T;\n rejection?: any;\n pendingPromise?: Promise<T>;\n\n constructor(promise: Promise<T>) {\n this.pendingPromise = promise;\n\n promise\n .then((res) => {\n this.resolution = res;\n return res;\n })\n .catch((err) => {\n this.rejection = err;\n })\n .finally(() => {\n delete this.pendingPromise;\n });\n }\n\n async unwrap(): Promise<T> {\n if (this.resolution) {\n return this.resolution;\n } else if (this.rejection) {\n throw this.rejection;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return await this.pendingPromise!;\n }\n }\n}\n\n/**\n * A promise that can be resolved or rejected from outside its callback.\n *\n * This is typically used when you want to await a promise that is resolved or rejected from outside the current scope,\n * such as from an event handler.\n *\n * @example\n * const signal = new PromiseSignal();\n * process.on(\"SIGINT\", () => {\n * signal.resolve();\n * });\n * await signal;\n */\nexport class PromiseSignal<T = void> implements Promise<T> {\n readonly [Symbol.toStringTag]!: string;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n reject!: (reason?: any) => void;\n\n private _promise: PromiseWrapper<T>;\n\n constructor() {\n this._promise = new PromiseWrapper<T>(\n new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n })\n );\n\n this[Symbol.toStringTag] = String(this._promise.pendingPromise);\n }\n\n then<R = T, E = never>(onfulfilled?: (value: T) => R | PromiseLike<R>, onrejected?: (reason: any) => E | PromiseLike<E>): Promise<R | E> {\n return this._promise.unwrap().then(onfulfilled, onrejected);\n }\n\n catch<E = never>(onrejected?: (reason: any) => E | PromiseLike<E>): Promise<T | E> {\n return this._promise.unwrap().catch(onrejected);\n }\n\n finally(onfinally?: () => void): Promise<T> {\n return this._promise.unwrap().finally(onfinally);\n }\n}\n"],"names":["PromiseWrapper","unwrap","resolution","rejection","pendingPromise","constructor","promise","then","res","catch","err","finally","Symbol","toStringTag","PromiseSignal","onfulfilled","onrejected","_promise","onfinally","resolve","reject","Promise","String"],"mappings":"AAAA;;;;CAIC;AACD,OAAO,MAAMA;IAqBX,MAAMC,SAAqB;QACzB,IAAI,IAAI,CAACC,YAAY;YACnB,OAAO,IAAI,CAACA;QACd,OAAO,IAAI,IAAI,CAACC,WAAW;YACzB,MAAM,IAAI,CAACA;QACb,OAAO;YACL,oEAAoE;YACpE,OAAO,MAAM,IAAI,CAACC;QACpB;IACF;IAzBAC,YAAYC,OAAmB,CAAE;QAJjCJ,uBAAAA,cAAAA,KAAAA;QACAC,uBAAAA,aAAAA,KAAAA;QACAC,uBAAAA,kBAAAA,KAAAA;QAGE,IAAI,CAACA,iBAAiBE;QAEtBA,QACGC,KAAK,CAACC;YACL,IAAI,CAACN,aAAaM;YAClB,OAAOA;QACT,GACCC,MAAM,CAACC;YACN,IAAI,CAACP,YAAYO;QACnB,GACCC,QAAQ;YACP,OAAO,IAAI,CAACP;QACd;IACJ;AAYF;IAgBYQ,sBAAAA,OAAOC;AAdnB;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC;IAmBXP,KAAuBQ,WAA8C,EAAEC,UAAgD,EAAkB;QACvI,OAAO,IAAI,CAACC,SAAShB,SAASM,KAAKQ,aAAaC;IAClD;IAEAP,MAAiBO,UAAgD,EAAkB;QACjF,OAAO,IAAI,CAACC,SAAShB,SAASQ,MAAMO;IACtC;IAEAL,QAAQO,SAAsB,EAAc;QAC1C,OAAO,IAAI,CAACD,SAAShB,SAASU,QAAQO;IACxC;IArBAb,aAAc;QAPd,uBAAUO,qBAAV,KAAA;QAEAO,uBAAAA,WAAAA,KAAAA;QACAC,uBAAAA,UAAAA,KAAAA;QAEA,uBAAQH,YAAR,KAAA;QAGE,IAAI,CAACA,WAAW,IAAIjB,eAClB,IAAIqB,QAAQ,CAACF,SAASC;YACpB,IAAI,CAACD,UAAUA;YACf,IAAI,CAACC,SAASA;QAChB;QAGF,IAAI,CAACR,OAAOC,YAAY,GAAGS,OAAO,IAAI,CAACL,SAASb;IAClD;AAaF"}
1
+ {"version":3,"sources":["../../src/utils/promise.ts"],"sourcesContent":["/**\n * Long lived references to Promises stress the garbage collector in JS. Instead of caching resolved Promises, we cache\n * these little data objects instead which reference the resolution or rejection of the Promise, allowing the Promise\n * object to be free'd.\n */\nexport class PromiseWrapper<T> {\n resolution?: T;\n rejection?: any;\n pendingPromise?: Promise<T>;\n\n constructor(promise: Promise<T>) {\n this.pendingPromise = promise;\n\n promise\n .then((res) => {\n this.resolution = res;\n return res;\n })\n .catch((err) => {\n this.rejection = err;\n })\n .finally(() => {\n delete this.pendingPromise;\n });\n }\n\n async unwrap(): Promise<T> {\n if (this.resolution) {\n return this.resolution;\n } else if (this.rejection) {\n throw this.rejection;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return await this.pendingPromise!;\n }\n }\n}\n\n/**\n * A promise that can be resolved or rejected from outside its callback.\n *\n * This is typically used when you want to await a promise that is resolved or rejected from outside the current scope,\n * such as from an event handler.\n *\n * @example\n * const signal = new PromiseSignal();\n * process.on(\"SIGINT\", () => {\n * signal.resolve();\n * });\n * await signal;\n */\nexport class PromiseSignal<T = void> implements Promise<T> {\n readonly [Symbol.toStringTag]!: string;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n reject!: (reason?: any) => void;\n\n private _promise: PromiseWrapper<T>;\n\n constructor() {\n this._promise = new PromiseWrapper<T>(\n new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n })\n );\n\n this[Symbol.toStringTag] = String(this._promise.pendingPromise);\n }\n\n then<R = T, E = never>(onfulfilled?: (value: T) => R | PromiseLike<R>, onrejected?: (reason: any) => E | PromiseLike<E>): Promise<R | E> {\n return this._promise.unwrap().then(onfulfilled, onrejected);\n }\n\n catch<E = never>(onrejected?: (reason: any) => E | PromiseLike<E>): Promise<T | E> {\n return this._promise.unwrap().catch(onrejected);\n }\n\n finally(onfinally?: () => void): Promise<T> {\n return this._promise.unwrap().finally(onfinally);\n }\n}\n"],"names":["PromiseWrapper","unwrap","resolution","rejection","pendingPromise","constructor","promise","then","res","catch","err","finally","Symbol","toStringTag","PromiseSignal","onfulfilled","onrejected","_promise","onfinally","resolve","reject","Promise","String"],"mappings":"AAAA;;;;CAIC;AACD,OAAO,MAAMA;IAqBX,MAAMC,SAAqB;QACzB,IAAI,IAAI,CAACC,UAAU,EAAE;YACnB,OAAO,IAAI,CAACA,UAAU;QACxB,OAAO,IAAI,IAAI,CAACC,SAAS,EAAE;YACzB,MAAM,IAAI,CAACA,SAAS;QACtB,OAAO;YACL,oEAAoE;YACpE,OAAO,MAAM,IAAI,CAACC,cAAc;QAClC;IACF;IAzBAC,YAAYC,OAAmB,CAAE;QAJjCJ,uBAAAA,cAAAA,KAAAA;QACAC,uBAAAA,aAAAA,KAAAA;QACAC,uBAAAA,kBAAAA,KAAAA;QAGE,IAAI,CAACA,cAAc,GAAGE;QAEtBA,QACGC,IAAI,CAAC,CAACC;YACL,IAAI,CAACN,UAAU,GAAGM;YAClB,OAAOA;QACT,GACCC,KAAK,CAAC,CAACC;YACN,IAAI,CAACP,SAAS,GAAGO;QACnB,GACCC,OAAO,CAAC;YACP,OAAO,IAAI,CAACP,cAAc;QAC5B;IACJ;AAYF;IAgBYQ,sBAAAA,OAAOC,WAAW;AAd9B;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC;IAmBXP,KAAuBQ,WAA8C,EAAEC,UAAgD,EAAkB;QACvI,OAAO,IAAI,CAACC,QAAQ,CAAChB,MAAM,GAAGM,IAAI,CAACQ,aAAaC;IAClD;IAEAP,MAAiBO,UAAgD,EAAkB;QACjF,OAAO,IAAI,CAACC,QAAQ,CAAChB,MAAM,GAAGQ,KAAK,CAACO;IACtC;IAEAL,QAAQO,SAAsB,EAAc;QAC1C,OAAO,IAAI,CAACD,QAAQ,CAAChB,MAAM,GAAGU,OAAO,CAACO;IACxC;IArBAb,aAAc;QAPd,uBAAUO,qBAAV,KAAA;QAEAO,uBAAAA,WAAAA,KAAAA;QACAC,uBAAAA,UAAAA,KAAAA;QAEA,uBAAQH,YAAR,KAAA;QAGE,IAAI,CAACA,QAAQ,GAAG,IAAIjB,eAClB,IAAIqB,QAAQ,CAACF,SAASC;YACpB,IAAI,CAACD,OAAO,GAAGA;YACf,IAAI,CAACC,MAAM,GAAGA;QAChB;QAGF,IAAI,CAACR,OAAOC,WAAW,CAAC,GAAGS,OAAO,IAAI,CAACL,QAAQ,CAACb,cAAc;IAChE;AAaF"}
@@ -1,7 +1,7 @@
1
1
  export function sleep(ms = 0) {
2
2
  return new Promise((resolve)=>ms == 0 ? setImmediate(resolve) : setTimeout(resolve, ms));
3
3
  }
4
- export async function sleepUntil(fn, { interval =0 , timeout =process.env["CI"] ? 5000 : 500 } = {}) {
4
+ export async function sleepUntil(fn, { interval = 0, timeout = process.env["CI"] ? 5000 : 500 } = {}) {
5
5
  const start = isFinite(timeout) && Date.now();
6
6
  // eslint-disable-next-line no-constant-condition
7
7
  while(true){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/sleep.ts"],"sourcesContent":["export function sleep(ms = 0): Promise<void> {\n return new Promise((resolve) => (ms == 0 ? setImmediate(resolve) : setTimeout(resolve, ms)));\n}\n\nexport async function sleepUntil(fn: () => boolean, { interval = 0, timeout = process.env[\"CI\"] ? 5000 : 500 } = {}): Promise<void> {\n const start = isFinite(timeout) && Date.now();\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (fn()) return;\n await sleep(interval);\n\n if (start && Date.now() - start > timeout) {\n const error = new Error(`Timed out after ${timeout} milliseconds`);\n Error.captureStackTrace(error, sleepUntil);\n throw error;\n }\n }\n}\n"],"names":["sleep","ms","Promise","resolve","setImmediate","setTimeout","sleepUntil","fn","interval","timeout","process","env","start","isFinite","Date","now","error","Error","captureStackTrace"],"mappings":"AAAA,OAAO,SAASA,MAAMC,KAAK,CAAC;IAC1B,OAAO,IAAIC,QAAQ,CAACC,UAAaF,MAAM,IAAIG,aAAaD,WAAWE,WAAWF,SAASF;AACzF;AAEA,OAAO,eAAeK,WAAWC,EAAiB,EAAE,EAAEC,UAAW,EAAC,EAAEC,SAAUC,QAAQC,GAAG,CAAC,KAAK,GAAG,OAAO,IAAG,EAAE,GAAG,CAAC,CAAC;IACjH,MAAMC,QAAQC,SAASJ,YAAYK,KAAKC;IAExC,iDAAiD;IACjD,MAAO,KAAM;QACX,IAAIR,MAAM;QACV,MAAMP,MAAMQ;QAEZ,IAAII,SAASE,KAAKC,QAAQH,QAAQH,SAAS;YACzC,MAAMO,QAAQ,IAAIC,MAAM,CAAC,gBAAgB,EAAER,QAAQ,aAAa,CAAC;YACjEQ,MAAMC,kBAAkBF,OAAOV;YAC/B,MAAMU;QACR;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utils/sleep.ts"],"sourcesContent":["export function sleep(ms = 0): Promise<void> {\n return new Promise((resolve) => (ms == 0 ? setImmediate(resolve) : setTimeout(resolve, ms)));\n}\n\nexport async function sleepUntil(fn: () => boolean, { interval = 0, timeout = process.env[\"CI\"] ? 5000 : 500 } = {}): Promise<void> {\n const start = isFinite(timeout) && Date.now();\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (fn()) return;\n await sleep(interval);\n\n if (start && Date.now() - start > timeout) {\n const error = new Error(`Timed out after ${timeout} milliseconds`);\n Error.captureStackTrace(error, sleepUntil);\n throw error;\n }\n }\n}\n"],"names":["sleep","ms","Promise","resolve","setImmediate","setTimeout","sleepUntil","fn","interval","timeout","process","env","start","isFinite","Date","now","error","Error","captureStackTrace"],"mappings":"AAAA,OAAO,SAASA,MAAMC,KAAK,CAAC;IAC1B,OAAO,IAAIC,QAAQ,CAACC,UAAaF,MAAM,IAAIG,aAAaD,WAAWE,WAAWF,SAASF;AACzF;AAEA,OAAO,eAAeK,WAAWC,EAAiB,EAAE,EAAEC,WAAW,CAAC,EAAEC,UAAUC,QAAQC,GAAG,CAAC,KAAK,GAAG,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;IACjH,MAAMC,QAAQC,SAASJ,YAAYK,KAAKC,GAAG;IAE3C,iDAAiD;IACjD,MAAO,KAAM;QACX,IAAIR,MAAM;QACV,MAAMP,MAAMQ;QAEZ,IAAII,SAASE,KAAKC,GAAG,KAAKH,QAAQH,SAAS;YACzC,MAAMO,QAAQ,IAAIC,MAAM,CAAC,gBAAgB,EAAER,QAAQ,aAAa,CAAC;YACjEQ,MAAMC,iBAAiB,CAACF,OAAOV;YAC/B,MAAMU;QACR;IACF;AACF"}