@workos/oagen 0.19.4 → 0.19.6

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.
@@ -3148,11 +3148,21 @@ function extractKotlinClassMembers(classBody, source) {
3148
3148
  }
3149
3149
  members.push({
3150
3150
  key: memberName,
3151
- text: source.slice(startIdx, endIdx)
3151
+ text: source.slice(startIdx, endIdx),
3152
+ startIndex: startIdx,
3153
+ endIndex: endIdx
3152
3154
  });
3153
3155
  }
3154
3156
  return members;
3155
3157
  }
3158
+ /**
3159
+ * KDoc signature that identifies a generator-emitted service accessor inside
3160
+ * the WorkOS class. The Kotlin client emitter writes every accessor with this
3161
+ * exact doc preamble — when the existing file carries a member with this doc
3162
+ * but the regenerated content omits it, the member is stale (its mount target
3163
+ * was remapped or removed) and gets pruned.
3164
+ */
3165
+ const KOTLIN_MANAGED_ACCESSOR_DOC = /\/\*\*[\s\S]*?Lazily-constructed \[[^\]]+\] accessor for this \[WorkOS\] client\.[\s\S]*?\*\//;
3156
3166
  const kotlinMergeAdapter = {
3157
3167
  language: "kotlin",
3158
3168
  grammarModule: "tree-sitter-kotlin",
@@ -3193,6 +3203,9 @@ const kotlinMergeAdapter = {
3193
3203
  renderImports(imports) {
3194
3204
  return imports.map((entry) => entry.text);
3195
3205
  },
3206
+ isManagedMember(member) {
3207
+ return KOTLIN_MANAGED_ACCESSOR_DOC.test(member.text);
3208
+ },
3196
3209
  shouldSkipDeepMerge(_symbolName, existingMemberKeys, newMembers) {
3197
3210
  const newText = newMembers.map((m) => m.text).join("\n");
3198
3211
  for (const match of newText.matchAll(/this\.(\w+)/g)) {
@@ -4288,6 +4301,7 @@ async function mergeIntoExisting(existingContent, generatedContent, language, he
4288
4301
  let result = existingContent;
4289
4302
  if (toAppend.length > 0) result = result.trimEnd() + "\n\n" + toAppend.join("\n\n") + "\n";
4290
4303
  let deepAdded = 0;
4304
+ let deepPruned = 0;
4291
4305
  const insertions = [];
4292
4306
  if (adapter.extractMembers) {
4293
4307
  const parser = await getParser(language);
@@ -4297,6 +4311,37 @@ async function mergeIntoExisting(existingContent, generatedContent, language, he
4297
4311
  const generatedSymbols = adapter.extractMembers(generatedTree, generatedContent);
4298
4312
  const existingTree = safeParse(parser, existingContent);
4299
4313
  const deepIgnoredSymbols = buildIgnoredSymbolNames(adapter.extractDocstrings(existingTree, existingContent), findIgnoredRegions(existingContent));
4314
+ if (adapter.isManagedMember) {
4315
+ const pruneEdits = [];
4316
+ for (const [symbolName, genSymbol] of generatedSymbols) {
4317
+ if (deepIgnoredSymbols.has(symbolName)) continue;
4318
+ const existSymbol = resultSymbols.get(symbolName);
4319
+ if (!existSymbol) continue;
4320
+ const genMemberKeys = new Set(genSymbol.members.map((m) => m.key));
4321
+ for (const existMember of existSymbol.members) {
4322
+ if (genMemberKeys.has(existMember.key)) continue;
4323
+ if (existMember.startIndex === void 0 || existMember.endIndex === void 0) continue;
4324
+ if (!adapter.isManagedMember(existMember)) continue;
4325
+ pruneEdits.push({
4326
+ start: existMember.startIndex,
4327
+ end: existMember.endIndex
4328
+ });
4329
+ }
4330
+ }
4331
+ if (pruneEdits.length > 0) {
4332
+ pruneEdits.sort((a, b) => b.start - a.start);
4333
+ for (const edit of pruneEdits) {
4334
+ let end = edit.end;
4335
+ while (end < result.length && (result[end] === " " || result[end] === " ")) end++;
4336
+ if (result[end] === "\n") end++;
4337
+ result = result.slice(0, edit.start) + result.slice(end);
4338
+ }
4339
+ deepPruned = pruneEdits.length;
4340
+ const reTree = safeParse(parser, result);
4341
+ resultSymbols.clear();
4342
+ for (const [k, v] of adapter.extractMembers(reTree, result)) resultSymbols.set(k, v);
4343
+ }
4344
+ }
4300
4345
  for (const [symbolName, genSymbol] of generatedSymbols) {
4301
4346
  if (deepIgnoredSymbols.has(symbolName)) continue;
4302
4347
  const existSymbol = resultSymbols.get(symbolName);
@@ -4479,7 +4524,7 @@ async function mergeIntoExisting(existingContent, generatedContent, language, he
4479
4524
  }
4480
4525
  }
4481
4526
  const totalAdded = (toAppend.length > 0 || deepAdded > 0 ? adapter.renderImports ? adapter.renderImports(newImports).length : newImports.length : 0) + toAppend.length + deepAdded;
4482
- if (totalAdded === 0 && docstringUpdates === 0) return {
4527
+ if (totalAdded === 0 && docstringUpdates === 0 && deepPruned === 0) return {
4483
4528
  content: existingContent,
4484
4529
  added: 0,
4485
4530
  preserved,
@@ -4904,10 +4949,26 @@ function spliceExtraImports(existingLines, resultLines) {
4904
4949
  const existingPhpUse = new Set(existingLines.filter(isPhpUseImport).map((l) => l.trim()));
4905
4950
  const generatedPhpUse = new Set(resultLines.filter(isPhpUseImport).map((l) => l.trim()));
4906
4951
  const extraPhpUse = [...existingPhpUse].filter((l) => !generatedPhpUse.has(l));
4907
- const isRubyRequire = (l) => /^require(_relative)?\s+['"][^'"]+['"]\s*$/.test(l);
4908
- const existingRubyRequire = new Set(existingLines.filter(isRubyRequire).map((l) => l.trim()));
4909
- const generatedRubyRequire = new Set(resultLines.filter(isRubyRequire).map((l) => l.trim()));
4910
- const extraRubyRequire = [...existingRubyRequire].filter((l) => !generatedRubyRequire.has(l));
4952
+ const rubyRequireRe = /^(require(?:_relative)?)\s+['"]([^'"]+)['"]\s*$/;
4953
+ const rubyRequireKey = (l) => {
4954
+ const m = l.trim().match(rubyRequireRe);
4955
+ return m ? `${m[1]}\t${m[2]}` : void 0;
4956
+ };
4957
+ const generatedRubyRequireKeys = /* @__PURE__ */ new Set();
4958
+ for (const l of resultLines) {
4959
+ const key = rubyRequireKey(l);
4960
+ if (key) generatedRubyRequireKeys.add(key);
4961
+ }
4962
+ const seenExistingKeys = /* @__PURE__ */ new Set();
4963
+ const extraRubyRequire = [];
4964
+ for (const l of existingLines) {
4965
+ const key = rubyRequireKey(l);
4966
+ if (!key) continue;
4967
+ if (generatedRubyRequireKeys.has(key)) continue;
4968
+ if (seenExistingKeys.has(key)) continue;
4969
+ seenExistingKeys.add(key);
4970
+ extraRubyRequire.push(l.trim());
4971
+ }
4911
4972
  const allExtra = [
4912
4973
  ...extraSimple,
4913
4974
  ...extraFromLines,