@teambit/ripple 0.0.256 → 0.0.258

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.
@@ -39,6 +39,13 @@ function _legacy() {
39
39
  };
40
40
  return data;
41
41
  }
42
+ function _scope() {
43
+ const data = require("@teambit/scope.network");
44
+ _scope = function () {
45
+ return data;
46
+ };
47
+ return data;
48
+ }
42
49
  function _export() {
43
50
  const data = require("@teambit/export");
44
51
  _export = function () {
@@ -80,11 +87,24 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
80
87
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
81
88
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
82
89
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
90
+ /**
91
+ * where Ripple CI looks for dependents of the lane components when simulating. the server can't resolve
92
+ * the dependents graph without a positive search base, so the caller always sets `scopeIds` or `ownerIds`.
93
+ */
94
+
83
95
  class RippleMain {
84
96
  constructor(cloud, logger, workspace) {
85
97
  this.cloud = cloud;
86
98
  this.logger = logger;
87
99
  this.workspace = workspace;
100
+ /**
101
+ * every Ripple CI GraphQL request goes through this, so it honors the configured proxy, CA and network
102
+ * settings, the same way the cloud aspect reaches bit.cloud. kept as a field so tests can replace it:
103
+ * the agent-wrapped fetcher doesn't go through the global fetch.
104
+ * the log-streaming endpoint (`getContainerLog`) deliberately stays on the global fetch - it reads the
105
+ * response as a web stream (`body.getReader()`), which the agent-wrapped node-fetch response doesn't have.
106
+ */
107
+ _defineProperty(this, "fetcher", _scope().fetchWithAgent);
88
108
  }
89
109
  ensureAuthenticated() {
90
110
  if (!this.cloud.getAuthToken()) {
@@ -101,7 +121,7 @@ class RippleMain {
101
121
  const headers = _objectSpread({
102
122
  'Content-Type': 'application/json'
103
123
  }, this.cloud.getAuthHeader());
104
- const response = await fetch(graphqlUrl, {
124
+ const response = await this.fetcher(graphqlUrl, {
105
125
  method: 'POST',
106
126
  headers,
107
127
  body
@@ -291,6 +311,62 @@ class RippleMain {
291
311
  return data?.stopJob ?? null;
292
312
  }
293
313
 
314
+ /**
315
+ * start a simulation job for a lane. Ripple CI builds the dependents of the lane components (searched in
316
+ * the given network of scopes/owners) against the lane heads, without merging or publishing anything.
317
+ * the schema also accepts an `incrementStrategy`, but a simulation publishes nothing so it's not exposed
318
+ * and the server default is used.
319
+ * `options.network` is always sent (empty when no filter is given): the schema marks `options` as
320
+ * optional, but the resolver reads `options.network` unconditionally and fails when it's omitted.
321
+ */
322
+ async simulateLane(laneId, network) {
323
+ const filters = Object.entries(network || {}).filter(([, values]) => values?.length);
324
+ const options = {
325
+ network: Object.fromEntries(filters)
326
+ };
327
+ const data = await this.fetchRippleGQL(RippleMain.SIMULATE_LANE, {
328
+ laneId,
329
+ options
330
+ });
331
+ const job = data?.simulateLane;
332
+ if (!job) return null;
333
+ // the mutation returns the job before it's persisted: only the slug is set, id and status are null.
334
+ // fetch the persisted job so callers get the real id, which "ripple log/errors" need.
335
+ if (!job.id && job.slug) return (await this.getPersistedJobBySlug(job.slug)) ?? job;
336
+ return job;
337
+ }
338
+
339
+ /**
340
+ * poll for the persisted job: the simulate mutation responds before the job is written, so a single
341
+ * immediate lookup can still come back empty. the delay doubles between the attempts, to cover more
342
+ * server lag with the same number of requests. returns null once the budget is spent - the simulation is
343
+ * already running by then, so the caller reports it without an id rather than failing the command.
344
+ */
345
+ async getPersistedJobBySlug(slug) {
346
+ for (let attempt = 1; attempt <= RippleMain.JOB_LOOKUP_ATTEMPTS; attempt += 1) {
347
+ const data = await this.fetchRippleGQL(RippleMain.GET_JOB_BY_SLUG_MINIMAL, {
348
+ slug
349
+ }).catch(err => {
350
+ this.logger.debug(`simulateLane: lookup of job "${slug}" failed on attempt ${attempt}: ${err.message}`);
351
+ return null;
352
+ });
353
+ if (data?.getJob?.id) return data.getJob;
354
+ if (attempt < RippleMain.JOB_LOOKUP_ATTEMPTS) {
355
+ await new Promise(resolve => setTimeout(resolve, RippleMain.JOB_LOOKUP_DELAY_MS * 2 ** (attempt - 1)));
356
+ }
357
+ }
358
+ this.logger.debug(`simulateLane: job "${slug}" was not persisted after ${RippleMain.JOB_LOOKUP_ATTEMPTS} lookups`);
359
+ return null;
360
+ }
361
+
362
+ /**
363
+ * whether the current lane was exported at least once. undefined when not on a lane / no workspace.
364
+ */
365
+ isCurrentLaneExported() {
366
+ if (!this.workspace || !this.getCurrentLaneId()) return undefined;
367
+ return this.workspace.consumer.bitMap.isLaneExported;
368
+ }
369
+
294
370
  /**
295
371
  * detect the current lane from the workspace.
296
372
  * returns the laneId in "scope/lane-name" format, or undefined if not on a lane.
@@ -365,7 +441,7 @@ class RippleMain {
365
441
  const logger = loggerAspect.createLogger(_ripple().RippleAspect.id);
366
442
  const ripple = new RippleMain(cloud, logger, workspace);
367
443
  const rippleCmd = new (_ripple2().RippleCmd)();
368
- rippleCmd.commands = [new (_ripple2().RippleListCmd)(ripple), new (_ripple2().RippleLogCmd)(ripple), new (_ripple2().RippleErrorsCmd)(ripple), new (_ripple2().RippleRetryCmd)(ripple), new (_ripple2().RippleStopCmd)(ripple)];
444
+ rippleCmd.commands = [new (_ripple2().RippleListCmd)(ripple), new (_ripple2().RippleLogCmd)(ripple), new (_ripple2().RippleErrorsCmd)(ripple), new (_ripple2().RippleRetryCmd)(ripple), new (_ripple2().RippleStopCmd)(ripple), new (_ripple2().RippleSimulateCmd)(ripple)];
369
445
  cli.register(rippleCmd);
370
446
  return ripple;
371
447
  }
@@ -453,6 +529,37 @@ _defineProperty(RippleMain, "STOP_JOB", `
453
529
  }
454
530
  }
455
531
  `);
532
+ _defineProperty(RippleMain, "SIMULATE_LANE", `
533
+ mutation simulateLane($laneId: String, $options: SimulateLaneOptions) {
534
+ simulateLane(laneId: $laneId, options: $options) {
535
+ id
536
+ slug
537
+ name
538
+ laneId
539
+ simulation
540
+ status { startedAt finishedAt phase }
541
+ }
542
+ }
543
+ `);
544
+ /**
545
+ * the same lookup as GET_JOB_BY_SLUG without the two CI graph blobs, which the simulate flow never reads.
546
+ * a simulation is a wide dependents fan-out, so those blobs are unbounded and the poll can run 3 times.
547
+ */
548
+ _defineProperty(RippleMain, "GET_JOB_BY_SLUG_MINIMAL", `
549
+ query getJobBySlug($slug: ID!) {
550
+ getJob(slug: $slug) {
551
+ id
552
+ slug
553
+ name
554
+ laneId
555
+ simulation
556
+ status { startedAt finishedAt phase }
557
+ }
558
+ }
559
+ `);
560
+ /** how many times to look the persisted job up, and the backoff between the attempts */
561
+ _defineProperty(RippleMain, "JOB_LOOKUP_ATTEMPTS", 3);
562
+ _defineProperty(RippleMain, "JOB_LOOKUP_DELAY_MS", 200);
456
563
  _ripple().RippleAspect.addRuntime(RippleMain);
457
564
 
458
565
  //# sourceMappingURL=ripple.main.runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_cli","data","require","_logger","_cloud","_workspace","_legacy","_export","_rippleUtils","_stripAnsi","_interopRequireDefault","_ripple","_ripple2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RippleMain","constructor","cloud","logger","workspace","ensureAuthenticated","getAuthToken","Error","fetchRippleGQL","query","variables","graphqlUrl","getCloudApi","body","JSON","stringify","headers","getAuthHeader","response","fetch","method","ok","text","catch","status","json","errors","messages","map","message","join","listJobs","opts","LIST_JOBS","filters","limit","offset","getJob","jobId","GET_JOB","getCiGraphNodes","job","ciGraph","graph","parse","nodes","node","attr","ids","id","stripComponentVersion","componentIds","containerName","name","phase","getComponentBuildSummary","componentId","GET_COMPONENT_BUILD_SUMMARY","getContainerLog","url","Accept","controller","AbortController","hardTimeout","setTimeout","abort","idleTimer","signal","clearTimeout","reader","getReader","decoder","TextDecoder","buffer","resetIdle","done","read","decode","stream","lines","split","pop","line","startsWith","parsed","substring","err","warn","getContainerLogs","containerNames","results","Promise","allSettled","log","logMap","Map","result","set","extractErrorsFromLog","markers","startIdx","findIndex","m","clean","stripAnsi","some","re","test","slice","retryJob","RETRY_JOB","stopJob","STOP_JOB","getCurrentLaneId","undefined","laneId","isDefault","toString","getLastExport","readLastExport","scope","path","getJobBySlug","slug","GET_JOB_BY_SLUG","findLatestJobForLane","lanes","jobs","getDefaultOwner","defaultScope","includes","getJobUrl","segment","laneParts","laneName","getCloudDomain","provider","cli","loggerAspect","createLogger","RippleAspect","ripple","rippleCmd","RippleCmd","commands","RippleListCmd","RippleLogCmd","RippleErrorsCmd","RippleRetryCmd","RippleStopCmd","register","exports","MainRuntime","CLIAspect","CloudAspect","LoggerAspect","WorkspaceAspect","addRuntime"],"sources":["ripple.main.runtime.ts"],"sourcesContent":["import type { RuntimeDefinition } from '@teambit/harmony';\nimport { CLIAspect, type CLIMain, MainRuntime } from '@teambit/cli';\nimport { LoggerAspect, type LoggerMain, type Logger } from '@teambit/logger';\nimport { CloudAspect, type CloudMain } from '@teambit/cloud';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport { getCloudDomain } from '@teambit/legacy.constants';\nimport { readLastExport, type LastExportData } from '@teambit/export';\nimport { stripComponentVersion } from './ripple-utils';\nimport stripAnsi from 'strip-ansi';\nimport { RippleAspect } from './ripple.aspect';\nimport { RippleCmd, RippleListCmd, RippleLogCmd, RippleErrorsCmd, RippleRetryCmd, RippleStopCmd } from './ripple.cmd';\n\nexport type JobStatus = {\n startedAt?: string;\n finishedAt?: string;\n phase?: string;\n};\n\nexport type RippleJob = {\n id: string;\n /** url-safe identifier used by the cloud UI; the bit.cloud /ripple-ci/job/ page resolves by slug, not id */\n slug?: string;\n name?: string;\n laneId?: string;\n simulation?: boolean;\n user?: { username?: string; displayName?: string };\n status?: JobStatus;\n};\n\nexport type RippleJobFull = RippleJob & { hash?: string; ciGraph?: string; ciComponentGraph?: string };\n\nexport type BuildTaskStatus = {\n status?: string;\n warnings?: number;\n};\n\nexport type BuildTaskSummary = {\n name?: string;\n description?: string;\n startTime?: string;\n status?: BuildTaskStatus;\n};\n\nexport type ComponentBuildSummary = {\n id?: string;\n name?: string;\n tasks?: BuildTaskSummary[];\n};\n\nexport type CiGraphNode = {\n componentIds: string[];\n containerName: string;\n phase: string;\n};\n\nexport class RippleMain {\n static runtime: RuntimeDefinition = MainRuntime;\n static dependencies = [CLIAspect, CloudAspect, LoggerAspect, WorkspaceAspect];\n\n constructor(\n private cloud: CloudMain,\n private logger: Logger,\n private workspace?: Workspace\n ) {}\n\n private static LIST_JOBS = `\n query listJobs($filters: FilterOptions, $limit: Int, $offset: Int) {\n listJobs(filters: $filters, limit: $limit, offset: $offset) {\n id\n name\n laneId\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static GET_JOB = `\n query getJob($jobId: ID!) {\n getJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_JOB_BY_SLUG = `\n query getJobBySlug($slug: ID!) {\n getJob(slug: $slug) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_COMPONENT_BUILD_SUMMARY = `\n query getComponentBuildSummary($jobId: ID!, $componentId: String!) {\n getComponentBuildSummary(jobId: $jobId, componentId: $componentId) {\n id\n name\n tasks {\n name\n description\n startTime\n status { status warnings }\n }\n }\n }\n `;\n\n private static RETRY_JOB = `\n mutation retryJob($jobId: ID!) {\n retryJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static STOP_JOB = `\n mutation stopJob($jobId: ID!) {\n stopJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private ensureAuthenticated(): void {\n if (!this.cloud.getAuthToken()) {\n throw new Error('You are not logged in. Please run \"bit login\" first.');\n }\n }\n\n private async fetchRippleGQL<T>(query: string, variables?: Record<string, any>): Promise<T | null> {\n this.ensureAuthenticated();\n const graphqlUrl = `${this.cloud.getCloudApi()}/graphql`;\n const body = JSON.stringify({ query, variables });\n const headers = {\n 'Content-Type': 'application/json',\n ...this.cloud.getAuthHeader(),\n };\n const response = await fetch(graphqlUrl, { method: 'POST', headers, body });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Ripple CI API returned HTTP ${response.status}: ${text}`);\n }\n const json = (await response.json()) as { data?: T; errors?: Array<{ message: string }> };\n if (json.errors?.length) {\n const messages = json.errors.map((e) => e.message).join(', ');\n throw new Error(`Ripple CI API error: ${messages}`);\n }\n return json.data ?? null;\n }\n\n async listJobs(opts: {\n limit?: number;\n offset?: number;\n filters?: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string };\n }): Promise<RippleJob[]> {\n const data = await this.fetchRippleGQL<{ listJobs: RippleJob[] }>(RippleMain.LIST_JOBS, {\n filters: opts.filters,\n limit: opts.limit ?? 20,\n offset: opts.offset,\n });\n return data?.listJobs ?? [];\n }\n\n async getJob(jobId: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB, { jobId });\n return data?.getJob ?? null;\n }\n\n /**\n * parse a job's ciGraph (internal graph) to extract per-node build status.\n * ciGraph has the job-specific build results (unlike ciComponentGraph which is static).\n * each node represents a build container that builds one or more components.\n */\n getCiGraphNodes(job: { ciGraph?: string }): CiGraphNode[] {\n if (!job.ciGraph) return [];\n try {\n const graph = JSON.parse(job.ciGraph) as { nodes?: Array<{ id: string; attr: string | Record<string, any> }> };\n if (!graph.nodes) return [];\n return graph.nodes.map((node) => {\n const attr = typeof node.attr === 'string' ? JSON.parse(node.attr) : node.attr;\n const ids: string[] = (attr.ids || []).map((id: string) => stripComponentVersion(id));\n return {\n componentIds: ids,\n containerName: attr.status?.name || node.id,\n phase: attr.status?.phase || 'UNKNOWN',\n };\n });\n } catch {\n return [];\n }\n }\n\n async getComponentBuildSummary(jobId: string, componentId: string): Promise<ComponentBuildSummary | null> {\n const data = await this.fetchRippleGQL<{ getComponentBuildSummary: ComponentBuildSummary }>(\n RippleMain.GET_COMPONENT_BUILD_SUMMARY,\n { jobId, componentId }\n );\n return data?.getComponentBuildSummary ?? null;\n }\n\n /**\n * fetch build logs for a specific container in a job via the REST SSE endpoint.\n * uses an idle timeout to detect end-of-stream (SSE connections may not close).\n */\n async getContainerLog(jobId: string, containerName: string): Promise<string[]> {\n this.ensureAuthenticated();\n const url = `${this.cloud.getCloudApi()}/ripple-ci/api/job/log/${jobId}/${containerName}`;\n const headers = {\n Accept: 'text/event-stream',\n ...this.cloud.getAuthHeader(),\n };\n const controller = new AbortController();\n // hard cap to avoid hanging forever\n const hardTimeout = setTimeout(() => controller.abort(), 30_000);\n const messages: string[] = [];\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const response = await fetch(url, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n clearTimeout(hardTimeout);\n return [];\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const resetIdle = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => controller.abort(), 3_000);\n };\n resetIdle();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read();\n if (done) break;\n resetIdle();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n try {\n const parsed = JSON.parse(line.substring(6)) as { message?: string };\n if (parsed.message != null) messages.push(parsed.message);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== 'AbortError') {\n this.logger.warn(`Failed to fetch container log: ${err?.message}`);\n }\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n clearTimeout(hardTimeout);\n }\n return messages;\n }\n\n /**\n * fetch build logs for multiple containers in parallel.\n */\n async getContainerLogs(jobId: string, containerNames: string[]): Promise<Map<string, string[]>> {\n const results = await Promise.allSettled(\n containerNames.map(async (name) => {\n const log = await this.getContainerLog(jobId, name);\n return { name, log };\n })\n );\n const logMap = new Map<string, string[]>();\n for (const result of results) {\n if (result.status === 'fulfilled') {\n logMap.set(result.value.name, result.value.log);\n }\n }\n return logMap;\n }\n\n /**\n * extract the error section from container log messages.\n * looks for common error markers in the build output and returns from the *earliest* one\n * to the end, so the whole error block is shown starting at where it began.\n */\n extractErrorsFromLog(messages: string[]): string[] {\n // markers that denote the start of a real error section. most are matched\n // case-insensitively; the named-Error marker is intentionally case-sensitive so it\n // catches \"TypeError:\" / \"ReferenceError:\" at line start or after whitespace without\n // matching serialized props such as \"isUserError: true\" (a common tail of a stringified\n // error object) — matching that would slice from the very end and drop the real error\n // printed above it.\n const markers: RegExp[] = [\n /errors were found/i,\n /failed task/i,\n /threw an error/i,\n /responded with the following error/i,\n /unable to find object/i,\n /\\berror:/i,\n /(^|\\s)[A-Z]\\w*Error:/,\n /\\bfail\\b/i,\n ];\n // pick the earliest line matching any marker (not the first marker in the list) so an\n // incidental late match can't truncate the error that appeared earlier in the log.\n const startIdx = messages.findIndex((m) => {\n const clean = stripAnsi(m);\n return markers.some((re) => re.test(clean));\n });\n if (startIdx >= 0) {\n return messages.slice(startIdx);\n }\n // last resort: grab the last 30 lines if the log has content\n if (messages.length > 0) {\n return messages.slice(-30);\n }\n return [];\n }\n\n async retryJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ retryJob: RippleJob }>(RippleMain.RETRY_JOB, { jobId });\n return data?.retryJob ?? null;\n }\n\n async stopJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ stopJob: RippleJob }>(RippleMain.STOP_JOB, { jobId });\n return data?.stopJob ?? null;\n }\n\n /**\n * detect the current lane from the workspace.\n * returns the laneId in \"scope/lane-name\" format, or undefined if not on a lane.\n */\n getCurrentLaneId(): string | undefined {\n if (!this.workspace) return undefined;\n const laneId = this.workspace.getCurrentLaneId();\n if (!laneId || laneId.isDefault()) return undefined;\n return laneId.toString();\n }\n\n /**\n * read the last-export.json written by ExportMain after a successful export.\n * used to auto-resolve the ripple job when the user is on main (no current lane).\n */\n async getLastExport(): Promise<LastExportData | null> {\n if (!this.workspace) return null;\n return readLastExport(this.workspace.scope.path);\n }\n\n /**\n * the central-hub returns url slugs in `metadata.jobs`, not the GraphQL job ids accepted by getJob(jobId).\n * the schema also supports getJob(slug: ID!), which we use here to fetch the job directly from a slug.\n */\n async getJobBySlug(slug: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB_BY_SLUG, { slug });\n return data?.getJob ?? null;\n }\n\n /**\n * find the latest job for a given laneId, optionally filtered by status phase.\n */\n async findLatestJobForLane(laneId: string, phase?: string): Promise<RippleJob | null> {\n const filters: { lanes: string[]; status?: string } = { lanes: [laneId] };\n if (phase) {\n filters.status = phase;\n }\n const jobs = await this.listJobs({ filters, limit: 1 });\n return jobs[0] ?? null;\n }\n\n /**\n * detect the workspace owner from the workspace defaultScope.\n */\n getDefaultOwner(): string | undefined {\n const defaultScope = this.workspace?.defaultScope;\n if (!defaultScope?.includes('.')) return undefined;\n return defaultScope.split('.')[0];\n }\n\n getJobUrl(job: RippleJob): string {\n // the bit.cloud UI resolves the /ripple-ci/job/<id-or-slug> segment by slug;\n // job.id (a uuid) returns \"No CI job found\", so prefer slug when present.\n const segment = job.slug || job.id;\n if (job.laneId) {\n // laneId format: \"scope/lane-name\", e.g. \"att-bit.duc/my-lane\"\n const [scope, ...laneParts] = job.laneId.split('/');\n const laneName = laneParts.join('/');\n if (scope && laneName) {\n return `https://${getCloudDomain()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${segment}`;\n }\n }\n return `https://${getCloudDomain()}/ripple-ci/job/${segment}`;\n }\n\n static async provider([cli, cloud, loggerAspect, workspace]: [CLIMain, CloudMain, LoggerMain, Workspace]) {\n const logger = loggerAspect.createLogger(RippleAspect.id);\n const ripple = new RippleMain(cloud, logger, workspace);\n\n const rippleCmd = new RippleCmd();\n rippleCmd.commands = [\n new RippleListCmd(ripple),\n new RippleLogCmd(ripple),\n new RippleErrorsCmd(ripple),\n new RippleRetryCmd(ripple),\n new RippleStopCmd(ripple),\n ];\n cli.register(rippleCmd);\n\n return ripple;\n }\n}\n\nRippleAspect.addRuntime(RippleMain);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_cli","data","require","_logger","_cloud","_workspace","_legacy","_scope","_export","_rippleUtils","_stripAnsi","_interopRequireDefault","_ripple","_ripple2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RippleMain","constructor","cloud","logger","workspace","fetchWithAgent","ensureAuthenticated","getAuthToken","Error","fetchRippleGQL","query","variables","graphqlUrl","getCloudApi","body","JSON","stringify","headers","getAuthHeader","response","fetcher","method","ok","text","catch","status","json","errors","messages","map","message","join","listJobs","opts","LIST_JOBS","filters","limit","offset","getJob","jobId","GET_JOB","getCiGraphNodes","job","ciGraph","graph","parse","nodes","node","attr","ids","id","stripComponentVersion","componentIds","containerName","name","phase","getComponentBuildSummary","componentId","GET_COMPONENT_BUILD_SUMMARY","getContainerLog","url","Accept","controller","AbortController","hardTimeout","setTimeout","abort","idleTimer","fetch","signal","clearTimeout","reader","getReader","decoder","TextDecoder","buffer","resetIdle","done","read","decode","stream","lines","split","pop","line","startsWith","parsed","substring","err","warn","getContainerLogs","containerNames","results","Promise","allSettled","log","logMap","Map","result","set","extractErrorsFromLog","markers","startIdx","findIndex","m","clean","stripAnsi","some","re","test","slice","retryJob","RETRY_JOB","stopJob","STOP_JOB","simulateLane","laneId","network","entries","values","options","fromEntries","SIMULATE_LANE","slug","getPersistedJobBySlug","attempt","JOB_LOOKUP_ATTEMPTS","GET_JOB_BY_SLUG_MINIMAL","debug","resolve","JOB_LOOKUP_DELAY_MS","isCurrentLaneExported","getCurrentLaneId","undefined","consumer","bitMap","isLaneExported","isDefault","toString","getLastExport","readLastExport","scope","path","getJobBySlug","GET_JOB_BY_SLUG","findLatestJobForLane","lanes","jobs","getDefaultOwner","defaultScope","includes","getJobUrl","segment","laneParts","laneName","getCloudDomain","provider","cli","loggerAspect","createLogger","RippleAspect","ripple","rippleCmd","RippleCmd","commands","RippleListCmd","RippleLogCmd","RippleErrorsCmd","RippleRetryCmd","RippleStopCmd","RippleSimulateCmd","register","exports","MainRuntime","CLIAspect","CloudAspect","LoggerAspect","WorkspaceAspect","addRuntime"],"sources":["ripple.main.runtime.ts"],"sourcesContent":["import type { RuntimeDefinition } from '@teambit/harmony';\nimport { CLIAspect, type CLIMain, MainRuntime } from '@teambit/cli';\nimport { LoggerAspect, type LoggerMain, type Logger } from '@teambit/logger';\nimport { CloudAspect, type CloudMain } from '@teambit/cloud';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport { getCloudDomain } from '@teambit/legacy.constants';\nimport { fetchWithAgent } from '@teambit/scope.network';\nimport { readLastExport, type LastExportData } from '@teambit/export';\nimport { stripComponentVersion } from './ripple-utils';\nimport stripAnsi from 'strip-ansi';\nimport { RippleAspect } from './ripple.aspect';\nimport {\n RippleCmd,\n RippleListCmd,\n RippleLogCmd,\n RippleErrorsCmd,\n RippleRetryCmd,\n RippleStopCmd,\n RippleSimulateCmd,\n} from './ripple.cmd';\n\nexport type JobStatus = {\n startedAt?: string;\n finishedAt?: string;\n phase?: string;\n};\n\nexport type RippleJob = {\n id: string;\n /** url-safe identifier used by the cloud UI; the bit.cloud /ripple-ci/job/ page resolves by slug, not id */\n slug?: string;\n name?: string;\n laneId?: string;\n simulation?: boolean;\n user?: { username?: string; displayName?: string };\n status?: JobStatus;\n};\n\nexport type RippleJobFull = RippleJob & { hash?: string; ciGraph?: string; ciComponentGraph?: string };\n\n/**\n * where Ripple CI looks for dependents of the lane components when simulating. the server can't resolve\n * the dependents graph without a positive search base, so the caller always sets `scopeIds` or `ownerIds`.\n */\nexport type SimulateNetwork = {\n scopeIds?: string[];\n ownerIds?: string[];\n excludeScopeIds?: string[];\n};\n\nexport type BuildTaskStatus = {\n status?: string;\n warnings?: number;\n};\n\nexport type BuildTaskSummary = {\n name?: string;\n description?: string;\n startTime?: string;\n status?: BuildTaskStatus;\n};\n\nexport type ComponentBuildSummary = {\n id?: string;\n name?: string;\n tasks?: BuildTaskSummary[];\n};\n\nexport type CiGraphNode = {\n componentIds: string[];\n containerName: string;\n phase: string;\n};\n\nexport class RippleMain {\n static runtime: RuntimeDefinition = MainRuntime;\n static dependencies = [CLIAspect, CloudAspect, LoggerAspect, WorkspaceAspect];\n\n constructor(\n private cloud: CloudMain,\n private logger: Logger,\n private workspace?: Workspace\n ) {}\n\n private static LIST_JOBS = `\n query listJobs($filters: FilterOptions, $limit: Int, $offset: Int) {\n listJobs(filters: $filters, limit: $limit, offset: $offset) {\n id\n name\n laneId\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static GET_JOB = `\n query getJob($jobId: ID!) {\n getJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_JOB_BY_SLUG = `\n query getJobBySlug($slug: ID!) {\n getJob(slug: $slug) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_COMPONENT_BUILD_SUMMARY = `\n query getComponentBuildSummary($jobId: ID!, $componentId: String!) {\n getComponentBuildSummary(jobId: $jobId, componentId: $componentId) {\n id\n name\n tasks {\n name\n description\n startTime\n status { status warnings }\n }\n }\n }\n `;\n\n private static RETRY_JOB = `\n mutation retryJob($jobId: ID!) {\n retryJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static STOP_JOB = `\n mutation stopJob($jobId: ID!) {\n stopJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static SIMULATE_LANE = `\n mutation simulateLane($laneId: String, $options: SimulateLaneOptions) {\n simulateLane(laneId: $laneId, options: $options) {\n id\n slug\n name\n laneId\n simulation\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n /**\n * the same lookup as GET_JOB_BY_SLUG without the two CI graph blobs, which the simulate flow never reads.\n * a simulation is a wide dependents fan-out, so those blobs are unbounded and the poll can run 3 times.\n */\n private static GET_JOB_BY_SLUG_MINIMAL = `\n query getJobBySlug($slug: ID!) {\n getJob(slug: $slug) {\n id\n slug\n name\n laneId\n simulation\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n /** how many times to look the persisted job up, and the backoff between the attempts */\n private static JOB_LOOKUP_ATTEMPTS = 3;\n private static JOB_LOOKUP_DELAY_MS = 200;\n\n private ensureAuthenticated(): void {\n if (!this.cloud.getAuthToken()) {\n throw new Error('You are not logged in. Please run \"bit login\" first.');\n }\n }\n\n /**\n * every Ripple CI GraphQL request goes through this, so it honors the configured proxy, CA and network\n * settings, the same way the cloud aspect reaches bit.cloud. kept as a field so tests can replace it:\n * the agent-wrapped fetcher doesn't go through the global fetch.\n * the log-streaming endpoint (`getContainerLog`) deliberately stays on the global fetch - it reads the\n * response as a web stream (`body.getReader()`), which the agent-wrapped node-fetch response doesn't have.\n */\n private fetcher: typeof fetchWithAgent = fetchWithAgent;\n\n private async fetchRippleGQL<T>(query: string, variables?: Record<string, any>): Promise<T | null> {\n this.ensureAuthenticated();\n const graphqlUrl = `${this.cloud.getCloudApi()}/graphql`;\n const body = JSON.stringify({ query, variables });\n const headers = {\n 'Content-Type': 'application/json',\n ...this.cloud.getAuthHeader(),\n };\n const response = await this.fetcher(graphqlUrl, { method: 'POST', headers, body });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Ripple CI API returned HTTP ${response.status}: ${text}`);\n }\n const json = (await response.json()) as { data?: T; errors?: Array<{ message: string }> };\n if (json.errors?.length) {\n const messages = json.errors.map((e) => e.message).join(', ');\n throw new Error(`Ripple CI API error: ${messages}`);\n }\n return json.data ?? null;\n }\n\n async listJobs(opts: {\n limit?: number;\n offset?: number;\n filters?: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string };\n }): Promise<RippleJob[]> {\n const data = await this.fetchRippleGQL<{ listJobs: RippleJob[] }>(RippleMain.LIST_JOBS, {\n filters: opts.filters,\n limit: opts.limit ?? 20,\n offset: opts.offset,\n });\n return data?.listJobs ?? [];\n }\n\n async getJob(jobId: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB, { jobId });\n return data?.getJob ?? null;\n }\n\n /**\n * parse a job's ciGraph (internal graph) to extract per-node build status.\n * ciGraph has the job-specific build results (unlike ciComponentGraph which is static).\n * each node represents a build container that builds one or more components.\n */\n getCiGraphNodes(job: { ciGraph?: string }): CiGraphNode[] {\n if (!job.ciGraph) return [];\n try {\n const graph = JSON.parse(job.ciGraph) as { nodes?: Array<{ id: string; attr: string | Record<string, any> }> };\n if (!graph.nodes) return [];\n return graph.nodes.map((node) => {\n const attr = typeof node.attr === 'string' ? JSON.parse(node.attr) : node.attr;\n const ids: string[] = (attr.ids || []).map((id: string) => stripComponentVersion(id));\n return {\n componentIds: ids,\n containerName: attr.status?.name || node.id,\n phase: attr.status?.phase || 'UNKNOWN',\n };\n });\n } catch {\n return [];\n }\n }\n\n async getComponentBuildSummary(jobId: string, componentId: string): Promise<ComponentBuildSummary | null> {\n const data = await this.fetchRippleGQL<{ getComponentBuildSummary: ComponentBuildSummary }>(\n RippleMain.GET_COMPONENT_BUILD_SUMMARY,\n { jobId, componentId }\n );\n return data?.getComponentBuildSummary ?? null;\n }\n\n /**\n * fetch build logs for a specific container in a job via the REST SSE endpoint.\n * uses an idle timeout to detect end-of-stream (SSE connections may not close).\n */\n async getContainerLog(jobId: string, containerName: string): Promise<string[]> {\n this.ensureAuthenticated();\n const url = `${this.cloud.getCloudApi()}/ripple-ci/api/job/log/${jobId}/${containerName}`;\n const headers = {\n Accept: 'text/event-stream',\n ...this.cloud.getAuthHeader(),\n };\n const controller = new AbortController();\n // hard cap to avoid hanging forever\n const hardTimeout = setTimeout(() => controller.abort(), 30_000);\n const messages: string[] = [];\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const response = await fetch(url, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n clearTimeout(hardTimeout);\n return [];\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const resetIdle = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => controller.abort(), 3_000);\n };\n resetIdle();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read();\n if (done) break;\n resetIdle();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n try {\n const parsed = JSON.parse(line.substring(6)) as { message?: string };\n if (parsed.message != null) messages.push(parsed.message);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== 'AbortError') {\n this.logger.warn(`Failed to fetch container log: ${err?.message}`);\n }\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n clearTimeout(hardTimeout);\n }\n return messages;\n }\n\n /**\n * fetch build logs for multiple containers in parallel.\n */\n async getContainerLogs(jobId: string, containerNames: string[]): Promise<Map<string, string[]>> {\n const results = await Promise.allSettled(\n containerNames.map(async (name) => {\n const log = await this.getContainerLog(jobId, name);\n return { name, log };\n })\n );\n const logMap = new Map<string, string[]>();\n for (const result of results) {\n if (result.status === 'fulfilled') {\n logMap.set(result.value.name, result.value.log);\n }\n }\n return logMap;\n }\n\n /**\n * extract the error section from container log messages.\n * looks for common error markers in the build output and returns from the *earliest* one\n * to the end, so the whole error block is shown starting at where it began.\n */\n extractErrorsFromLog(messages: string[]): string[] {\n // markers that denote the start of a real error section. most are matched\n // case-insensitively; the named-Error marker is intentionally case-sensitive so it\n // catches \"TypeError:\" / \"ReferenceError:\" at line start or after whitespace without\n // matching serialized props such as \"isUserError: true\" (a common tail of a stringified\n // error object) — matching that would slice from the very end and drop the real error\n // printed above it.\n const markers: RegExp[] = [\n /errors were found/i,\n /failed task/i,\n /threw an error/i,\n /responded with the following error/i,\n /unable to find object/i,\n /\\berror:/i,\n /(^|\\s)[A-Z]\\w*Error:/,\n /\\bfail\\b/i,\n ];\n // pick the earliest line matching any marker (not the first marker in the list) so an\n // incidental late match can't truncate the error that appeared earlier in the log.\n const startIdx = messages.findIndex((m) => {\n const clean = stripAnsi(m);\n return markers.some((re) => re.test(clean));\n });\n if (startIdx >= 0) {\n return messages.slice(startIdx);\n }\n // last resort: grab the last 30 lines if the log has content\n if (messages.length > 0) {\n return messages.slice(-30);\n }\n return [];\n }\n\n async retryJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ retryJob: RippleJob }>(RippleMain.RETRY_JOB, { jobId });\n return data?.retryJob ?? null;\n }\n\n async stopJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ stopJob: RippleJob }>(RippleMain.STOP_JOB, { jobId });\n return data?.stopJob ?? null;\n }\n\n /**\n * start a simulation job for a lane. Ripple CI builds the dependents of the lane components (searched in\n * the given network of scopes/owners) against the lane heads, without merging or publishing anything.\n * the schema also accepts an `incrementStrategy`, but a simulation publishes nothing so it's not exposed\n * and the server default is used.\n * `options.network` is always sent (empty when no filter is given): the schema marks `options` as\n * optional, but the resolver reads `options.network` unconditionally and fails when it's omitted.\n */\n async simulateLane(laneId: string, network?: SimulateNetwork): Promise<RippleJob | null> {\n const filters = Object.entries(network || {}).filter(([, values]) => values?.length);\n const options = { network: Object.fromEntries(filters) };\n const data = await this.fetchRippleGQL<{ simulateLane: RippleJob }>(RippleMain.SIMULATE_LANE, {\n laneId,\n options,\n });\n const job = data?.simulateLane;\n if (!job) return null;\n // the mutation returns the job before it's persisted: only the slug is set, id and status are null.\n // fetch the persisted job so callers get the real id, which \"ripple log/errors\" need.\n if (!job.id && job.slug) return (await this.getPersistedJobBySlug(job.slug)) ?? job;\n return job;\n }\n\n /**\n * poll for the persisted job: the simulate mutation responds before the job is written, so a single\n * immediate lookup can still come back empty. the delay doubles between the attempts, to cover more\n * server lag with the same number of requests. returns null once the budget is spent - the simulation is\n * already running by then, so the caller reports it without an id rather than failing the command.\n */\n private async getPersistedJobBySlug(slug: string): Promise<RippleJob | null> {\n for (let attempt = 1; attempt <= RippleMain.JOB_LOOKUP_ATTEMPTS; attempt += 1) {\n const data = await this.fetchRippleGQL<{ getJob: RippleJob }>(RippleMain.GET_JOB_BY_SLUG_MINIMAL, {\n slug,\n }).catch((err: Error) => {\n this.logger.debug(`simulateLane: lookup of job \"${slug}\" failed on attempt ${attempt}: ${err.message}`);\n return null;\n });\n if (data?.getJob?.id) return data.getJob;\n if (attempt < RippleMain.JOB_LOOKUP_ATTEMPTS) {\n await new Promise((resolve) => setTimeout(resolve, RippleMain.JOB_LOOKUP_DELAY_MS * 2 ** (attempt - 1)));\n }\n }\n this.logger.debug(`simulateLane: job \"${slug}\" was not persisted after ${RippleMain.JOB_LOOKUP_ATTEMPTS} lookups`);\n return null;\n }\n\n /**\n * whether the current lane was exported at least once. undefined when not on a lane / no workspace.\n */\n isCurrentLaneExported(): boolean | undefined {\n if (!this.workspace || !this.getCurrentLaneId()) return undefined;\n return this.workspace.consumer.bitMap.isLaneExported;\n }\n\n /**\n * detect the current lane from the workspace.\n * returns the laneId in \"scope/lane-name\" format, or undefined if not on a lane.\n */\n getCurrentLaneId(): string | undefined {\n if (!this.workspace) return undefined;\n const laneId = this.workspace.getCurrentLaneId();\n if (!laneId || laneId.isDefault()) return undefined;\n return laneId.toString();\n }\n\n /**\n * read the last-export.json written by ExportMain after a successful export.\n * used to auto-resolve the ripple job when the user is on main (no current lane).\n */\n async getLastExport(): Promise<LastExportData | null> {\n if (!this.workspace) return null;\n return readLastExport(this.workspace.scope.path);\n }\n\n /**\n * the central-hub returns url slugs in `metadata.jobs`, not the GraphQL job ids accepted by getJob(jobId).\n * the schema also supports getJob(slug: ID!), which we use here to fetch the job directly from a slug.\n */\n async getJobBySlug(slug: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB_BY_SLUG, { slug });\n return data?.getJob ?? null;\n }\n\n /**\n * find the latest job for a given laneId, optionally filtered by status phase.\n */\n async findLatestJobForLane(laneId: string, phase?: string): Promise<RippleJob | null> {\n const filters: { lanes: string[]; status?: string } = { lanes: [laneId] };\n if (phase) {\n filters.status = phase;\n }\n const jobs = await this.listJobs({ filters, limit: 1 });\n return jobs[0] ?? null;\n }\n\n /**\n * detect the workspace owner from the workspace defaultScope.\n */\n getDefaultOwner(): string | undefined {\n const defaultScope = this.workspace?.defaultScope;\n if (!defaultScope?.includes('.')) return undefined;\n return defaultScope.split('.')[0];\n }\n\n getJobUrl(job: RippleJob): string {\n // the bit.cloud UI resolves the /ripple-ci/job/<id-or-slug> segment by slug;\n // job.id (a uuid) returns \"No CI job found\", so prefer slug when present.\n const segment = job.slug || job.id;\n if (job.laneId) {\n // laneId format: \"scope/lane-name\", e.g. \"att-bit.duc/my-lane\"\n const [scope, ...laneParts] = job.laneId.split('/');\n const laneName = laneParts.join('/');\n if (scope && laneName) {\n return `https://${getCloudDomain()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${segment}`;\n }\n }\n return `https://${getCloudDomain()}/ripple-ci/job/${segment}`;\n }\n\n static async provider([cli, cloud, loggerAspect, workspace]: [CLIMain, CloudMain, LoggerMain, Workspace]) {\n const logger = loggerAspect.createLogger(RippleAspect.id);\n const ripple = new RippleMain(cloud, logger, workspace);\n\n const rippleCmd = new RippleCmd();\n rippleCmd.commands = [\n new RippleListCmd(ripple),\n new RippleLogCmd(ripple),\n new RippleErrorsCmd(ripple),\n new RippleRetryCmd(ripple),\n new RippleStopCmd(ripple),\n new RippleSimulateCmd(ripple),\n ];\n cli.register(rippleCmd);\n\n return ripple;\n }\n}\n\nRippleAspect.addRuntime(RippleMain);\n"],"mappings":"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,UAAU,aAuBI;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAAAhB,eAAA,CAtCUgB,UAAU,qBAwCY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAAAhB,eAAA,CAvDUgB,UAAU,iCAyDwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAAAhB,eAAA,CAtEUgB,UAAU,eAwEM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAAAhB,eAAA,CAlFUgB,UAAU,cAoFK;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAAAhB,eAAA,CA9FUgB,UAAU,mBAgGU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAED;AACF;AACA;AACA;AAHEhB,eAAA,CA7GWgB,UAAU,6BAiHoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AAED;AAAAhB,eAAA,CA9HWgB,UAAU,yBA+HgB,CAAC;AAAAhB,eAAA,CA/H3BgB,UAAU,yBAgIgB,GAAG;AAqW1CgK,sBAAY,CAACkB,UAAU,CAAClL,UAAU,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};