@teambit/schema 1.0.1080 → 1.0.1081

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.
@@ -1 +1 @@
1
- {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_semanticsEntities","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","SchemaDiffCommand","constructor","schema","component","logger","report","args","pattern","baseVersion","compareVersion","diff","componentId","computeDiff","formatDiffResult","json","toAgentJson","host","getHost","ids","idsByPattern","Error","baseId","changeVersion","compareId","baseComponent","compareComponent","getMany","toString","debug","baseSchema","compareSchema","Promise","all","getSchema","assessor","getImpactAssessor","computeAPIDiff","toStringWithoutVersion","serializeChange","change","status","impact","exportName","schemaType","baseSignature","compareSignature","changes","details","map","d","changeKind","description","context","from","undefined","to","hasChanges","summary","added","removed","modified","breaking","nonBreaking","patch","publicAPI","publicChanges","internal","internalChanges","chalk","green","lines","bold","cyan","impactBadge","parts","red","yellow","impactParts","dim","join","formatSection","title","underline","sortChanges","formatChange","order","REMOVED","MODIFIED","ADDED","impactOrder","BREAKING","NON_BREAKING","PATCH","sort","a","b","statusDiff","indent","impactTag","kind","APIDiffStatus","truncateSig","strikethrough","detail","detailImpact","impactDot","desc","enhanceDescription","IMPACT_STYLES","badge","tag","dot","enhancer","DESCRIPTION_ENHANCERS","find","match","enhance","sig","maxLen","oneLine","replace","slice","exports","bgRed","white","bgGreen","bgBlue","ck","includes"],"sources":["schema-diff.cmd.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Command, CommandOptions, CLIArgs } from '@teambit/cli';\nimport type { ComponentMain } from '@teambit/component';\nimport type { Logger } from '@teambit/logger';\nimport { computeAPIDiff, APIDiffStatus } from '@teambit/semantics.entities.semantic-schema-diff';\nimport type { APIDiffResult, APIDiffChange, ImpactLevel } from '@teambit/semantics.entities.semantic-schema-diff';\nimport type { SchemaMain } from './schema.main.runtime';\n\nexport class SchemaDiffCommand implements Command {\n name = 'diff <component> <base-version> <compare-version>';\n description = 'show API changes between two versions of a component';\n extendedDescription = `compares the public API schema between two versions of a component.\nshows added, removed, and modified exports with semantic impact analysis.\n\nexamples:\n bit schema diff my-component 0.0.1 0.0.2`;\n group = 'info-analysis';\n options = [['j', 'json', 'return the API diff in json format']] as CommandOptions;\n\n constructor(\n private schema: SchemaMain,\n private component: ComponentMain,\n private logger: Logger\n ) {}\n\n async report(args: CLIArgs): Promise<string> {\n const [pattern, baseVersion, compareVersion] = args as string[];\n const { diff, componentId } = await this.computeDiff(pattern, baseVersion, compareVersion);\n return this.formatDiffResult(diff, `${componentId} (${baseVersion} → ${compareVersion})`);\n }\n\n async json(args: CLIArgs): Promise<Record<string, any>> {\n const [pattern, baseVersion, compareVersion] = args as string[];\n const { diff, componentId } = await this.computeDiff(pattern, baseVersion, compareVersion);\n return this.toAgentJson(diff, componentId, baseVersion, compareVersion);\n }\n\n private async computeDiff(\n pattern: string,\n baseVersion: string,\n compareVersion: string\n ): Promise<{ diff: APIDiffResult; componentId: string }> {\n const host = this.component.getHost();\n const ids = await host.idsByPattern(pattern, true);\n\n if (ids.length === 0) {\n throw new Error(`no components found matching \"${pattern}\"`);\n }\n if (ids.length > 1) {\n throw new Error(`pattern \"${pattern}\" matches ${ids.length} components. please specify a single component.`);\n }\n\n const componentId = ids[0];\n const baseId = componentId.changeVersion(baseVersion);\n const compareId = componentId.changeVersion(compareVersion);\n\n const [baseComponent, compareComponent] = await host.getMany([baseId, compareId]);\n\n if (!baseComponent) throw new Error(`could not load ${baseId.toString()}`);\n if (!compareComponent) throw new Error(`could not load ${compareId.toString()}`);\n\n this.logger.debug(`computing API diff: ${baseId.toString()} -> ${compareId.toString()}`);\n\n const [baseSchema, compareSchema] = await Promise.all([\n this.schema.getSchema(baseComponent),\n this.schema.getSchema(compareComponent),\n ]);\n\n const assessor = this.schema.getImpactAssessor();\n const diff = computeAPIDiff(baseSchema, compareSchema, assessor);\n return { diff, componentId: componentId.toStringWithoutVersion() };\n }\n\n private toAgentJson(\n diff: APIDiffResult,\n componentId: string,\n baseVersion: string,\n compareVersion: string\n ): Record<string, any> {\n const serializeChange = (change: APIDiffChange) => ({\n status: change.status,\n impact: change.impact,\n exportName: change.exportName,\n schemaType: change.schemaType,\n ...(change.baseSignature ? { baseSignature: change.baseSignature } : {}),\n ...(change.compareSignature ? { compareSignature: change.compareSignature } : {}),\n ...(change.changes && change.changes.length > 0\n ? {\n details: change.changes.map((d) => ({\n changeKind: d.changeKind,\n description: d.description,\n impact: d.impact,\n context: d.context,\n ...(d.from !== undefined ? { from: d.from } : {}),\n ...(d.to !== undefined ? { to: d.to } : {}),\n })),\n }\n : {}),\n });\n\n return {\n componentId,\n baseVersion,\n compareVersion,\n hasChanges: diff.hasChanges,\n impact: diff.impact,\n summary: {\n added: diff.added,\n removed: diff.removed,\n modified: diff.modified,\n breaking: diff.breaking,\n nonBreaking: diff.nonBreaking,\n patch: diff.patch,\n },\n publicAPI: diff.publicChanges.map(serializeChange),\n internal: diff.internalChanges.map(serializeChange),\n };\n }\n\n private formatDiffResult(diff: APIDiffResult, pattern: string): string {\n if (!diff.hasChanges) {\n return chalk.green(`\\n No API changes detected for ${pattern}\\n`);\n }\n\n const lines: string[] = [''];\n\n lines.push(` ${chalk.bold('API Diff')} for ${chalk.cyan(pattern)} ${this.impactBadge(diff.impact)}`);\n lines.push('');\n\n const parts: string[] = [];\n if (diff.added > 0) parts.push(chalk.green(`${diff.added} added`));\n if (diff.removed > 0) parts.push(chalk.red(`${diff.removed} removed`));\n if (diff.modified > 0) parts.push(chalk.yellow(`${diff.modified} modified`));\n const impactParts: string[] = [];\n if (diff.breaking > 0) impactParts.push(chalk.red.bold(`${diff.breaking} breaking`));\n if (diff.nonBreaking > 0) impactParts.push(chalk.green(`${diff.nonBreaking} non-breaking`));\n if (diff.patch > 0) impactParts.push(chalk.dim(`${diff.patch} patch`));\n lines.push(` ${parts.join(chalk.dim(' · '))} ${chalk.dim('|')} ${impactParts.join(chalk.dim(' · '))}`);\n lines.push('');\n\n this.formatSection(lines, 'Public API', diff.publicChanges);\n this.formatSection(lines, 'Internal (non-exported)', diff.internalChanges);\n\n return lines.join('\\n');\n }\n\n private formatSection(lines: string[], title: string, changes: APIDiffChange[]): void {\n if (changes.length === 0) return;\n lines.push(` ${chalk.bold.underline(title)}`);\n lines.push('');\n for (const change of this.sortChanges(changes)) {\n lines.push(...this.formatChange(change));\n }\n }\n\n private sortChanges(changes: APIDiffChange[]): APIDiffChange[] {\n const order = { REMOVED: 0, MODIFIED: 1, ADDED: 2 };\n const impactOrder = { BREAKING: 0, NON_BREAKING: 1, PATCH: 2 };\n return [...changes].sort((a, b) => {\n const statusDiff = (order[a.status] ?? 3) - (order[b.status] ?? 3);\n if (statusDiff !== 0) return statusDiff;\n return (impactOrder[a.impact] ?? 3) - (impactOrder[b.impact] ?? 3);\n });\n }\n\n private formatChange(change: APIDiffChange): string[] {\n const lines: string[] = [];\n const indent = ' ';\n const impact = this.impactTag(change.impact);\n const kind = chalk.dim(`(${change.schemaType})`);\n\n switch (change.status) {\n case APIDiffStatus.ADDED:\n lines.push(` ${chalk.green.bold('+')} ${chalk.green(change.exportName)} ${kind} ${impact}`);\n if (change.compareSignature) {\n lines.push(`${indent}${chalk.dim(this.truncateSig(change.compareSignature))}`);\n }\n break;\n\n case APIDiffStatus.REMOVED:\n lines.push(` ${chalk.red.bold('−')} ${chalk.red(change.exportName)} ${kind} ${impact}`);\n if (change.baseSignature) {\n lines.push(`${indent}${chalk.dim.strikethrough(this.truncateSig(change.baseSignature))}`);\n }\n break;\n\n case APIDiffStatus.MODIFIED:\n lines.push(` ${chalk.yellow.bold('~')} ${chalk.yellow(change.exportName)} ${kind} ${impact}`);\n if (change.changes && change.changes.length > 0) {\n for (const detail of change.changes) {\n const detailImpact = this.impactDot(detail.impact);\n const desc = this.enhanceDescription(detail.description, detail.impact, detail.changeKind);\n lines.push(`${indent}${detailImpact} ${desc}`);\n if (detail.from != null && detail.to != null) {\n lines.push(`${indent} ${chalk.red(`- ${detail.from}`)}`);\n lines.push(`${indent} ${chalk.green(`+ ${detail.to}`)}`);\n }\n }\n }\n break;\n }\n\n lines.push('');\n return lines;\n }\n\n private static IMPACT_STYLES = {\n BREAKING: { badge: chalk.bgRed.white.bold(' BREAKING '), tag: chalk.red('breaking'), dot: chalk.red('●') },\n NON_BREAKING: {\n badge: chalk.bgGreen.white.bold(' NON-BREAKING '),\n tag: chalk.green('non-breaking'),\n dot: chalk.green('●'),\n },\n PATCH: { badge: chalk.bgBlue.white(' PATCH '), tag: chalk.dim('patch'), dot: chalk.dim('●') },\n };\n\n private impactBadge(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].badge;\n }\n private impactTag(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].tag;\n }\n private impactDot(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].dot;\n }\n\n private static DESCRIPTION_ENHANCERS: Array<{\n match: (changeKind: string, impact: ImpactLevel) => boolean;\n enhance: (desc: string) => string;\n }> = [\n {\n match: (ck, i) => ck === 'return-type-changed' && i === 'NON_BREAKING',\n enhance: (d) => d.replace('return type changed:', 'return type widened:'),\n },\n {\n match: (ck, i) => ck === 'return-type-changed' && i === 'BREAKING',\n enhance: (d) => d.replace('return type changed:', 'return type narrowed:'),\n },\n {\n match: (ck, i) =>\n (ck === 'destructured-property-default-removed' || ck === 'parameter-default-removed') && i === 'BREAKING',\n enhance: (d) => (d.includes('breaking') ? d : `${d} — callers relying on the default will break`),\n },\n ];\n\n private enhanceDescription(description: string, impact: ImpactLevel, changeKind: string): string {\n const enhancer = SchemaDiffCommand.DESCRIPTION_ENHANCERS.find((e) => e.match(changeKind, impact));\n return enhancer ? enhancer.enhance(description) : description;\n }\n\n private truncateSig(sig: string, maxLen = 120): string {\n const oneLine = sig.replace(/\\n/g, ' ').replace(/\\s+/g, ' ');\n if (oneLine.length <= maxLen) return oneLine;\n return `${oneLine.slice(0, maxLen - 3)}...`;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_cli","_semanticsEntities","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","SchemaDiffCommand","constructor","schema","component","logger","report","args","pattern","baseVersion","compareVersion","diff","componentId","computeDiff","formatDiffResult","json","toAgentJson","host","getHost","ids","idsByPattern","Error","baseId","changeVersion","compareId","baseComponent","compareComponent","getMany","toString","debug","computeAPIDiff","toStringWithoutVersion","serializeChange","change","status","impact","exportName","schemaType","baseSignature","compareSignature","changes","details","map","d","changeKind","description","context","from","undefined","to","base","compare","hasChanges","internalImpact","summary","added","removed","modified","breaking","nonBreaking","patch","publicAPI","publicChanges","internal","internalChanges","formatUnavailable","lines","formatWarningSummary","available","REASON_TEXT","reason","join","chalk","green","bold","cyan","impactBadge","parts","red","yellow","impactParts","dim","formatSection","title","badge","formatTitle","sortChanges","formatChange","order","REMOVED","MODIFIED","ADDED","impactOrder","BREAKING","NON_BREAKING","PATCH","sort","a","b","statusDiff","indent","impactTag","kind","APIDiffStatus","truncateSig","strikethrough","detail","detailImpact","impactDot","desc","enhanceDescription","IMPACT_STYLES","tag","dot","enhancer","DESCRIPTION_ENHANCERS","find","match","enhance","sig","maxLen","oneLine","replace","slice","exports","NOT_BUILT","NO_EXTRACTOR","DISABLED","FAILED","bgRed","white","bgGreen","bgBlue","ck","includes"],"sources":["schema-diff.cmd.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Command, CommandOptions, CLIArgs } from '@teambit/cli';\nimport { formatWarningSummary, formatTitle } from '@teambit/cli';\nimport type { ComponentMain } from '@teambit/component';\nimport type { Logger } from '@teambit/logger';\nimport { APIDiffStatus } from '@teambit/semantics.entities.semantic-schema-diff';\nimport type {\n APIDiffResult,\n APIDiffChange,\n ImpactLevel,\n SchemaUnavailableReason,\n} from '@teambit/semantics.entities.semantic-schema-diff';\nimport type { SchemaMain } from './schema.main.runtime';\n\nexport class SchemaDiffCommand implements Command {\n name = 'diff <component> <base-version> <compare-version>';\n description = 'show API changes between two versions of a component';\n extendedDescription = `compares the public API schema between two versions of a component.\nshows added, removed, and modified exports with semantic impact analysis.\n\nexamples:\n bit schema diff my-component 0.0.1 0.0.2`;\n group = 'info-analysis';\n options = [['j', 'json', 'return the API diff in json format']] as CommandOptions;\n\n constructor(\n private schema: SchemaMain,\n private component: ComponentMain,\n private logger: Logger\n ) {}\n\n async report(args: CLIArgs): Promise<string> {\n const [pattern, baseVersion, compareVersion] = args as string[];\n const { diff, componentId } = await this.computeDiff(pattern, baseVersion, compareVersion);\n return this.formatDiffResult(diff, `${componentId} (${baseVersion} → ${compareVersion})`);\n }\n\n async json(args: CLIArgs): Promise<Record<string, any>> {\n const [pattern, baseVersion, compareVersion] = args as string[];\n const { diff, componentId } = await this.computeDiff(pattern, baseVersion, compareVersion);\n return this.toAgentJson(diff, componentId, baseVersion, compareVersion);\n }\n\n private async computeDiff(\n pattern: string,\n baseVersion: string,\n compareVersion: string\n ): Promise<{ diff: APIDiffResult; componentId: string }> {\n const host = this.component.getHost();\n const ids = await host.idsByPattern(pattern, true);\n\n if (ids.length === 0) {\n throw new Error(`no components found matching \"${pattern}\"`);\n }\n if (ids.length > 1) {\n throw new Error(`pattern \"${pattern}\" matches ${ids.length} components. please specify a single component.`);\n }\n\n const componentId = ids[0];\n const baseId = componentId.changeVersion(baseVersion);\n const compareId = componentId.changeVersion(compareVersion);\n\n const [baseComponent, compareComponent] = await host.getMany([baseId, compareId]);\n\n if (!baseComponent) throw new Error(`could not load ${baseId.toString()}`);\n if (!compareComponent) throw new Error(`could not load ${compareId.toString()}`);\n\n this.logger.debug(`computing API diff: ${baseId.toString()} -> ${compareId.toString()}`);\n\n // availability-aware and artifact-first (see SchemaMain.computeAPIDiff): a version without a\n // schema (NOT_BUILT/NO_EXTRACTOR/DISABLED/FAILED) short-circuits with an explicit status —\n // never diffed as an empty API — and built versions read their schema artifact instead of\n // running a live extraction pass.\n const diff = await this.schema.computeAPIDiff(baseComponent, compareComponent);\n if (!diff) throw new Error(`failed computing API diff for ${componentId.toString()}`);\n return { diff, componentId: componentId.toStringWithoutVersion() };\n }\n\n private toAgentJson(\n diff: APIDiffResult,\n componentId: string,\n baseVersion: string,\n compareVersion: string\n ): Record<string, any> {\n const serializeChange = (change: APIDiffChange) => ({\n status: change.status,\n impact: change.impact,\n exportName: change.exportName,\n schemaType: change.schemaType,\n ...(change.baseSignature ? { baseSignature: change.baseSignature } : {}),\n ...(change.compareSignature ? { compareSignature: change.compareSignature } : {}),\n ...(change.changes && change.changes.length > 0\n ? {\n details: change.changes.map((d) => ({\n changeKind: d.changeKind,\n description: d.description,\n impact: d.impact,\n context: d.context,\n ...(d.from !== undefined ? { from: d.from } : {}),\n ...(d.to !== undefined ? { to: d.to } : {}),\n })),\n }\n : {}),\n });\n\n return {\n componentId,\n baseVersion,\n compareVersion,\n status: diff.status,\n base: diff.base,\n compare: diff.compare,\n hasChanges: diff.hasChanges,\n // `impact` is consumer-facing (public changes only); `internalImpact` covers non-exported changes,\n // which still count toward `summary.breaking` — surface both so an internal-only breaking change\n // isn't read as a PATCH from `impact` alone.\n impact: diff.impact,\n internalImpact: diff.internalImpact,\n summary: {\n added: diff.added,\n removed: diff.removed,\n modified: diff.modified,\n breaking: diff.breaking,\n nonBreaking: diff.nonBreaking,\n patch: diff.patch,\n },\n publicAPI: diff.publicChanges.map(serializeChange),\n internal: diff.internalChanges.map(serializeChange),\n };\n }\n\n private static REASON_TEXT: Record<SchemaUnavailableReason, string> = {\n NOT_BUILT: 'was built before API extraction — no API snapshot exists',\n NO_EXTRACTOR: \"its env doesn't provide a schema extractor\",\n DISABLED: 'has schema extraction disabled',\n FAILED: 'API data could not be loaded',\n };\n\n private formatUnavailable(diff: APIDiffResult, pattern: string): string {\n const lines = ['', ` ${formatWarningSummary(`Unable to compute API diff for \"${pattern}\"`)}`, ''];\n if (!diff.base.available) {\n lines.push(` base version ${SchemaDiffCommand.REASON_TEXT[diff.base.reason || 'FAILED']}`);\n }\n if (!diff.compare.available) {\n lines.push(` compare version ${SchemaDiffCommand.REASON_TEXT[diff.compare.reason || 'FAILED']}`);\n }\n lines.push('');\n return lines.join('\\n');\n }\n\n private formatDiffResult(diff: APIDiffResult, pattern: string): string {\n // a missing schema is not an empty API — report which side lacks data instead of\n // pretending \"no changes\" (or worse, a fabricated full-surface diff).\n if (diff.status !== 'COMPUTED') {\n return this.formatUnavailable(diff, pattern);\n }\n\n if (!diff.hasChanges) {\n return chalk.green(`\\n No API changes detected for ${pattern}\\n`);\n }\n\n const lines: string[] = [''];\n\n lines.push(` ${chalk.bold('API Diff')} for ${chalk.cyan(pattern)} ${this.impactBadge(diff.impact)}`);\n lines.push('');\n\n const parts: string[] = [];\n if (diff.added > 0) parts.push(chalk.green(`${diff.added} added`));\n if (diff.removed > 0) parts.push(chalk.red(`${diff.removed} removed`));\n if (diff.modified > 0) parts.push(chalk.yellow(`${diff.modified} modified`));\n const impactParts: string[] = [];\n if (diff.breaking > 0) impactParts.push(chalk.red.bold(`${diff.breaking} breaking`));\n if (diff.nonBreaking > 0) impactParts.push(chalk.green(`${diff.nonBreaking} non-breaking`));\n if (diff.patch > 0) impactParts.push(chalk.dim(`${diff.patch} patch`));\n lines.push(` ${parts.join(chalk.dim(' · '))} ${chalk.dim('|')} ${impactParts.join(chalk.dim(' · '))}`);\n lines.push('');\n\n // the header badge above is the consumer-facing (public) impact. internal changes carry their own\n // impact — show it on the internal section so an internal-only breaking change is visible and not\n // masked by a PATCH header.\n this.formatSection(lines, 'Public API', diff.publicChanges);\n this.formatSection(lines, 'Internal (non-exported)', diff.internalChanges, diff.internalImpact);\n\n return lines.join('\\n');\n }\n\n private formatSection(lines: string[], title: string, changes: APIDiffChange[], impact?: ImpactLevel): void {\n if (changes.length === 0) return;\n const badge = impact ? ` ${this.impactBadge(impact)}` : '';\n lines.push(` ${formatTitle(title)}${badge}`);\n lines.push('');\n for (const change of this.sortChanges(changes)) {\n lines.push(...this.formatChange(change));\n }\n }\n\n private sortChanges(changes: APIDiffChange[]): APIDiffChange[] {\n const order = { REMOVED: 0, MODIFIED: 1, ADDED: 2 };\n const impactOrder = { BREAKING: 0, NON_BREAKING: 1, PATCH: 2 };\n return [...changes].sort((a, b) => {\n const statusDiff = (order[a.status] ?? 3) - (order[b.status] ?? 3);\n if (statusDiff !== 0) return statusDiff;\n return (impactOrder[a.impact] ?? 3) - (impactOrder[b.impact] ?? 3);\n });\n }\n\n private formatChange(change: APIDiffChange): string[] {\n const lines: string[] = [];\n const indent = ' ';\n const impact = this.impactTag(change.impact);\n const kind = chalk.dim(`(${change.schemaType})`);\n\n switch (change.status) {\n case APIDiffStatus.ADDED:\n lines.push(` ${chalk.green.bold('+')} ${chalk.green(change.exportName)} ${kind} ${impact}`);\n if (change.compareSignature) {\n lines.push(`${indent}${chalk.dim(this.truncateSig(change.compareSignature))}`);\n }\n break;\n\n case APIDiffStatus.REMOVED:\n lines.push(` ${chalk.red.bold('−')} ${chalk.red(change.exportName)} ${kind} ${impact}`);\n if (change.baseSignature) {\n lines.push(`${indent}${chalk.dim.strikethrough(this.truncateSig(change.baseSignature))}`);\n }\n break;\n\n case APIDiffStatus.MODIFIED:\n lines.push(` ${chalk.yellow.bold('~')} ${chalk.yellow(change.exportName)} ${kind} ${impact}`);\n if (change.changes && change.changes.length > 0) {\n for (const detail of change.changes) {\n const detailImpact = this.impactDot(detail.impact);\n const desc = this.enhanceDescription(detail.description, detail.impact, detail.changeKind);\n lines.push(`${indent}${detailImpact} ${desc}`);\n if (detail.from != null && detail.to != null) {\n lines.push(`${indent} ${chalk.red(`- ${detail.from}`)}`);\n lines.push(`${indent} ${chalk.green(`+ ${detail.to}`)}`);\n }\n }\n }\n break;\n }\n\n lines.push('');\n return lines;\n }\n\n private static IMPACT_STYLES = {\n BREAKING: { badge: chalk.bgRed.white.bold(' BREAKING '), tag: chalk.red('breaking'), dot: chalk.red('●') },\n NON_BREAKING: {\n badge: chalk.bgGreen.white.bold(' NON-BREAKING '),\n tag: chalk.green('non-breaking'),\n dot: chalk.green('●'),\n },\n PATCH: { badge: chalk.bgBlue.white(' PATCH '), tag: chalk.dim('patch'), dot: chalk.dim('●') },\n };\n\n private impactBadge(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].badge;\n }\n private impactTag(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].tag;\n }\n private impactDot(impact: ImpactLevel): string {\n return SchemaDiffCommand.IMPACT_STYLES[impact].dot;\n }\n\n private static DESCRIPTION_ENHANCERS: Array<{\n match: (changeKind: string, impact: ImpactLevel) => boolean;\n enhance: (desc: string) => string;\n }> = [\n {\n match: (ck, i) => ck === 'return-type-changed' && i === 'NON_BREAKING',\n enhance: (d) => d.replace('return type changed:', 'return type widened:'),\n },\n {\n match: (ck, i) => ck === 'return-type-changed' && i === 'BREAKING',\n enhance: (d) => d.replace('return type changed:', 'return type narrowed:'),\n },\n {\n match: (ck, i) =>\n (ck === 'destructured-property-default-removed' || ck === 'parameter-default-removed') && i === 'BREAKING',\n enhance: (d) => (d.includes('breaking') ? d : `${d} — callers relying on the default will break`),\n },\n ];\n\n private enhanceDescription(description: string, impact: ImpactLevel, changeKind: string): string {\n const enhancer = SchemaDiffCommand.DESCRIPTION_ENHANCERS.find((e) => e.match(changeKind, impact));\n return enhancer ? enhancer.enhance(description) : description;\n }\n\n private truncateSig(sig: string, maxLen = 120): string {\n const oneLine = sig.replace(/\\n/g, ' ').replace(/\\s+/g, ' ');\n if (oneLine.length <= maxLen) return oneLine;\n return `${oneLine.slice(0, maxLen - 3)}...`;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -41,6 +41,7 @@ function schemaSchema(schema) {
41
41
  impact: String!
42
42
  from: String
43
43
  to: String
44
+ signature: String
44
45
  }
45
46
 
46
47
  type APIDiffChange {
@@ -57,12 +58,22 @@ function schemaSchema(schema) {
57
58
  changes: [APIDiffDetail!]
58
59
  }
59
60
 
61
+ type SchemaSideAvailability {
62
+ available: Boolean!
63
+ reason: String
64
+ }
65
+
60
66
  type APIDiffResult {
67
+ status: String!
68
+ base: SchemaSideAvailability!
69
+ compare: SchemaSideAvailability!
61
70
  hasChanges: Boolean!
62
71
  impact: String!
72
+ internalImpact: String!
63
73
  publicChanges: [APIDiffChange!]!
64
74
  internalChanges: [APIDiffChange!]!
65
75
  changes: [APIDiffChange!]!
76
+ unresolvedExports: [String!]!
66
77
  added: Int!
67
78
  removed: Int!
68
79
  modified: Int!
@@ -1 +1 @@
1
- {"version":3,"names":["_graphqlTypeJson","data","require","_graphqlTag","_semanticsEntities","ownKeys","e","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","schemaSchema","schema","typeDefs","gql","resolvers","JSONObject","GraphQLJSONObject","ComponentHost","getSchema","host","id","skipInternals","componentId","resolveComponentId","component","get","empty","APISchema","toObject","api","undefined","filterUnimplementedAndAddDefaults","apiDiff","baseId","compareId","baseCompId","compareCompId","Promise","all","baseComp","compareComp","computeAPIDiff","apiObject","filteredExports","module","exports","exp","exportNode","__schema","UnImplementedSchema","name","filteredInternals","internals","map","internalObject","filteredInternalExports","filteredInternalNodes","filteredTaggedExports","taggedModuleExports","defaultTaggedExports","exportedModule"],"sources":["schema.graphql.ts"],"sourcesContent":["import type { ComponentFactory } from '@teambit/component';\nimport { GraphQLJSONObject } from 'graphql-type-json';\nimport { gql } from 'graphql-tag';\nimport { APISchema, UnImplementedSchema } from '@teambit/semantics.entities.semantic-schema';\nimport type { Schema } from '@teambit/graphql';\nimport type { SchemaMain } from './schema.main.runtime';\n\nexport function schemaSchema(schema: SchemaMain): Schema {\n return {\n typeDefs: gql`\n scalar JSONObject\n\n type APIDiffDetail {\n changeKind: String!\n description: String!\n impact: String!\n from: String\n to: String\n }\n\n type APIDiffChange {\n status: String!\n visibility: String!\n exportName: String!\n schemaType: String!\n schemaTypeRaw: String!\n impact: String!\n baseSignature: String\n compareSignature: String\n baseNode: JSONObject\n compareNode: JSONObject\n changes: [APIDiffDetail!]\n }\n\n type APIDiffResult {\n hasChanges: Boolean!\n impact: String!\n publicChanges: [APIDiffChange!]!\n internalChanges: [APIDiffChange!]!\n changes: [APIDiffChange!]!\n added: Int!\n removed: Int!\n modified: Int!\n breaking: Int!\n nonBreaking: Int!\n patch: Int!\n }\n\n extend type ComponentHost {\n getSchema(id: String!, skipInternals: Boolean): JSONObject\n apiDiff(baseId: String!, compareId: String!): APIDiffResult\n }\n `,\n resolvers: {\n JSONObject: GraphQLJSONObject,\n ComponentHost: {\n getSchema: async (host: ComponentFactory, { id, skipInternals }: { id: string; skipInternals?: boolean }) => {\n const componentId = await host.resolveComponentId(id);\n const component = await host.get(componentId);\n const empty = APISchema.empty(componentId).toObject();\n\n if (!component) return empty;\n const api = await schema.getSchema(component, undefined, undefined, undefined, undefined, skipInternals);\n if (!api) return empty;\n\n return filterUnimplementedAndAddDefaults(api);\n },\n apiDiff: async (host: ComponentFactory, { baseId, compareId }: { baseId: string; compareId: string }) => {\n const [baseCompId, compareCompId] = await Promise.all([\n host.resolveComponentId(baseId),\n host.resolveComponentId(compareId),\n ]);\n const [baseComp, compareComp] = await Promise.all([host.get(baseCompId), host.get(compareCompId)]);\n if (!baseComp || !compareComp) return null;\n return schema.computeAPIDiff(baseComp, compareComp);\n },\n },\n },\n };\n}\n\nfunction filterUnimplementedAndAddDefaults(api: APISchema) {\n const apiObject = api.toObject();\n\n const filteredExports = apiObject.module.exports.filter((exp) => {\n if (exp.exportNode) {\n return exp.exportNode.__schema !== UnImplementedSchema.name;\n }\n return (exp as Record<string, any>).__schema !== UnImplementedSchema.name;\n });\n\n const filteredInternals = apiObject.internals.map((internalObject) => {\n const filteredInternalExports = internalObject.exports.filter((exp) => {\n if (exp.exportNode) {\n return exp.exportNode.__schema !== UnImplementedSchema.name;\n }\n return (exp as Record<string, any>).__schema !== UnImplementedSchema.name;\n });\n const filteredInternalNodes = internalObject.internals.filter((exp) => exp.__schema !== UnImplementedSchema.name);\n return {\n ...internalObject,\n exports: filteredInternalExports,\n internals: filteredInternalNodes,\n };\n });\n\n const filteredTaggedExports = apiObject.taggedModuleExports.filter(\n (exp) => exp.__schema !== UnImplementedSchema.name\n );\n\n const defaultTaggedExports = filteredExports\n .filter((exportedModule) => {\n if (exportedModule.exportNode) {\n return exportedModule.exportNode.__schema === 'ReactSchema';\n }\n return (exportedModule as Record<string, any>).__schema === 'ReactSchema';\n })\n .map((exportedModule) => {\n if (exportedModule.exportNode) {\n return exportedModule.exportNode;\n }\n return exportedModule;\n });\n\n return {\n ...apiObject,\n internals: filteredInternals,\n taggedModuleExports: filteredTaggedExports.length > 0 ? filteredTaggedExports : defaultTaggedExports,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_graphqlTypeJson","data","require","_graphqlTag","_semanticsEntities","ownKeys","e","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","schemaSchema","schema","typeDefs","gql","resolvers","JSONObject","GraphQLJSONObject","ComponentHost","getSchema","host","id","skipInternals","componentId","resolveComponentId","component","get","empty","APISchema","toObject","api","undefined","filterUnimplementedAndAddDefaults","apiDiff","baseId","compareId","baseCompId","compareCompId","Promise","all","baseComp","compareComp","computeAPIDiff","apiObject","filteredExports","module","exports","exp","exportNode","__schema","UnImplementedSchema","name","filteredInternals","internals","map","internalObject","filteredInternalExports","filteredInternalNodes","filteredTaggedExports","taggedModuleExports","defaultTaggedExports","exportedModule"],"sources":["schema.graphql.ts"],"sourcesContent":["import type { ComponentFactory } from '@teambit/component';\nimport { GraphQLJSONObject } from 'graphql-type-json';\nimport { gql } from 'graphql-tag';\nimport { APISchema, UnImplementedSchema } from '@teambit/semantics.entities.semantic-schema';\nimport type { Schema } from '@teambit/graphql';\nimport type { SchemaMain } from './schema.main.runtime';\n\nexport function schemaSchema(schema: SchemaMain): Schema {\n return {\n typeDefs: gql`\n scalar JSONObject\n\n type APIDiffDetail {\n changeKind: String!\n description: String!\n impact: String!\n from: String\n to: String\n signature: String\n }\n\n type APIDiffChange {\n status: String!\n visibility: String!\n exportName: String!\n schemaType: String!\n schemaTypeRaw: String!\n impact: String!\n baseSignature: String\n compareSignature: String\n baseNode: JSONObject\n compareNode: JSONObject\n changes: [APIDiffDetail!]\n }\n\n type SchemaSideAvailability {\n available: Boolean!\n reason: String\n }\n\n type APIDiffResult {\n status: String!\n base: SchemaSideAvailability!\n compare: SchemaSideAvailability!\n hasChanges: Boolean!\n impact: String!\n internalImpact: String!\n publicChanges: [APIDiffChange!]!\n internalChanges: [APIDiffChange!]!\n changes: [APIDiffChange!]!\n unresolvedExports: [String!]!\n added: Int!\n removed: Int!\n modified: Int!\n breaking: Int!\n nonBreaking: Int!\n patch: Int!\n }\n\n extend type ComponentHost {\n getSchema(id: String!, skipInternals: Boolean): JSONObject\n apiDiff(baseId: String!, compareId: String!): APIDiffResult\n }\n `,\n resolvers: {\n JSONObject: GraphQLJSONObject,\n ComponentHost: {\n getSchema: async (host: ComponentFactory, { id, skipInternals }: { id: string; skipInternals?: boolean }) => {\n const componentId = await host.resolveComponentId(id);\n const component = await host.get(componentId);\n const empty = APISchema.empty(componentId).toObject();\n\n if (!component) return empty;\n const api = await schema.getSchema(component, undefined, undefined, undefined, undefined, skipInternals);\n if (!api) return empty;\n\n return filterUnimplementedAndAddDefaults(api);\n },\n apiDiff: async (host: ComponentFactory, { baseId, compareId }: { baseId: string; compareId: string }) => {\n const [baseCompId, compareCompId] = await Promise.all([\n host.resolveComponentId(baseId),\n host.resolveComponentId(compareId),\n ]);\n const [baseComp, compareComp] = await Promise.all([host.get(baseCompId), host.get(compareCompId)]);\n if (!baseComp || !compareComp) return null;\n return schema.computeAPIDiff(baseComp, compareComp);\n },\n },\n },\n };\n}\n\nfunction filterUnimplementedAndAddDefaults(api: APISchema) {\n const apiObject = api.toObject();\n\n const filteredExports = apiObject.module.exports.filter((exp) => {\n if (exp.exportNode) {\n return exp.exportNode.__schema !== UnImplementedSchema.name;\n }\n return (exp as Record<string, any>).__schema !== UnImplementedSchema.name;\n });\n\n const filteredInternals = apiObject.internals.map((internalObject) => {\n const filteredInternalExports = internalObject.exports.filter((exp) => {\n if (exp.exportNode) {\n return exp.exportNode.__schema !== UnImplementedSchema.name;\n }\n return (exp as Record<string, any>).__schema !== UnImplementedSchema.name;\n });\n const filteredInternalNodes = internalObject.internals.filter((exp) => exp.__schema !== UnImplementedSchema.name);\n return {\n ...internalObject,\n exports: filteredInternalExports,\n internals: filteredInternalNodes,\n };\n });\n\n const filteredTaggedExports = apiObject.taggedModuleExports.filter(\n (exp) => exp.__schema !== UnImplementedSchema.name\n );\n\n const defaultTaggedExports = filteredExports\n .filter((exportedModule) => {\n if (exportedModule.exportNode) {\n return exportedModule.exportNode.__schema === 'ReactSchema';\n }\n return (exportedModule as Record<string, any>).__schema === 'ReactSchema';\n })\n .map((exportedModule) => {\n if (exportedModule.exportNode) {\n return exportedModule.exportNode;\n }\n return exportedModule;\n });\n\n return {\n ...apiObject,\n internals: filteredInternals,\n taggedModuleExports: filteredTaggedExports.length > 0 ? filteredTaggedExports : defaultTaggedExports,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -10,7 +10,7 @@ import type { BuilderMain } from '@teambit/builder';
10
10
  import type { Workspace } from '@teambit/workspace';
11
11
  import type { ScopeMain } from '@teambit/scope';
12
12
  import type { SchemaNodeTransformer, SchemaTransformer } from '@teambit/typescript';
13
- import type { ImpactRule, APIDiffResult } from '@teambit/semantics.entities.semantic-schema-diff';
13
+ import type { ImpactRule, APIDiffResult, SchemaAvailability } from '@teambit/semantics.entities.semantic-schema-diff';
14
14
  import { ImpactAssessor } from '@teambit/semantics.entities.semantic-schema-diff';
15
15
  import type { Parser } from './parser';
16
16
  import type { SchemaExtractor } from './schema-extractor';
@@ -77,6 +77,21 @@ export declare class SchemaMain {
77
77
  *
78
78
  */
79
79
  getSchema(component: Component, shouldDisposeResourcesOnceDone?: boolean, alwaysRunExtractor?: boolean, tsserverPath?: string, contextPath?: string, skipInternals?: boolean, schemaTransformers?: SchemaTransformer[], apiTransformers?: SchemaNodeTransformer[], includeFiles?: string[]): Promise<APISchema>;
80
+ /**
81
+ * like getSchema, but reports whether a real schema was obtained. an empty schema
82
+ * with `available: false` means "no schema data exists for this version" — callers
83
+ * (e.g. API diff) must not treat it as an empty API surface.
84
+ */
85
+ getSchemaWithAvailability(component: Component, shouldDisposeResourcesOnceDone?: boolean, alwaysRunExtractor?: boolean, tsserverPath?: string, contextPath?: string, skipInternals?: boolean, schemaTransformers?: SchemaTransformer[], apiTransformers?: SchemaNodeTransformer[], includeFiles?: string[]): Promise<{
86
+ schema: APISchema;
87
+ availability: SchemaAvailability;
88
+ }>;
89
+ /**
90
+ * read the schema.json artifact the schema build task produced for this exact version.
91
+ * returns null when the version has no such artifact (never built, or built before API
92
+ * extraction existed). throws on a corrupt artifact.
93
+ */
94
+ private readSchemaFromArtifact;
80
95
  getSchemaFromObject(obj: Record<string, any>): APISchema;
81
96
  getSchemaFromRemote(id: string): Promise<APISchema>;
82
97
  /**
@@ -102,7 +117,24 @@ export declare class SchemaMain {
102
117
  /**
103
118
  * Compute the semantic API diff between two component versions.
104
119
  */
120
+ /**
121
+ * in-memory memo + single-flight for computed diffs. several consumers hit this for the
122
+ * same immutable version pair (lane-diff status via component-compare, the compare UI's
123
+ * apiDiff GraphQL field) — without this, a cold page load runs schema extraction twice
124
+ * per pair. transient failures (FAILED availability / null) are never memoized.
125
+ */
126
+ private apiDiffMemo;
127
+ private apiDiffInflight;
128
+ private static API_DIFF_MEMO_MAX;
105
129
  computeAPIDiff(baseComp: Component, compareComp: Component): Promise<APIDiffResult | null>;
130
+ /**
131
+ * is this component the version currently checked out in the workspace, with local modifications
132
+ * on top? that's the one case where the live source — not the version's built artifact — is the
133
+ * authoritative API surface for a diff side. errs toward true when modification state can't be
134
+ * determined, so local changes are never masked by a stale artifact.
135
+ */
136
+ private isModifiedCheckoutOf;
137
+ private doComputeAPIDiff;
106
138
  isSchemaTaskDisabled(component: Component): any;
107
139
  static runtime: import("@teambit/harmony").RuntimeDefinition;
108
140
  static dependencies: import("@teambit/harmony").Aspect[];
@@ -161,6 +161,17 @@ class SchemaMain {
161
161
  this.workspace = workspace;
162
162
  this.logger = logger;
163
163
  this.impactAssessor = impactAssessor;
164
+ /**
165
+ * Compute the semantic API diff between two component versions.
166
+ */
167
+ /**
168
+ * in-memory memo + single-flight for computed diffs. several consumers hit this for the
169
+ * same immutable version pair (lane-diff status via component-compare, the compare UI's
170
+ * apiDiff GraphQL field) — without this, a cold page load runs schema extraction twice
171
+ * per pair. transient failures (FAILED availability / null) are never memoized.
172
+ */
173
+ _defineProperty(this, "apiDiffMemo", new Map());
174
+ _defineProperty(this, "apiDiffInflight", new Map());
164
175
  }
165
176
 
166
177
  /**
@@ -213,9 +224,31 @@ class SchemaMain {
213
224
  *
214
225
  */
215
226
  async getSchema(component, shouldDisposeResourcesOnceDone = false, alwaysRunExtractor = false, tsserverPath, contextPath, skipInternals, schemaTransformers, apiTransformers, includeFiles) {
227
+ const {
228
+ schema
229
+ } = await this.getSchemaWithAvailability(component, shouldDisposeResourcesOnceDone, alwaysRunExtractor, tsserverPath, contextPath, skipInternals, schemaTransformers, apiTransformers, includeFiles);
230
+ return schema;
231
+ }
232
+
233
+ /**
234
+ * like getSchema, but reports whether a real schema was obtained. an empty schema
235
+ * with `available: false` means "no schema data exists for this version" — callers
236
+ * (e.g. API diff) must not treat it as an empty API surface.
237
+ */
238
+ async getSchemaWithAvailability(component, shouldDisposeResourcesOnceDone = false, alwaysRunExtractor = false, tsserverPath, contextPath, skipInternals, schemaTransformers, apiTransformers, includeFiles) {
216
239
  if (this.config.disabled) {
217
- return _semanticsEntities().APISchema.empty(component.id);
240
+ return {
241
+ schema: _semanticsEntities().APISchema.empty(component.id),
242
+ availability: {
243
+ available: false,
244
+ reason: 'DISABLED'
245
+ }
246
+ };
218
247
  }
248
+
249
+ // when extraction is attempted and fails, remember why so the artifact-fallback
250
+ // miss below reports the actual cause rather than a generic NOT_BUILT.
251
+ let extractionFailure;
219
252
  if (alwaysRunExtractor || this.workspace && component.buildStatus !== _legacy().BuildStatus.Succeed) {
220
253
  try {
221
254
  const env = this.envs.getEnv(component).env;
@@ -225,6 +258,7 @@ class SchemaMain {
225
258
  return config;
226
259
  }]);
227
260
  if (typeof env.getSchemaExtractor === 'undefined') {
261
+ extractionFailure = 'NO_EXTRACTOR';
228
262
  throw new Error(`No SchemaExtractor defined for ${env.name}`);
229
263
  }
230
264
  const schemaExtractor = env.getSchemaExtractor(undefined, tsserverPath, contextPath, schemaTransformers, apiTransformers);
@@ -236,17 +270,27 @@ class SchemaMain {
236
270
  includeFiles
237
271
  });
238
272
  if (shouldDisposeResourcesOnceDone) schemaExtractor.dispose();
239
- return result;
273
+
274
+ // `live`: extracted from source at call time, not read from the version's built artifact —
275
+ // consumers that key results by version (API diff memo/cache) must not persist it.
276
+ return {
277
+ schema: result,
278
+ availability: {
279
+ available: true,
280
+ live: true
281
+ }
282
+ };
240
283
  } catch (err) {
241
284
  if (alwaysRunExtractor) throw err;
285
+ extractionFailure = extractionFailure || 'FAILED';
242
286
  const message = err instanceof Error ? err.message : String(err);
243
287
  this.logger.warn(`failed extracting schema for ${component.id.toString()}, falling back to artifacts. extractor error: ${message}`, err);
244
288
  }
245
289
  }
246
290
 
247
291
  // on scope get schema from builder api
248
- const schemaArtifact = await this.builder.getArtifactsVinylByAspectAndTaskName(component, _schema().SchemaAspect.id, _schema4().SCHEMA_TASK_NAME);
249
- if (schemaArtifact.length === 0) {
292
+ const fromArtifact = await this.readSchemaFromArtifact(component);
293
+ if (!fromArtifact) {
250
294
  this.logger.debug(`no schema found for ${component.id.toString()}`);
251
295
 
252
296
  /**
@@ -254,8 +298,30 @@ class SchemaMain {
254
298
  * when tag/snap without build
255
299
  * or backwards compatibility
256
300
  */
257
- return _semanticsEntities().APISchema.empty(component.id);
301
+ return {
302
+ schema: _semanticsEntities().APISchema.empty(component.id),
303
+ availability: {
304
+ available: false,
305
+ reason: extractionFailure || 'NOT_BUILT'
306
+ }
307
+ };
258
308
  }
309
+ return {
310
+ schema: fromArtifact,
311
+ availability: {
312
+ available: true
313
+ }
314
+ };
315
+ }
316
+
317
+ /**
318
+ * read the schema.json artifact the schema build task produced for this exact version.
319
+ * returns null when the version has no such artifact (never built, or built before API
320
+ * extraction existed). throws on a corrupt artifact.
321
+ */
322
+ async readSchemaFromArtifact(component) {
323
+ const schemaArtifact = await this.builder.getArtifactsVinylByAspectAndTaskName(component, _schema().SchemaAspect.id, _schema4().SCHEMA_TASK_NAME);
324
+ if (schemaArtifact.length === 0) return null;
259
325
  const schemaJsonStr = schemaArtifact[0].contents.toString('utf-8');
260
326
  try {
261
327
  const schemaJson = JSON.parse(schemaJsonStr);
@@ -320,15 +386,96 @@ class SchemaMain {
320
386
  this.impactAssessor.registerRules(this.impactRuleSlot.values().flat());
321
387
  return this.impactAssessor;
322
388
  }
389
+ async computeAPIDiff(baseComp, compareComp) {
390
+ const memoKey = `${baseComp.id.toString()}|${compareComp.id.toString()}`;
391
+ const cached = this.apiDiffMemo.get(memoKey);
392
+ if (cached) return cached;
393
+ const pending = this.apiDiffInflight.get(memoKey);
394
+ if (pending) return pending;
395
+
396
+ // un-built workspace components extract their schema from live source — the same id can
397
+ // yield different schemas as the user edits, so those results must not be memoized.
398
+ const immutable = baseComp.buildStatus === _legacy().BuildStatus.Succeed && compareComp.buildStatus === _legacy().BuildStatus.Succeed;
399
+ const promise = this.doComputeAPIDiff(baseComp, compareComp).then(result => {
400
+ const transient = !result || result.status !== 'COMPUTED' && (result.base.reason === 'FAILED' || result.compare.reason === 'FAILED');
401
+ // artifact-derived sides are immutable even when the local buildStatus says otherwise (a
402
+ // checked-out component reports "pending" for a CI-built snap), so a COMPUTED result whose
403
+ // sides are not live-extracted is safe to memoize regardless of buildStatus. a live side
404
+ // reflects the working tree and must never be memoized under the version pair.
405
+ const live = Boolean(result && (result.base.live || result.compare.live));
406
+ const memoizable = !transient && !live && (immutable || result.status === 'COMPUTED');
407
+ if (memoizable) {
408
+ if (this.apiDiffMemo.size >= SchemaMain.API_DIFF_MEMO_MAX) {
409
+ const firstKey = this.apiDiffMemo.keys().next().value;
410
+ if (firstKey) this.apiDiffMemo.delete(firstKey);
411
+ }
412
+ this.apiDiffMemo.set(memoKey, result);
413
+ }
414
+ return result;
415
+ }).finally(() => {
416
+ this.apiDiffInflight.delete(memoKey);
417
+ });
418
+ this.apiDiffInflight.set(memoKey, promise);
419
+ return promise;
420
+ }
323
421
 
324
422
  /**
325
- * Compute the semantic API diff between two component versions.
423
+ * is this component the version currently checked out in the workspace, with local modifications
424
+ * on top? that's the one case where the live source — not the version's built artifact — is the
425
+ * authoritative API surface for a diff side. errs toward true when modification state can't be
426
+ * determined, so local changes are never masked by a stale artifact.
326
427
  */
327
- async computeAPIDiff(baseComp, compareComp) {
428
+ async isModifiedCheckoutOf(component) {
429
+ if (!this.workspace) return false;
430
+ const checkedOut = this.workspace.getIdIfExist(component.id);
431
+ if (!checkedOut) return false;
432
+ if (component.id.version && checkedOut.version !== component.id.version) return false;
328
433
  try {
329
- const [baseSchema, compareSchema] = await Promise.all([this.getSchema(baseComp), this.getSchema(compareComp)]);
434
+ return await this.workspace.isModified(component);
435
+ } catch {
436
+ return true;
437
+ }
438
+ }
439
+ async doComputeAPIDiff(baseComp, compareComp) {
440
+ try {
441
+ // a side whose schema retrieval throws is reported as FAILED availability rather than
442
+ // failing the whole diff — the result then carries an explicit status instead of null.
443
+ const getSide = async comp => {
444
+ try {
445
+ // both sides are pinned versions, so the snap's built schema artifact is authoritative and
446
+ // cheap to read. `getSchemaWithAvailability` instead runs the live extractor for any
447
+ // checked-out component whose local buildStatus isn't "succeed" (which a plain checkout of
448
+ // a CI-built snap reports) — a tsserver pass per component, reflecting the working tree
449
+ // rather than the snap; a degraded workspace then fabricates placeholder schemas that get
450
+ // diffed and cached under the immutable pair. the working tree is only authoritative for a
451
+ // *modified* checkout of the exact version; everything else prefers the artifact.
452
+ if (!(await this.isModifiedCheckoutOf(comp))) {
453
+ const fromArtifact = await this.readSchemaFromArtifact(comp);
454
+ if (fromArtifact) return {
455
+ schema: fromArtifact,
456
+ availability: {
457
+ available: true
458
+ }
459
+ };
460
+ }
461
+ return await this.getSchemaWithAvailability(comp);
462
+ } catch (err) {
463
+ this.logger.warn(`failed getting schema for ${comp.id.toString()}: ${err.message}`);
464
+ return {
465
+ schema: _semanticsEntities().APISchema.empty(comp.id),
466
+ availability: {
467
+ available: false,
468
+ reason: 'FAILED'
469
+ }
470
+ };
471
+ }
472
+ };
473
+ const [base, compare] = await Promise.all([getSide(baseComp), getSide(compareComp)]);
330
474
  const assessor = this.getImpactAssessor();
331
- return (0, _semanticsEntities2().computeAPIDiff)(baseSchema, compareSchema, assessor);
475
+ return (0, _semanticsEntities2().computeAPIDiff)(base.schema, compare.schema, assessor, {
476
+ base: base.availability,
477
+ compare: compare.availability
478
+ });
332
479
  } catch (err) {
333
480
  this.logger.warn(`failed computing API diff: ${err.message}`);
334
481
  return null;
@@ -361,6 +508,7 @@ class SchemaMain {
361
508
  }
362
509
  }
363
510
  exports.SchemaMain = SchemaMain;
511
+ _defineProperty(SchemaMain, "API_DIFF_MEMO_MAX", 500);
364
512
  _defineProperty(SchemaMain, "runtime", _cli().MainRuntime);
365
513
  _defineProperty(SchemaMain, "dependencies", [_envs().EnvsAspect, _cli().CLIAspect, _component().ComponentAspect, _graphql().GraphqlAspect, _logger().LoggerAspect, _builder().BuilderAspect, _workspace().WorkspaceAspect, _scope().ScopeAspect]);
366
514
  _defineProperty(SchemaMain, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType()]);