@fern-api/fern-api-dev 4.107.0 → 4.107.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.cjs +271 -94
- package/package.json +1 -1
package/cli.cjs
CHANGED
|
@@ -340394,9 +340394,9 @@ var require_diff3 = __commonJS({
|
|
|
340394
340394
|
}
|
|
340395
340395
|
});
|
|
340396
340396
|
|
|
340397
|
-
// ../../../node_modules/.pnpm/@fern-api+replay@0.
|
|
340397
|
+
// ../../../node_modules/.pnpm/@fern-api+replay@0.13.0/node_modules/@fern-api/replay/dist/index.cjs
|
|
340398
340398
|
var require_dist14 = __commonJS({
|
|
340399
|
-
"../../../node_modules/.pnpm/@fern-api+replay@0.
|
|
340399
|
+
"../../../node_modules/.pnpm/@fern-api+replay@0.13.0/node_modules/@fern-api/replay/dist/index.cjs"(exports2, module4) {
|
|
340400
340400
|
"use strict";
|
|
340401
340401
|
var __defProp4 = Object.defineProperty;
|
|
340402
340402
|
var __getOwnPropDesc4 = Object.getOwnPropertyDescriptor;
|
|
@@ -341136,17 +341136,57 @@ var require_dist14 = __commonJS({
|
|
|
341136
341136
|
}
|
|
341137
341137
|
const isAncestor = await this.git.isAncestor(lastGen.commit_sha, "HEAD");
|
|
341138
341138
|
if (!isAncestor) {
|
|
341139
|
+
return this.detectPatchesViaMergeBase(lastGen, lock);
|
|
341140
|
+
}
|
|
341141
|
+
return this.detectPatchesInRange(lastGen.commit_sha, lastGen, lock);
|
|
341142
|
+
}
|
|
341143
|
+
/**
|
|
341144
|
+
* FER-10201 — Non-linear-history detection via `merge-base(prevGen, HEAD)`.
|
|
341145
|
+
*
|
|
341146
|
+
* After a squash-merge of a Fern-bot PR, `lastGen.commit_sha` (the previous
|
|
341147
|
+
* `[fern-generated]`) is orphaned but still in git's object database. The
|
|
341148
|
+
* merge-base is the commit on main from which the bot's branch was created —
|
|
341149
|
+
* a reachable ancestor of HEAD. Walking that range and classifying each
|
|
341150
|
+
* commit via `isGenerationCommit` mirrors the linear path and eliminates
|
|
341151
|
+
* the bug class where pipeline-driven changes (autoversion, replay,
|
|
341152
|
+
* generation) get bundled as customer customizations.
|
|
341153
|
+
*
|
|
341154
|
+
* Falls through to the legacy composite path when no common ancestor exists
|
|
341155
|
+
* (truly disjoint history — orphan branches with no shared root).
|
|
341156
|
+
*/
|
|
341157
|
+
async detectPatchesViaMergeBase(lastGen, lock) {
|
|
341158
|
+
let mergeBase = "";
|
|
341159
|
+
try {
|
|
341160
|
+
mergeBase = (await this.git.exec(["merge-base", lastGen.commit_sha, "HEAD"])).trim();
|
|
341161
|
+
} catch {
|
|
341162
|
+
}
|
|
341163
|
+
if (!mergeBase) {
|
|
341164
|
+
this.warnings.push(
|
|
341165
|
+
`No common ancestor between previous generation ${lastGen.commit_sha.slice(0, 7)} and HEAD. Falling back to composite tree-diff detection.`
|
|
341166
|
+
);
|
|
341139
341167
|
return this.detectPatchesViaTreeDiff(
|
|
341140
341168
|
lastGen,
|
|
341141
341169
|
/* commitKnownMissing */
|
|
341142
341170
|
false
|
|
341143
341171
|
);
|
|
341144
341172
|
}
|
|
341173
|
+
return this.detectPatchesInRange(mergeBase, lastGen, lock);
|
|
341174
|
+
}
|
|
341175
|
+
/**
|
|
341176
|
+
* FER-10201 — Walk `${rangeStart}..HEAD`, classify each commit, emit one
|
|
341177
|
+
* `StoredPatch` per customer commit. Body shared by the linear path
|
|
341178
|
+
* (rangeStart = lastGen.commit_sha) and the merge-base path.
|
|
341179
|
+
*
|
|
341180
|
+
* Patch `base_generation` is always `lastGen.commit_sha` — the
|
|
341181
|
+
* lockfile-tracked reference the applicator uses to fetch base file
|
|
341182
|
+
* content, regardless of where the walk actually started.
|
|
341183
|
+
*/
|
|
341184
|
+
async detectPatchesInRange(rangeStart, lastGen, lock) {
|
|
341145
341185
|
const log4 = await this.git.exec([
|
|
341146
341186
|
"log",
|
|
341147
341187
|
"--first-parent",
|
|
341148
341188
|
"--format=%H%x00%an%x00%ae%x00%s",
|
|
341149
|
-
`${
|
|
341189
|
+
`${rangeStart}..HEAD`,
|
|
341150
341190
|
"--",
|
|
341151
341191
|
this.sdkOutputDir
|
|
341152
341192
|
]);
|
|
@@ -621265,7 +621305,7 @@ var AccessTokenPosthogManager = class {
|
|
|
621265
621305
|
properties: {
|
|
621266
621306
|
...event,
|
|
621267
621307
|
...event.properties,
|
|
621268
|
-
version: "4.107.
|
|
621308
|
+
version: "4.107.1",
|
|
621269
621309
|
usingAccessToken: true
|
|
621270
621310
|
}
|
|
621271
621311
|
});
|
|
@@ -621319,7 +621359,7 @@ var UserPosthogManager = class {
|
|
|
621319
621359
|
distinctId: this.userId ?? await this.getPersistedDistinctId(),
|
|
621320
621360
|
event: "CLI",
|
|
621321
621361
|
properties: {
|
|
621322
|
-
version: "4.107.
|
|
621362
|
+
version: "4.107.1",
|
|
621323
621363
|
...event,
|
|
621324
621364
|
...event.properties,
|
|
621325
621365
|
usingAccessToken: false,
|
|
@@ -832962,7 +833002,7 @@ var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
|
|
|
832962
833002
|
var LOGS_FOLDER_NAME = "logs";
|
|
832963
833003
|
var MAX_LOGS_DIR_SIZE_BYTES = 100 * 1024 * 1024;
|
|
832964
833004
|
function getCliSource() {
|
|
832965
|
-
const version7 = "4.107.
|
|
833005
|
+
const version7 = "4.107.1";
|
|
832966
833006
|
return `cli@${version7}`;
|
|
832967
833007
|
}
|
|
832968
833008
|
var DebugLogger = class {
|
|
@@ -845371,7 +845411,7 @@ var LegacyDocsPublisher = class {
|
|
|
845371
845411
|
previewId,
|
|
845372
845412
|
disableTemplates: void 0,
|
|
845373
845413
|
skipUpload,
|
|
845374
|
-
cliVersion: "4.107.
|
|
845414
|
+
cliVersion: "4.107.1",
|
|
845375
845415
|
loginCommand: "fern auth login"
|
|
845376
845416
|
});
|
|
845377
845417
|
if (taskContext.getResult() === TaskResult.Failure) {
|
|
@@ -873709,28 +873749,28 @@ var STRING_TYPE_REFERENCE = {
|
|
|
873709
873749
|
type: "primitive",
|
|
873710
873750
|
value: "STRING"
|
|
873711
873751
|
};
|
|
873712
|
-
function
|
|
873752
|
+
function stripOptionalAndNullable(item) {
|
|
873753
|
+
let current3 = item;
|
|
873754
|
+
while (current3.type === "optional" || current3.type === "nullable") {
|
|
873755
|
+
current3 = current3.value;
|
|
873756
|
+
}
|
|
873757
|
+
return current3;
|
|
873758
|
+
}
|
|
873759
|
+
function stripListItemWrappers(typeReference2) {
|
|
873713
873760
|
if (typeReference2.type === "optional" && typeReference2.value.type === "list") {
|
|
873714
|
-
const
|
|
873715
|
-
const
|
|
873716
|
-
if (
|
|
873717
|
-
return
|
|
873718
|
-
type: "optional",
|
|
873719
|
-
value: {
|
|
873720
|
-
type: "list",
|
|
873721
|
-
value: itemType.value
|
|
873722
|
-
}
|
|
873723
|
-
};
|
|
873761
|
+
const itemType = typeReference2.value.value;
|
|
873762
|
+
const stripped = stripOptionalAndNullable(itemType);
|
|
873763
|
+
if (stripped === itemType) {
|
|
873764
|
+
return typeReference2;
|
|
873724
873765
|
}
|
|
873766
|
+
return { type: "optional", value: { type: "list", value: stripped } };
|
|
873725
873767
|
}
|
|
873726
873768
|
if (typeReference2.type === "list") {
|
|
873727
|
-
const
|
|
873728
|
-
if (
|
|
873729
|
-
return
|
|
873730
|
-
type: "list",
|
|
873731
|
-
value: itemType.value
|
|
873732
|
-
};
|
|
873769
|
+
const stripped = stripOptionalAndNullable(typeReference2.value);
|
|
873770
|
+
if (stripped === typeReference2.value) {
|
|
873771
|
+
return typeReference2;
|
|
873733
873772
|
}
|
|
873773
|
+
return { type: "list", value: stripped };
|
|
873734
873774
|
}
|
|
873735
873775
|
return typeReference2;
|
|
873736
873776
|
}
|
|
@@ -874246,9 +874286,7 @@ var EndpointSnippetGenerator4 = class {
|
|
|
874246
874286
|
const queryParameterFields = sortedQueryParameters.map((queryParameter) => ({
|
|
874247
874287
|
name: this.context.getMethodName(queryParameter.name.name),
|
|
874248
874288
|
value: this.context.dynamicTypeLiteralMapper.convert({
|
|
874249
|
-
|
|
874250
|
-
// Java SDK builders have convenience overloads that accept List<T>.
|
|
874251
|
-
typeReference: unwrapOptionalFromListItems(queryParameter.typeReference),
|
|
874289
|
+
typeReference: stripListItemWrappers(queryParameter.typeReference),
|
|
874252
874290
|
value: queryParameter.value,
|
|
874253
874291
|
as: "request"
|
|
874254
874292
|
})
|
|
@@ -881444,52 +881482,6 @@ var Begin = class extends AstNode6 {
|
|
|
881444
881482
|
}
|
|
881445
881483
|
};
|
|
881446
881484
|
|
|
881447
|
-
// ../../../generators/ruby-v2/ast/lib/ast/IfElse.js
|
|
881448
|
-
var IfElse = class extends AstNode6 {
|
|
881449
|
-
ifBranch;
|
|
881450
|
-
elseIfs;
|
|
881451
|
-
elseBody;
|
|
881452
|
-
constructor({ if: ifBranch, elseIf, elseBody }) {
|
|
881453
|
-
super();
|
|
881454
|
-
this.ifBranch = ifBranch;
|
|
881455
|
-
this.elseIfs = elseIf ?? [];
|
|
881456
|
-
this.elseBody = elseBody ? Array.isArray(elseBody) ? elseBody : [elseBody] : void 0;
|
|
881457
|
-
}
|
|
881458
|
-
write(writer2) {
|
|
881459
|
-
writer2.write("if ");
|
|
881460
|
-
this.ifBranch.condition.write(writer2);
|
|
881461
|
-
writer2.writeLine();
|
|
881462
|
-
writer2.indent();
|
|
881463
|
-
for (const stmt of this.ifBranch.thenBody) {
|
|
881464
|
-
stmt.write(writer2);
|
|
881465
|
-
writer2.writeNewLineIfLastLineNot();
|
|
881466
|
-
}
|
|
881467
|
-
writer2.dedent();
|
|
881468
|
-
for (const elseIf of this.elseIfs) {
|
|
881469
|
-
writer2.write("elsif ");
|
|
881470
|
-
elseIf.condition.write(writer2);
|
|
881471
|
-
writer2.writeLine();
|
|
881472
|
-
writer2.indent();
|
|
881473
|
-
for (const stmt of elseIf.thenBody) {
|
|
881474
|
-
stmt.write(writer2);
|
|
881475
|
-
writer2.writeNewLineIfLastLineNot();
|
|
881476
|
-
}
|
|
881477
|
-
writer2.dedent();
|
|
881478
|
-
}
|
|
881479
|
-
if (this.elseBody && this.elseBody.length > 0) {
|
|
881480
|
-
writer2.writeLine("else");
|
|
881481
|
-
writer2.indent();
|
|
881482
|
-
for (const stmt of this.elseBody) {
|
|
881483
|
-
stmt.write(writer2);
|
|
881484
|
-
writer2.writeNewLineIfLastLineNot();
|
|
881485
|
-
}
|
|
881486
|
-
writer2.dedent();
|
|
881487
|
-
}
|
|
881488
|
-
writer2.write("end");
|
|
881489
|
-
writer2.writeNewLineIfLastLineNot();
|
|
881490
|
-
}
|
|
881491
|
-
};
|
|
881492
|
-
|
|
881493
881485
|
// ../../../generators/ruby-v2/ast/lib/ast/Comment.js
|
|
881494
881486
|
var MAX_LINE_LENGTH2 = 120;
|
|
881495
881487
|
var COMMENT_PREFIX_LENGTH = 2;
|
|
@@ -882136,19 +882128,20 @@ var Class_ = class extends Module_ {
|
|
|
882136
882128
|
writer2.writeLine("; end");
|
|
882137
882129
|
return;
|
|
882138
882130
|
}
|
|
882139
|
-
if (this.statements.length) {
|
|
882131
|
+
if (this.statements.length || this.methods.length) {
|
|
882140
882132
|
writer2.newLine();
|
|
882141
882133
|
writer2.indent();
|
|
882142
882134
|
this.statements.forEach((statement, index3) => {
|
|
882143
882135
|
statement.write(writer2);
|
|
882144
|
-
writer2.
|
|
882136
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882137
|
+
if (index3 < this.statements.length - 1) {
|
|
882138
|
+
writer2.newLine();
|
|
882139
|
+
}
|
|
882145
882140
|
});
|
|
882146
|
-
|
|
882147
|
-
|
|
882148
|
-
|
|
882149
|
-
|
|
882150
|
-
writer2.indent();
|
|
882151
|
-
this.methods.forEach((method8) => {
|
|
882141
|
+
this.methods.forEach((method8, index3) => {
|
|
882142
|
+
if (index3 > 0 || this.statements.length > 0) {
|
|
882143
|
+
writer2.newLine();
|
|
882144
|
+
}
|
|
882152
882145
|
method8.write(writer2);
|
|
882153
882146
|
});
|
|
882154
882147
|
writer2.dedent();
|
|
@@ -882186,6 +882179,112 @@ var Class_ = class extends Module_ {
|
|
|
882186
882179
|
}
|
|
882187
882180
|
};
|
|
882188
882181
|
|
|
882182
|
+
// ../../../generators/ruby-v2/ast/lib/ast/IfElse.js
|
|
882183
|
+
var IfElse = class extends AstNode6 {
|
|
882184
|
+
ifBranch;
|
|
882185
|
+
elseIfs;
|
|
882186
|
+
elseBody;
|
|
882187
|
+
constructor({ if: ifBranch, elseIf, elseBody }) {
|
|
882188
|
+
super();
|
|
882189
|
+
this.ifBranch = ifBranch;
|
|
882190
|
+
this.elseIfs = elseIf ?? [];
|
|
882191
|
+
this.elseBody = elseBody ? Array.isArray(elseBody) ? elseBody : [elseBody] : void 0;
|
|
882192
|
+
}
|
|
882193
|
+
write(writer2) {
|
|
882194
|
+
const modifier = this.renderAsModifier(writer2);
|
|
882195
|
+
if (modifier != null) {
|
|
882196
|
+
writer2.write(modifier);
|
|
882197
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882198
|
+
return;
|
|
882199
|
+
}
|
|
882200
|
+
writer2.write("if ");
|
|
882201
|
+
this.ifBranch.condition.write(writer2);
|
|
882202
|
+
writer2.writeLine();
|
|
882203
|
+
writer2.indent();
|
|
882204
|
+
for (const stmt of this.ifBranch.thenBody) {
|
|
882205
|
+
stmt.write(writer2);
|
|
882206
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882207
|
+
}
|
|
882208
|
+
writer2.dedent();
|
|
882209
|
+
for (const elseIf of this.elseIfs) {
|
|
882210
|
+
writer2.write("elsif ");
|
|
882211
|
+
elseIf.condition.write(writer2);
|
|
882212
|
+
writer2.writeLine();
|
|
882213
|
+
writer2.indent();
|
|
882214
|
+
for (const stmt of elseIf.thenBody) {
|
|
882215
|
+
stmt.write(writer2);
|
|
882216
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882217
|
+
}
|
|
882218
|
+
writer2.dedent();
|
|
882219
|
+
}
|
|
882220
|
+
if (this.elseBody && this.elseBody.length > 0) {
|
|
882221
|
+
writer2.writeLine("else");
|
|
882222
|
+
writer2.indent();
|
|
882223
|
+
for (const stmt of this.elseBody) {
|
|
882224
|
+
stmt.write(writer2);
|
|
882225
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882226
|
+
}
|
|
882227
|
+
writer2.dedent();
|
|
882228
|
+
}
|
|
882229
|
+
writer2.write("end");
|
|
882230
|
+
writer2.writeNewLineIfLastLineNot();
|
|
882231
|
+
}
|
|
882232
|
+
/**
|
|
882233
|
+
* Returns the modifier-form rendering (`stmt if cond`) when this if is
|
|
882234
|
+
* eligible:
|
|
882235
|
+
* - exactly one statement in the then-body
|
|
882236
|
+
* - no elsif and no else
|
|
882237
|
+
* - the single statement is not an intrinsically multi-line AST node
|
|
882238
|
+
* (Class, Module, Method, Begin, IfElse)
|
|
882239
|
+
* - the rendered statement and condition each fit on a single line
|
|
882240
|
+
*
|
|
882241
|
+
* Returns undefined when the shape isn't eligible, in which case the caller
|
|
882242
|
+
* falls back to explicit if/end form.
|
|
882243
|
+
*
|
|
882244
|
+
* The generator's .rubocop.yml disables Layout/LineLength, so rubocop's
|
|
882245
|
+
* Style/IfUnlessModifier accepts modifier form at any line length. Shape
|
|
882246
|
+
* eligibility is therefore sufficient; we don't gate on a max-line-length
|
|
882247
|
+
* budget here.
|
|
882248
|
+
*/
|
|
882249
|
+
renderAsModifier(writer2) {
|
|
882250
|
+
if (this.ifBranch.thenBody.length !== 1) {
|
|
882251
|
+
return void 0;
|
|
882252
|
+
}
|
|
882253
|
+
if (this.elseIfs.length > 0) {
|
|
882254
|
+
return void 0;
|
|
882255
|
+
}
|
|
882256
|
+
if (this.elseBody != null && this.elseBody.length > 0) {
|
|
882257
|
+
return void 0;
|
|
882258
|
+
}
|
|
882259
|
+
const stmt = this.ifBranch.thenBody[0];
|
|
882260
|
+
if (stmt == null) {
|
|
882261
|
+
return void 0;
|
|
882262
|
+
}
|
|
882263
|
+
if (isKnownMultiLineNode(stmt) || isKnownMultiLineNode(this.ifBranch.condition)) {
|
|
882264
|
+
return void 0;
|
|
882265
|
+
}
|
|
882266
|
+
const stmtRendered = renderNode(stmt, writer2);
|
|
882267
|
+
const conditionRendered = renderNode(this.ifBranch.condition, writer2);
|
|
882268
|
+
if (stmtRendered.length === 0 || conditionRendered.length === 0) {
|
|
882269
|
+
return void 0;
|
|
882270
|
+
}
|
|
882271
|
+
if (stmtRendered.includes("\n") || conditionRendered.includes("\n")) {
|
|
882272
|
+
return void 0;
|
|
882273
|
+
}
|
|
882274
|
+
return `${stmtRendered} if ${conditionRendered}`;
|
|
882275
|
+
}
|
|
882276
|
+
};
|
|
882277
|
+
function isKnownMultiLineNode(node4) {
|
|
882278
|
+
return node4 instanceof Class_ || node4 instanceof Module_ || node4 instanceof Method6 || node4 instanceof Begin || node4 instanceof IfElse;
|
|
882279
|
+
}
|
|
882280
|
+
function renderNode(node4, parentWriter) {
|
|
882281
|
+
const rendered = node4.toString({
|
|
882282
|
+
customConfig: parentWriter.customConfig,
|
|
882283
|
+
formatter: parentWriter.formatter
|
|
882284
|
+
});
|
|
882285
|
+
return rendered.replace(/\n+$/, "");
|
|
882286
|
+
}
|
|
882287
|
+
|
|
882189
882288
|
// ../../../generators/ruby-v2/ast/lib/ast/ClassInstantiation.js
|
|
882190
882289
|
var ClassInstantiation5 = class extends AstNode6 {
|
|
882191
882290
|
classReference;
|
|
@@ -882446,9 +882545,36 @@ var TypeLiteral3 = class _TypeLiteral extends AstNode6 {
|
|
|
882446
882545
|
super();
|
|
882447
882546
|
this.internalType = internalType;
|
|
882448
882547
|
}
|
|
882548
|
+
/**
|
|
882549
|
+
* Returns a stable string representation of this literal suitable for
|
|
882550
|
+
* deduplicating hash keys (see Lint/DuplicateHashKey). Returns undefined
|
|
882551
|
+
* for compound/dynamic shapes where value equality isn't decidable at
|
|
882552
|
+
* emit time.
|
|
882553
|
+
*/
|
|
882554
|
+
getDedupKey() {
|
|
882555
|
+
switch (this.internalType.type) {
|
|
882556
|
+
case "str":
|
|
882557
|
+
return `str:${this.internalType.value}`;
|
|
882558
|
+
case "interpolatedStr":
|
|
882559
|
+
return `istr:${this.internalType.value}`;
|
|
882560
|
+
case "int":
|
|
882561
|
+
return `int:${this.internalType.value}`;
|
|
882562
|
+
case "float":
|
|
882563
|
+
return `float:${this.internalType.value}`;
|
|
882564
|
+
case "bool":
|
|
882565
|
+
return `bool:${this.internalType.value}`;
|
|
882566
|
+
case "nil":
|
|
882567
|
+
return "nil";
|
|
882568
|
+
default:
|
|
882569
|
+
return void 0;
|
|
882570
|
+
}
|
|
882571
|
+
}
|
|
882449
882572
|
static string(value2) {
|
|
882450
882573
|
return new this({ type: "str", value: value2 });
|
|
882451
882574
|
}
|
|
882575
|
+
static interpolatedString(value2) {
|
|
882576
|
+
return new this({ type: "interpolatedStr", value: value2 });
|
|
882577
|
+
}
|
|
882452
882578
|
static integer(value2) {
|
|
882453
882579
|
return new this({ type: "int", value: value2 });
|
|
882454
882580
|
}
|
|
@@ -882485,6 +882611,11 @@ var TypeLiteral3 = class _TypeLiteral extends AstNode6 {
|
|
|
882485
882611
|
write(writer2) {
|
|
882486
882612
|
switch (this.internalType.type) {
|
|
882487
882613
|
case "str": {
|
|
882614
|
+
const value2 = this.internalType.value.replaceAll("\r\n", "\n");
|
|
882615
|
+
writer2.write(`"${value2.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replace(/#(?=[{$@])/g, "\\#")}"`);
|
|
882616
|
+
break;
|
|
882617
|
+
}
|
|
882618
|
+
case "interpolatedStr": {
|
|
882488
882619
|
const value2 = this.internalType.value.replaceAll("\r\n", "\n");
|
|
882489
882620
|
writer2.write(`"${value2.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`);
|
|
882490
882621
|
break;
|
|
@@ -882502,7 +882633,21 @@ var TypeLiteral3 = class _TypeLiteral extends AstNode6 {
|
|
|
882502
882633
|
break;
|
|
882503
882634
|
}
|
|
882504
882635
|
case "hash": {
|
|
882505
|
-
const
|
|
882636
|
+
const filteredEntries = this.internalType.entries.filter((entry) => !_TypeLiteral.isNop(entry.key) && !_TypeLiteral.isNop(entry.value));
|
|
882637
|
+
const seenKeys = /* @__PURE__ */ new Map();
|
|
882638
|
+
filteredEntries.forEach((entry, index3) => {
|
|
882639
|
+
const rendered = renderKeyForDedup(entry.key);
|
|
882640
|
+
if (rendered != null) {
|
|
882641
|
+
seenKeys.set(rendered, index3);
|
|
882642
|
+
}
|
|
882643
|
+
});
|
|
882644
|
+
const entries23 = filteredEntries.filter((entry, index3) => {
|
|
882645
|
+
const rendered = renderKeyForDedup(entry.key);
|
|
882646
|
+
if (rendered == null) {
|
|
882647
|
+
return true;
|
|
882648
|
+
}
|
|
882649
|
+
return seenKeys.get(rendered) === index3;
|
|
882650
|
+
});
|
|
882506
882651
|
if (entries23.length === 0) {
|
|
882507
882652
|
writer2.write("{}");
|
|
882508
882653
|
break;
|
|
@@ -882582,6 +882727,12 @@ var TypeLiteral3 = class _TypeLiteral extends AstNode6 {
|
|
|
882582
882727
|
}
|
|
882583
882728
|
}
|
|
882584
882729
|
};
|
|
882730
|
+
function renderKeyForDedup(key2) {
|
|
882731
|
+
if (!(key2 instanceof TypeLiteral3)) {
|
|
882732
|
+
return void 0;
|
|
882733
|
+
}
|
|
882734
|
+
return key2.getDedupKey();
|
|
882735
|
+
}
|
|
882585
882736
|
|
|
882586
882737
|
// ../../../generators/ruby-v2/ast/lib/ast/TypeParameter.js
|
|
882587
882738
|
var Variance;
|
|
@@ -883544,6 +883695,7 @@ var EndpointSnippetGenerator7 = class {
|
|
|
883544
883695
|
invokeMethodArgs.keywordArguments = invokeMethodArgs.keywordArguments ?? [];
|
|
883545
883696
|
invokeMethodArgs.keywordArguments.push(requestOptions);
|
|
883546
883697
|
}
|
|
883698
|
+
invokeMethodArgs.keywordArguments = dedupeKeywordArguments(invokeMethodArgs.keywordArguments);
|
|
883547
883699
|
return ruby_exports.invokeMethod(invokeMethodArgs);
|
|
883548
883700
|
}
|
|
883549
883701
|
/**
|
|
@@ -883577,6 +883729,7 @@ var EndpointSnippetGenerator7 = class {
|
|
|
883577
883729
|
invokeMethodArgs.keywordArguments = invokeMethodArgs.keywordArguments ?? [];
|
|
883578
883730
|
invokeMethodArgs.keywordArguments.push(requestOptions);
|
|
883579
883731
|
}
|
|
883732
|
+
invokeMethodArgs.keywordArguments = dedupeKeywordArguments(invokeMethodArgs.keywordArguments);
|
|
883580
883733
|
return ruby_exports.invokeMethod(invokeMethodArgs);
|
|
883581
883734
|
}
|
|
883582
883735
|
/**
|
|
@@ -883913,6 +884066,21 @@ var EndpointSnippetGenerator7 = class {
|
|
|
883913
884066
|
return this.context.getMethodName(endpoint3.declaration.name);
|
|
883914
884067
|
}
|
|
883915
884068
|
};
|
|
884069
|
+
function dedupeKeywordArguments(kwargs) {
|
|
884070
|
+
if (kwargs == null || kwargs.length <= 1) {
|
|
884071
|
+
return kwargs;
|
|
884072
|
+
}
|
|
884073
|
+
const lastIndexByName = /* @__PURE__ */ new Map();
|
|
884074
|
+
kwargs.forEach((arg, index3) => {
|
|
884075
|
+
lastIndexByName.set(arg.name, index3);
|
|
884076
|
+
});
|
|
884077
|
+
const deduped = kwargs.filter((arg, index3) => lastIndexByName.get(arg.name) === index3);
|
|
884078
|
+
if (deduped.length !== kwargs.length) {
|
|
884079
|
+
const droppedNames = Array.from(new Set(kwargs.map((arg) => arg.name).filter((name2, index3) => lastIndexByName.get(name2) !== index3)));
|
|
884080
|
+
console.warn(`[ruby-v2 dynamic-snippets] duplicate keyword argument name(s) [${droppedNames.join(", ")}] in a generated snippet; keeping last occurrence to match **params runtime behavior. This indicates a latent name collision in the Ruby SDK method signature that should be disambiguated at the generator level.`);
|
|
884081
|
+
}
|
|
884082
|
+
return deduped;
|
|
884083
|
+
}
|
|
883916
884084
|
|
|
883917
884085
|
// ../../../generators/ruby-v2/dynamic-snippets/lib/DynamicSnippetsGenerator.js
|
|
883918
884086
|
var DynamicSnippetsGenerator6 = class extends AbstractDynamicSnippetsGenerator {
|
|
@@ -919472,7 +919640,7 @@ var CliContext = class _CliContext {
|
|
|
919472
919640
|
if (false) {
|
|
919473
919641
|
this.logger.error("CLI_VERSION is not defined");
|
|
919474
919642
|
}
|
|
919475
|
-
return "4.107.
|
|
919643
|
+
return "4.107.1";
|
|
919476
919644
|
}
|
|
919477
919645
|
getCliName() {
|
|
919478
919646
|
if (false) {
|
|
@@ -930898,6 +931066,7 @@ async function formatWorkspaces({
|
|
|
930898
931066
|
}
|
|
930899
931067
|
|
|
930900
931068
|
// src/commands/generate/generateDocsWorkspace.ts
|
|
931069
|
+
init_lib4();
|
|
930901
931070
|
init_js();
|
|
930902
931071
|
|
|
930903
931072
|
// src/utils/environment.ts
|
|
@@ -931099,27 +931268,35 @@ ${source_default.yellow("?")} Are you sure you want to continue?`,
|
|
|
931099
931268
|
errorOnBrokenLinks: strictBrokenLinks,
|
|
931100
931269
|
excludeRules: getExcludeRules(brokenLinks, strictBrokenLinks)
|
|
931101
931270
|
});
|
|
931271
|
+
const skippedWorkspacePaths = /* @__PURE__ */ new Set();
|
|
931102
931272
|
const ossWorkspacesForValidation = await filterOssWorkspaces(project);
|
|
931103
931273
|
for (const ossWorkspace of ossWorkspacesForValidation) {
|
|
931104
|
-
|
|
931105
|
-
|
|
931106
|
-
|
|
931107
|
-
|
|
931108
|
-
|
|
931274
|
+
try {
|
|
931275
|
+
const violations = await validateOSSWorkspace(ossWorkspace, context3);
|
|
931276
|
+
const errors4 = violations.filter((v9) => v9.severity === "fatal" || v9.severity === "error");
|
|
931277
|
+
if (errors4.length > 0) {
|
|
931278
|
+
for (const error50 of errors4) {
|
|
931279
|
+
context3.logger.warn(`${error50.relativeFilepath}: ${error50.message}`);
|
|
931280
|
+
}
|
|
931281
|
+
context3.logger.warn(
|
|
931282
|
+
`Skipping API workspace at ${ossWorkspace.absoluteFilePath} due to ${errors4.length} validation error${errors4.length !== 1 ? "s" : ""}. Run fern check for details.`
|
|
931283
|
+
);
|
|
931284
|
+
skippedWorkspacePaths.add(ossWorkspace.absoluteFilePath);
|
|
931109
931285
|
}
|
|
931110
|
-
|
|
931111
|
-
|
|
931112
|
-
|
|
931113
|
-
{ code: CliError.Code.ValidationError }
|
|
931286
|
+
} catch (error50) {
|
|
931287
|
+
context3.logger.warn(
|
|
931288
|
+
`Skipping API workspace at ${ossWorkspace.absoluteFilePath}: ${extractErrorMessage(error50)}`
|
|
931114
931289
|
);
|
|
931290
|
+
skippedWorkspacePaths.add(ossWorkspace.absoluteFilePath);
|
|
931115
931291
|
}
|
|
931116
931292
|
}
|
|
931117
931293
|
context3.logger.info("Validation complete, starting remote docs generation...");
|
|
931118
931294
|
const filterStart = performance.now();
|
|
931119
|
-
const
|
|
931295
|
+
const allOssWorkspaces = await filterOssWorkspaces(project);
|
|
931296
|
+
const ossWorkspaces = allOssWorkspaces.filter((ws5) => !skippedWorkspacePaths.has(ws5.absoluteFilePath));
|
|
931120
931297
|
const filterTime = performance.now() - filterStart;
|
|
931121
931298
|
context3.logger.debug(
|
|
931122
|
-
`Filtered OSS workspaces (${ossWorkspaces.length} workspaces) in ${filterTime.toFixed(0)}ms`
|
|
931299
|
+
`Filtered OSS workspaces (${ossWorkspaces.length} workspaces, ${skippedWorkspacePaths.size} skipped) in ${filterTime.toFixed(0)}ms`
|
|
931123
931300
|
);
|
|
931124
931301
|
const generationStart = performance.now();
|
|
931125
931302
|
await runRemoteGenerationForDocsWorkspace({
|
package/package.json
CHANGED