Conversation
Reverts "chore: bump main to 9.0.0-dev.0 (ionic-team#8320)" and “chore: update latest workflow to only allow pointing at 8.x” This reverts commit c5476c8 and 0412d46
…8338) Co-authored-by: Mark Anderson <mark.anderson@outsystems.com>
Co-authored-by: Mark Anderson <mark.anderson@outsystems.com> Co-authored-by: Mark Anderson <emer@emer.net>
Co-authored-by: Stein Jakob Nordbø <steinjak@gmail.com> Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
…onic-team#7528) Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com> Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
Closes ionic-team#8367 Fixes regression introduced by ionic-team#8357
…onic-team#8391) Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
…eam#8377) Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
…ic-team#8351) Co-authored-by: OS-pedrogustavobilro <pedro.gustavo.bilro@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com> Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
📝 WalkthroughWalkthroughThis PR merges upstream Capacitor 8.3.1 changes into the Capacitor+ fork (previously 8.0.8), updating package metadata and versions across the monorepo, refactoring iOS package manager configuration from runtime detection to explicit config-driven selection (SPM/CocoaPods/bundler), enhancing native fetch interception to handle URL objects, improving system bars configuration on Android/iOS, and adding new GitHub workflows for publishing and automated issue management. Multiple changelog and package files contain unresolved merge conflicts. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8c3a715c1e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -1,9 +1,17 @@ | |||
| { | |||
| <<<<<<< HEAD | |||
There was a problem hiding this comment.
Remove unresolved merge markers from committed files
This commit includes unresolved conflict text (<<<<<<<, =======, >>>>>>>) in tracked sources, which makes affected files syntactically invalid and breaks core workflows immediately (for example, core/package.json can no longer be parsed as JSON by package tooling). Because this fails regardless of runtime inputs, it should be fixed before merge by resolving conflicts and removing markers across all touched files.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 18
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
CHANGELOG.md (1)
6-532:⚠️ Potential issue | 🟠 MajorDrop the manual changelog conflict resolution and regenerate instead.
This file still has conflict markers, and hand-merging it here risks publishing a broken changelog while also violating the repo rule that this file is CI-managed. Please remove the conflict block and let the automated changelog source produce the final content.
As per coding guidelines,
CHANGELOG.md: Do not manually editCHANGELOG.md; it is managed automatically by CI/CD.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@CHANGELOG.md` around lines 6 - 532, The changelog contains manual merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) in CHANGELOG.md; remove the conflict block and restore the CI-generated content instead of hand-editing. Revert any manual merges in CHANGELOG.md (remove the conflict markers and the duplicated sections), then regenerate or restore the file using the repository's automated changelog process (run the changelog generation script/workflow or reset CHANGELOG.md to the CI/automation generated version) and commit the regenerated file so the CI-managed source produces the final changelog; do not commit manual edits to CHANGELOG.md.cli/CHANGELOG.md (1)
6-286:⚠️ Potential issue | 🟠 MajorResolve the leftover merge block before shipping this changelog.
The conflict markers leave the release notes in a corrupted state and will publish raw merge artifacts unless this block is reconciled and cleaned up.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/CHANGELOG.md` around lines 6 - 286, The changelog contains unresolved git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) that duplicate and corrupt release notes (e.g., sections starting with "## [8.0.8]" and "## [8.3.1]"); remove the conflict markers and reconcile the duplicated sections into a single coherent changelog by choosing the intended upstream content (or merging the two lists), keeping only one set of version headings and entries and ensuring formatting consistency.android/CHANGELOG.md (1)
6-260:⚠️ Potential issue | 🟠 MajorClean up this unresolved changelog conflict before merge.
This section still contains raw merge markers, so the Android release history is currently duplicated/corrupted until the block is resolved.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/CHANGELOG.md` around lines 6 - 260, The changelog contains unresolved git merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing duplicated/corrupted Android release notes; remove the merge markers and the duplicated block so only the intended release history remains (choose and keep the correct section — e.g., the upstream/main block with versions 8.3.1/8.3.0 etc.), ensure headings and entries are deduplicated and consistently ordered, and save the cleaned CHANGELOG.md before committing.ios/CHANGELOG.md (1)
6-231:⚠️ Potential issue | 🟠 MajorFinish reconciling this iOS changelog conflict.
The file still contains merge markers, so the iOS changelog is incomplete and will expose raw conflict text until the block is resolved.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/CHANGELOG.md` around lines 6 - 231, The changelog contains unresolved Git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two release blocks (e.g., the local 8.0.8..8.0.1 series and the upstream 8.3.1..8.0.1 series); remove the conflict markers and produce a single coherent changelog by choosing which block to keep or by merging entries (for example, retain the intended iOS release history you want—references: versions "8.0.8" and "8.3.1" shown in the diff—and ensure only one continuous series of release headings remains with no <<<<<<<, =======, >>>>>>> markers).core/CHANGELOG.md (1)
6-163:⚠️ Potential issue | 🔴 CriticalUnresolved Git merge conflict markers must be resolved before merging.
The file contains
<<<<<<< HEAD,=======, and>>>>>>> upstream/mainmarkers at lines 6, 128, and 163. These will break the file and prevent proper rendering/parsing of the changelog.The conflict appears to be between the
@capacitor-plus/coreversion history (8.0.1–8.0.8) and the upstream@capacitor/coreentries (8.0.1–8.3.1). You need to decide how to interleave or separate these histories—typically forks maintain both sets of entries with clear section headers distinguishing fork-specific vs upstream changes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@core/CHANGELOG.md` around lines 6 - 163, The changelog contains unresolved git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) that must be removed; open CHANGELOG.md, decide how to combine the two blocks (either keep fork-specific `@capacitor-plus/core` entries and upstream `@capacitor/core` entries as separate sections with clear headers, or merge chronologically), delete the conflict markers and the duplicate/undesired chunk, ensure headings like the `@capacitor-plus/core` and `@capacitor/core` release lists are preserved and labeled, and save a clean file with no remaining <<<<<<<, =======, or >>>>>>> tokens so the changelog parses/render correctly.
🧹 Nitpick comments (7)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)
96-99: Orphaned observer still references deprecated members.The deprecation of
tmpWindowandtmpVCAppearedis appropriate, but lines 226-228 still register an observer that setsself?.tmpWindow = nilwhentmpVCAppearedis posted. Since the temporary window logic has been removed:
tmpWindowis never set to a non-nil valuetmpVCAppearedis never postedThis observer is now dead code and should be removed to avoid confusion and unnecessary overhead.
♻️ Proposed fix: Remove the orphaned observer
- observers.append(NotificationCenter.default.addObserver(forName: type(of: self).tmpVCAppeared.name, object: .none, queue: .none) { [weak self] _ in - self?.tmpWindow = nil - })Also consider removing the deprecated
tmpWindowandtmpVCAppeareddeclarations entirely in a follow-up, or document why they're retained for API compatibility.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 96 - 99, Remove the dead observer registration that listens for Notification.Name(rawValue: "tmpViewControllerAppeared") and sets self?.tmpWindow = nil (the observer installed around the tmpVCAppeared/tmpWindow logic), because tmpWindow is never set and tmpVCAppeared is never posted; delete the observer registration block that references tmpVCAppeared and tmpWindow and, if desired, plan a follow-up to remove the deprecated tmpWindow and tmpVCAppeared declarations entirely or document their retained API compatibility..github/workflows/needs-reply.yml (1)
8-8: Consider renaming the job for clarity.The job name "build" is misleading since this workflow closes stale issues rather than building artifacts. Consider a more descriptive name like "close-stale-issues" or "needs-reply-cleanup".
♻️ Proposed rename
jobs: - build: + close-stale-issues: runs-on: ubuntu-latest🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/needs-reply.yml at line 8, Rename the workflow job currently named "build" to a descriptive name that reflects its purpose (e.g., "close-stale-issues" or "needs-reply-cleanup") so the job label accurately represents that it closes stale issues rather than building artifacts; update the job key "build" to the chosen name wherever referenced in the workflow (job definition and any job dependencies) to keep identifiers consistent.android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)
313-319: Method should be private.
getThemeColoris only used internally (line 280) but is declaredpublic. Reduce visibility toprivateto follow the principle of least privilege.♻️ Proposed fix
- public int getThemeColor(Context context, int attrRes) { + private int getThemeColor(Context context, int attrRes) {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java` around lines 313 - 319, The getThemeColor method is declared public but only used internally; change its visibility to private by updating the method signature of getThemeColor(Context context, int attrRes) to private, and ensure there are no external references calling getThemeColor (update any internal callers if needed).android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java (1)
315-346: Consider adding null-safety for this public API.The method is
public static, so external callers could invoke it with anullcontent type, causing an NPE atcontentType.indexOf(...). Internal usage is protected by the null check at line 197, but as a public utility method, it may benefit from defensive validation.🛡️ Suggested null guard
public static String extractBoundaryFromContentType(String contentType) { + if (contentType == null) { + return null; + } String boundaryPrefix = "boundary="; int boundaryIndex = contentType.indexOf(boundaryPrefix);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java` around lines 315 - 346, The public static method extractBoundaryFromContentType should defensively handle a null contentType to avoid NPEs for external callers: add an initial null (and optionally empty/blank) check in extractBoundaryFromContentType and return null immediately if contentType is null/blank, then proceed with the existing logic; keep the rest of the method unchanged so callers still get the unquoted, trimmed boundary when present.cli/src/tasks/update.ts (1)
70-84: Note: Deprecated function contains a pre-existing logic issue.The deprecated
updateChecksfunction at line 74 usescheckBundler(config) || checkCocoaPods(config)which evaluates as a boolean OR expression rather than adding both checks. This appears to be a pre-existing issue not introduced by this PR, but worth noting for future cleanup when this deprecated function is removed.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/update.ts` around lines 70 - 84, The deprecated updateChecks function currently pushes a single check that uses a boolean OR (checkBundler(config) || checkCocoaPods(config)) which evaluates immediately to a boolean instead of registering both check functions; change the logic inside updateChecks (for the ios branch) to register both checks separately by adding two entries that invoke checkBundler and checkCocoaPods (e.g., push a function for checkBundler(config) and push another for checkCocoaPods(config)) so both checks run when executed; keep the function name updateChecks and the surrounding control flow intact.cli/src/tasks/migrate-spm.ts (2)
24-26: Config mutation viaWritablecast is intentional but worth documenting.The pattern of casting to
Writable<Config>to mutate the readonly config is necessary here since the migration changes the package manager mid-execution. Consider adding a brief comment explaining why this mutation is safe in this context (single-use migration command).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/migrate-spm.ts` around lines 24 - 26, Add a brief inline comment above the cast/mutation to explain why mutating the readonly Config via Writable<Config> is safe here: state that this is a single-use migration command, the change is local to this execution, and no other code relies on the original immutability during the operation; reference the specific symbols config, configWritable (Writable<Config>), and the subsequent call to update(configWritable as Config, 'ios', false) so future readers understand the intent and risk mitigation.
16-16: Use strict equality (===) for consistency.Line 16 uses loose equality (
==) while other comparisons in the codebase use strict equality (===). For string comparisons this is functionally equivalent, but strict equality is preferred for consistency and to avoid potential type coercion issues.- if ((await config.ios.packageManager) == 'SPM') { + if ((await config.ios.packageManager) === 'SPM') {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/migrate-spm.ts` at line 16, Replace the loose equality check in the conditional that reads the package manager with a strict equality comparison: change the comparison that tests (await config.ios.packageManager) == 'SPM' to use ===. Locate the conditional that uses config.ios.packageManager in migrate-spm.ts (the if statement shown) and update it to use strict equality (=== 'SPM') so it matches the codebase convention and avoids type-coercion differences.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/publish-ios.yml:
- Around line 21-24: The checkout step currently pins ref: 'main' which ignores
the triggering commit; update the actions/checkout@v5 usage (the checkout step)
to use the triggering ref instead—replace the hardcoded ref with the appropriate
runtime ref (e.g., github.ref or the caller-provided ref input for this reusable
workflow) so the workflow checks out the exact commit that triggered the run and
not always main; keep fetch-depth: 0 as-is.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 321-329: getWebViewMajorVersion currently re-parses the WebView
version on every call and will throw NumberFormatException for malformed version
strings; add a private cached field (e.g., cachedWebViewMajorVersion) to store
the computed Integer and return it on subsequent calls, and wrap the parsing
logic in a try-catch to catch NumberFormatException (and any NPE) so you set and
return a safe default (0) on error; also avoid repeated lookups by only calling
WebViewCompat.getCurrentWebViewPackage once when computing the cached value in
getWebViewMajorVersion.
- Around line 218-225: The safe-area calculation is using the modified
WindowInsetsCompat newInsets (which zeroes systemBars/displayCutout) so
calcSafeAreaInsets returns all zeros; change the call in the non-passthrough
branch to use the original insets object when calling calcSafeAreaInsets (leave
the creation of newInsets as-is for the passthrough handling) and then pass the
computed Insets to injectSafeAreaCSS (i.e., call calcSafeAreaInsets(insets)
instead of calcSafeAreaInsets(newInsets) before injectSafeAreaCSS).
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 131-142: The Javadoc for WebViewLocalServer.getResponseHeaders()
contains an extra closing </p> tag; edit the Javadoc for the
getResponseHeaders() method (and its `@deprecated` block that references
buildDefaultResponseHeaders()) to remove the orphan </p> so the paragraphs are
properly balanced and the Javadoc compiles cleanly, keeping the note that
callers should use buildDefaultResponseHeaders() instead.
In `@android/package.json`:
- Around line 34-39: Resolve the unresolved Git conflict markers in
package.json's peerDependencies by removing the <<<<<<<, =======, and >>>>>>>
markers and choosing the correct dependency entry for `@capacitor-plus/core` and
`@capacitor/core` (or consolidating to a single `@capacitor/core` version), ensuring
the peerDependencies object contains valid JSON keys and a single version for
each package; update the peerDependencies block that currently contains the
conflict markers so it is syntactically valid JSON and consistent with the
intended `@capacitor` versions used elsewhere in the project.
- Around line 2-14: Remove the Git conflict markers and resolve the package.json
entries by keeping the Capacitor+ fork identity fields (set "name" to
"@capacitor-plus/android", "description" and "homepage" and "author" to the
Capgo values) but update the "version" to the newer upstream version (use
"8.3.1") so the file is valid JSON and reflects the fork with the upstream
version bump; ensure you remove the lines with <<<<<<<, =======, and >>>>>>> and
leave a single clean JSON object containing the referenced keys ("name",
"version", "description", "homepage", "author").
In `@cli/package.json`:
- Around line 2-14: The package.json conflict must be resolved by keeping the
fork's metadata (restore "name": "@capacitor-plus/cli" plus the fork-specific
"version", "description", "homepage", and "author" values) and removing the Git
conflict markers so the file is valid JSON; ensure you do not accept the
upstream values ("@capacitor/cli", upstream version, homepage, or author) and
verify the resulting JSON is syntactically valid (no <<<<<<<, =======, >>>>>>>)
and matches the fork's fields used elsewhere in the repo.
In `@cli/src/declarations.ts`:
- Line 535: Update the SPM warning text that currently reads "If you need to set
this property to 6.0 or higher, make sure to throughrouly test your iOS app."
and correct the typo by changing "throughrouly" to "thoroughly" in the
declaration where that string/constant is defined (the warning message
containing "If you need to set this property to 6.0 or higher..."). Ensure the
updated string is used wherever that SPM warning message is referenced.
In `@cli/src/definitions.ts`:
- Around line 15-16: The PackageManager union has inconsistent casing; update
the exported type PackageManager to use a consistent PascalCase naming (e.g.,
'CocoaPods' | 'Bundler' | 'SPM') and update any code that constructs or compares
against PackageManager values to use the new normalized strings (search for
usages of PackageManager, occurrences of 'Cocoapods' and 'bundler' and replace
them accordingly) so comparisons and runtime values remain consistent.
In `@cli/src/tasks/update.ts`:
- Around line 48-62: The loop in addUpdateChecks overwrites checks with checks =
await getCommonChecks(config) instead of accumulating results, making it
fragile; change it to append the returned checks from getCommonChecks(config)
(e.g., use checks.push(...await getCommonChecks(config)) or checks =
checks.concat(await getCommonChecks(config))) so multiple platforms can
contribute checks without clobbering previous entries, and keep the existing
continue/throw logic for other platform branches.
In `@cli/src/util/spm.ts`:
- Around line 100-108: Resolve the merge conflict by accepting the upstream
changes: replace the call to getMajorMinoriOSVersion with getMajoriOSVersion
(update the import from ../ios/common accordingly), add the upstream
declarations for packageTraits and swiftToolsVersion (use
config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {} and default
swiftToolsVersion to '5.9'), and ensure the template literal uses
swiftToolsVersion so the variable is defined for packageSwiftText.
In `@core/package.json`:
- Around line 2-14: Remove the Git merge conflict markers and choose the
Capacitor+ metadata variant for the package.json fields: replace the conflict
block containing "<<<<<<< HEAD" / "=======" / ">>>>>>> upstream/main" with a
valid JSON object that uses the "@capacitor-plus/core" values for the "name",
"version", "description", "homepage", and "author" keys (same resolution as done
for android/package.json), ensuring the file is valid JSON so npm install/CI
succeeds.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: contains a stray
semicolon before the opening brace which causes a syntax error; remove the
semicolon after the parameter list in the implementation of - (NSArray *
_Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue so the opening brace immediately follows the parameter
list.
In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift`:
- Around line 89-109: Fix the typo in the docstring ("multiplart" ->
"multipart") and make extractBoundary(from:) consistent with Android by trimming
whitespace around the extracted boundary; in the private func
extractBoundary(from contentType: String) locate where the boundary substring is
computed (variable boundary), trim leading/trailing whitespace from that
substring before removing surrounding quotes, and then return the cleaned String
so inputs like `boundary= value` yield "value".
In `@ios/package.json`:
- Around line 36-41: Merge conflict markers left in package.json for the
dependencies block—remove the conflict markers and produce a valid JSON
dependencies object containing the correct entries: keep "@capacitor-plus/core"
(e.g. "^8.0.0") if your project needs it and a single "@capacitor/core" entry
(choose the intended version, e.g. "^8.3.0"), ensuring no duplicate keys and
that the resulting package.json parses as JSON; update the "@capacitor-core" and
"@capacitor-plus/core" entries accordingly.
- Around line 2-14: Remove the unresolved Git conflict markers (<<<<<<< HEAD,
=======, >>>>>>> upstream/main) and restore valid JSON by keeping the Capacitor+
variant from the HEAD block: set "name" to "@capacitor-plus/ios", "version" to
"8.0.8", "description" to the Capacitor+ description, and use the HEAD
"homepage" and "author" values; ensure commas and quoting are correct so
package.json is valid JSON with no leftover conflict tokens.
In `@lerna.json`:
- Around line 16-20: The lerna.json contains unresolved Git merge markers
(<<<<<<<, =======, >>>>>>>) around the "version" key; remove the conflict block
and collapse it to a single valid JSON entry for "version" (choose the correct
value, e.g., "8.3.1") so the file is valid JSON and no merge markers remain.
In `@package.json`:
- Around line 35-55: Remove the git conflict markers in package.json and produce
a single valid JSON devDependencies block that includes the tooling actually
referenced by package scripts: ensure "prettier-pretty-check" remains (since
scripts invoke it), include "prettier", "prettier-plugin-java", "eslint" and any
eslint plugins used (e.g., "eslint-plugin-import") and keep "tar", "rimraf",
"lerna", "semver", "swiftlint" and types like "@types/node" present; resolve
version choices consistently (pick the branch-appropriate versions or unify to a
single version) so npm install succeeds and then run a quick grep over
package.json scripts for names like prettier-pretty-check, prettier, eslint, tar
to confirm all referenced devDependencies exist.
---
Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-260: The changelog contains unresolved git merge markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing duplicated/corrupted
Android release notes; remove the merge markers and the duplicated block so only
the intended release history remains (choose and keep the correct section —
e.g., the upstream/main block with versions 8.3.1/8.3.0 etc.), ensure headings
and entries are deduplicated and consistently ordered, and save the cleaned
CHANGELOG.md before committing.
In `@CHANGELOG.md`:
- Around line 6-532: The changelog contains manual merge conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) in CHANGELOG.md; remove the
conflict block and restore the CI-generated content instead of hand-editing.
Revert any manual merges in CHANGELOG.md (remove the conflict markers and the
duplicated sections), then regenerate or restore the file using the repository's
automated changelog process (run the changelog generation script/workflow or
reset CHANGELOG.md to the CI/automation generated version) and commit the
regenerated file so the CI-managed source produces the final changelog; do not
commit manual edits to CHANGELOG.md.
In `@cli/CHANGELOG.md`:
- Around line 6-286: The changelog contains unresolved git merge conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) that duplicate and
corrupt release notes (e.g., sections starting with "## [8.0.8]" and "##
[8.3.1]"); remove the conflict markers and reconcile the duplicated sections
into a single coherent changelog by choosing the intended upstream content (or
merging the two lists), keeping only one set of version headings and entries and
ensuring formatting consistency.
In `@core/CHANGELOG.md`:
- Around line 6-163: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) that must be removed; open
CHANGELOG.md, decide how to combine the two blocks (either keep fork-specific
`@capacitor-plus/core` entries and upstream `@capacitor/core` entries as separate
sections with clear headers, or merge chronologically), delete the conflict
markers and the duplicate/undesired chunk, ensure headings like the
`@capacitor-plus/core` and `@capacitor/core` release lists are preserved and
labeled, and save a clean file with no remaining <<<<<<<, =======, or >>>>>>>
tokens so the changelog parses/render correctly.
In `@ios/CHANGELOG.md`:
- Around line 6-231: The changelog contains unresolved Git merge conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two release blocks
(e.g., the local 8.0.8..8.0.1 series and the upstream 8.3.1..8.0.1 series);
remove the conflict markers and produce a single coherent changelog by choosing
which block to keep or by merging entries (for example, retain the intended iOS
release history you want—references: versions "8.0.8" and "8.3.1" shown in the
diff—and ensure only one continuous series of release headings remains with no
<<<<<<<, =======, >>>>>>> markers).
---
Nitpick comments:
In @.github/workflows/needs-reply.yml:
- Line 8: Rename the workflow job currently named "build" to a descriptive name
that reflects its purpose (e.g., "close-stale-issues" or "needs-reply-cleanup")
so the job label accurately represents that it closes stale issues rather than
building artifacts; update the job key "build" to the chosen name wherever
referenced in the workflow (job definition and any job dependencies) to keep
identifiers consistent.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 313-319: The getThemeColor method is declared public but only used
internally; change its visibility to private by updating the method signature of
getThemeColor(Context context, int attrRes) to private, and ensure there are no
external references calling getThemeColor (update any internal callers if
needed).
In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`:
- Around line 315-346: The public static method extractBoundaryFromContentType
should defensively handle a null contentType to avoid NPEs for external callers:
add an initial null (and optionally empty/blank) check in
extractBoundaryFromContentType and return null immediately if contentType is
null/blank, then proceed with the existing logic; keep the rest of the method
unchanged so callers still get the unquoted, trimmed boundary when present.
In `@cli/src/tasks/migrate-spm.ts`:
- Around line 24-26: Add a brief inline comment above the cast/mutation to
explain why mutating the readonly Config via Writable<Config> is safe here:
state that this is a single-use migration command, the change is local to this
execution, and no other code relies on the original immutability during the
operation; reference the specific symbols config, configWritable
(Writable<Config>), and the subsequent call to update(configWritable as Config,
'ios', false) so future readers understand the intent and risk mitigation.
- Line 16: Replace the loose equality check in the conditional that reads the
package manager with a strict equality comparison: change the comparison that
tests (await config.ios.packageManager) == 'SPM' to use ===. Locate the
conditional that uses config.ios.packageManager in migrate-spm.ts (the if
statement shown) and update it to use strict equality (=== 'SPM') so it matches
the codebase convention and avoids type-coercion differences.
In `@cli/src/tasks/update.ts`:
- Around line 70-84: The deprecated updateChecks function currently pushes a
single check that uses a boolean OR (checkBundler(config) ||
checkCocoaPods(config)) which evaluates immediately to a boolean instead of
registering both check functions; change the logic inside updateChecks (for the
ios branch) to register both checks separately by adding two entries that invoke
checkBundler and checkCocoaPods (e.g., push a function for checkBundler(config)
and push another for checkCocoaPods(config)) so both checks run when executed;
keep the function name updateChecks and the surrounding control flow intact.
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the dead observer registration that listens for
Notification.Name(rawValue: "tmpViewControllerAppeared") and sets
self?.tmpWindow = nil (the observer installed around the tmpVCAppeared/tmpWindow
logic), because tmpWindow is never set and tmpVCAppeared is never posted; delete
the observer registration block that references tmpVCAppeared and tmpWindow and,
if desired, plan a follow-up to remove the deprecated tmpWindow and
tmpVCAppeared declarations entirely or document their retained API
compatibility.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 0dc9bcfd-b37f-4117-9efb-71970dbeb377
📒 Files selected for processing (54)
.github/ISSUE_TEMPLATE/config.yml.github/ISSUE_TEMPLATE/feature-request.yml.github/ionic-issue-bot.yml.github/workflows/needs-reply.yml.github/workflows/publish-ios.yml.github/workflows/test.ymlCHANGELOG.mdandroid/CHANGELOG.mdandroid/capacitor/src/main/assets/native-bridge.jsandroid/capacitor/src/main/java/com/getcapacitor/Bridge.javaandroid/capacitor/src/main/java/com/getcapacitor/BridgeActivity.javaandroid/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.javaandroid/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaandroid/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.javaandroid/package.jsoncli/CHANGELOG.mdcli/package.jsoncli/src/config.tscli/src/declarations.tscli/src/definitions.tscli/src/index.tscli/src/ios/build.tscli/src/ios/common.tscli/src/ios/doctor.tscli/src/ios/open.tscli/src/ios/run.tscli/src/ios/update.tscli/src/tasks/add.tscli/src/tasks/migrate-spm.tscli/src/tasks/migrate.tscli/src/tasks/run.tscli/src/tasks/sourcemaps.tscli/src/tasks/sync.tscli/src/tasks/update.tscli/src/util/livereload.tscli/src/util/spm.tscli/src/util/template.tscore/CHANGELOG.mdcore/native-bridge.tscore/package.jsoncore/src/core-plugins.tscore/system-bars.mdios-spm-template/App/CapApp-SPM/README.mdios/CHANGELOG.mdios/Capacitor/Capacitor/CAPBridgeProtocol.swiftios/Capacitor/Capacitor/CAPBridgedJSTypes.hios/Capacitor/Capacitor/CAPBridgedJSTypes.mios/Capacitor/Capacitor/CapacitorBridge.swiftios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swiftios/Capacitor/Capacitor/assets/native-bridge.jsios/package.jsonlerna.jsonpackage.jsonscripts/pack-cli-assets.mjs
💤 Files with no reviewable changes (1)
- .github/ISSUE_TEMPLATE/feature-request.yml
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 | ||
| ref: 'main' |
There was a problem hiding this comment.
Hardcoded checkout ref can publish the wrong code revision.
At Line 24, ref: 'main' ignores the triggering commit/ref. For workflow_call (and even manual dispatch on non-main refs), this can publish code that was never validated in that run.
🔧 Proposed fix
- uses: actions/checkout@v5
with:
fetch-depth: 0
- ref: 'main'
+ ref: ${{ github.sha }}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: 'main' | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: ${{ github.sha }} |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/publish-ios.yml around lines 21 - 24, The checkout step
currently pins ref: 'main' which ignores the triggering commit; update the
actions/checkout@v5 usage (the checkout step) to use the triggering ref
instead—replace the hardcoded ref with the appropriate runtime ref (e.g.,
github.ref or the caller-provided ref input for this reusable workflow) so the
workflow checks out the exact commit that triggered the run and not always main;
keep fetch-depth: 0 as-is.
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | ||
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | ||
| .build(); | ||
|
|
||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | ||
| Insets safeAreaInsets = calcSafeAreaInsets(newInsets); | ||
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); | ||
| } |
There was a problem hiding this comment.
Bug: Safe area CSS will always be zero in non-passthrough branch.
calcSafeAreaInsets(newInsets) is called with newInsets which has system bars and cutout explicitly set to Insets.of(0, 0, 0, 0) on line 219. Since calcSafeAreaInsets queries WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() from the passed insets, it will always return zeros.
Compare to line 190 which correctly uses the original insets object.
🐛 Proposed fix
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
- Insets safeAreaInsets = calcSafeAreaInsets(newInsets);
+ Insets safeAreaInsets = calcSafeAreaInsets(insets);
injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | |
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | |
| .build(); | |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | |
| Insets safeAreaInsets = calcSafeAreaInsets(newInsets); | |
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); | |
| } | |
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | |
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | |
| .build(); | |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | |
| Insets safeAreaInsets = calcSafeAreaInsets(insets); | |
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`
around lines 218 - 225, The safe-area calculation is using the modified
WindowInsetsCompat newInsets (which zeroes systemBars/displayCutout) so
calcSafeAreaInsets returns all zeros; change the call in the non-passthrough
branch to use the original insets object when calling calcSafeAreaInsets (leave
the creation of newInsets as-is for the passthrough handling) and then pass the
computed Insets to injectSafeAreaCSS (i.e., call calcSafeAreaInsets(insets)
instead of calcSafeAreaInsets(newInsets) before injectSafeAreaCSS).
| private Integer getWebViewMajorVersion() { | ||
| PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); | ||
| if (info != null && info.versionName != null) { | ||
| String[] versionSegments = info.versionName.split("\\."); | ||
| return Integer.valueOf(versionSegments[0]); | ||
| } | ||
|
|
||
| return 0; | ||
| } |
There was a problem hiding this comment.
Missing exception handling and repeated lookups.
-
Integer.valueOf(versionSegments[0])will throwNumberFormatExceptionif the version string is malformed (e.g., doesn't start with a digit). -
This method is called on every inset application (line 179) and again via
getBottomInset(line 332). The WebView version never changes at runtime, so the result should be cached.
🛠️ Proposed fix
Add a cached field and wrap parsing in try-catch:
+ private Integer cachedWebViewMajorVersion = null;
+
private Integer getWebViewMajorVersion() {
+ if (cachedWebViewMajorVersion != null) {
+ return cachedWebViewMajorVersion;
+ }
+
PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext());
if (info != null && info.versionName != null) {
- String[] versionSegments = info.versionName.split("\\.");
- return Integer.valueOf(versionSegments[0]);
+ try {
+ String[] versionSegments = info.versionName.split("\\.");
+ if (versionSegments.length > 0) {
+ cachedWebViewMajorVersion = Integer.valueOf(versionSegments[0]);
+ return cachedWebViewMajorVersion;
+ }
+ } catch (NumberFormatException e) {
+ // Fall through to return default
+ }
}
+ cachedWebViewMajorVersion = 0;
return 0;
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private Integer getWebViewMajorVersion() { | |
| PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); | |
| if (info != null && info.versionName != null) { | |
| String[] versionSegments = info.versionName.split("\\."); | |
| return Integer.valueOf(versionSegments[0]); | |
| } | |
| return 0; | |
| } | |
| private Integer cachedWebViewMajorVersion = null; | |
| private Integer getWebViewMajorVersion() { | |
| if (cachedWebViewMajorVersion != null) { | |
| return cachedWebViewMajorVersion; | |
| } | |
| PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); | |
| if (info != null && info.versionName != null) { | |
| try { | |
| String[] versionSegments = info.versionName.split("\\."); | |
| if (versionSegments.length > 0) { | |
| cachedWebViewMajorVersion = Integer.valueOf(versionSegments[0]); | |
| return cachedWebViewMajorVersion; | |
| } | |
| } catch (NumberFormatException e) { | |
| // Fall through to return default | |
| } | |
| } | |
| cachedWebViewMajorVersion = 0; | |
| return 0; | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`
around lines 321 - 329, getWebViewMajorVersion currently re-parses the WebView
version on every call and will throw NumberFormatException for malformed version
strings; add a private cached field (e.g., cachedWebViewMajorVersion) to store
the computed Integer and return it on subsequent calls, and wrap the parsing
logic in a try-catch to catch NumberFormatException (and any NPE) so you set and
return a safe default (0) on error; also avoid repeated lookups by only calling
WebViewCompat.getCurrentWebViewPackage once when computing the cached value in
getWebViewMajorVersion.
| /** | ||
| * @deprecated This method may return incorrect headers in concurrent range requests. | ||
| * <p> | ||
| * Use {@link #buildDefaultResponseHeaders()} instead, which returns a copy of the map. | ||
| * </p> | ||
| * This method will be removed in a future major version of Capacitor. | ||
| * </p> | ||
| */ | ||
| @Deprecated(forRemoval = true) // adjust version as appropriate | ||
| public Map<String, String> getResponseHeaders() { | ||
| return responseHeaders; | ||
| } |
There was a problem hiding this comment.
Malformed Javadoc: extra closing </p> tag on line 137.
The Javadoc has an unmatched </p> tag. Line 136 closes the paragraph started on line 133, but line 137 has an orphan </p>.
📝 Proposed fix
/**
* `@deprecated` This method may return incorrect headers in concurrent range requests.
* <p>
* Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map.
* </p>
- * This method will be removed in a future major version of Capacitor.
- * </p>
+ * <p>
+ * This method will be removed in a future major version of Capacitor.
+ * </p>
*/
`@Deprecated`(forRemoval = true) // adjust version as appropriate📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| /** | |
| * @deprecated This method may return incorrect headers in concurrent range requests. | |
| * <p> | |
| * Use {@link #buildDefaultResponseHeaders()} instead, which returns a copy of the map. | |
| * </p> | |
| * This method will be removed in a future major version of Capacitor. | |
| * </p> | |
| */ | |
| @Deprecated(forRemoval = true) // adjust version as appropriate | |
| public Map<String, String> getResponseHeaders() { | |
| return responseHeaders; | |
| } | |
| /** | |
| * `@deprecated` This method may return incorrect headers in concurrent range requests. | |
| * <p> | |
| * Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map. | |
| * </p> | |
| * <p> | |
| * This method will be removed in a future major version of Capacitor. | |
| * </p> | |
| */ | |
| `@Deprecated`(forRemoval = true) // adjust version as appropriate | |
| public Map<String, String> getResponseHeaders() { | |
| return responseHeaders; | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 131 - 142, The Javadoc for WebViewLocalServer.getResponseHeaders()
contains an extra closing </p> tag; edit the Javadoc for the
getResponseHeaders() method (and its `@deprecated` block that references
buildDefaultResponseHeaders()) to remove the orphan </p> so the paragraphs are
properly balanced and the Javadoc compiles cleanly, keeping the note that
callers should use buildDefaultResponseHeaders() instead.
| <<<<<<< HEAD | ||
| "name": "@capacitor-plus/android", | ||
| "version": "8.0.8", | ||
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| ======= | ||
| "name": "@capacitor/android", | ||
| "version": "8.3.1", | ||
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capacitorjs.com", | ||
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve merge conflict markers - blocking CI pipeline.
The file contains unresolved Git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) that make the JSON invalid. This is blocking npm install as confirmed by the pipeline failure.
For the Capacitor+ fork, you likely want to keep the fork's identity while updating the version:
🔧 Suggested resolution (keeping Capacitor+ identity)
{
-<<<<<<< HEAD
"name": "@capacitor-plus/android",
- "version": "8.0.8",
+ "version": "8.3.1",
"description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
"homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
"author": "Capgo Team <support@capgo.app> (https://capgo.app)",
-=======
- "name": "@capacitor/android",
- "version": "8.3.1",
- "description": "Capacitor: Cross-platform apps with JavaScript and the web",
- "homepage": "https://capacitorjs.com",
- "author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
->>>>>>> upstream/main
"license": "MIT",🧰 Tools
🪛 Biome (2.4.11)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/package.json` around lines 2 - 14, Remove the Git conflict markers
and resolve the package.json entries by keeping the Capacitor+ fork identity
fields (set "name" to "@capacitor-plus/android", "description" and "homepage"
and "author" to the Capgo values) but update the "version" to the newer upstream
version (use "8.3.1") so the file is valid JSON and reflects the fork with the
upstream version bump; ensure you remove the lines with <<<<<<<, =======, and
>>>>>>> and leave a single clean JSON object containing the referenced keys
("name", "version", "description", "homepage", "author").
|
|
||
| /** | ||
| Extracts the boundary value of the `content-type` header for multiplart/form-data requests, if provided | ||
| The boundary value might be surrounded by double quotes (") which will be stripped away. | ||
| */ | ||
| private func extractBoundary(from contentType: String) -> String? { | ||
| if let boundaryRange = contentType.range(of: "boundary=") { | ||
| var boundary = contentType[boundaryRange.upperBound...] | ||
| if let endRange = boundary.range(of: ";") { | ||
| boundary = boundary[..<endRange.lowerBound] | ||
| } | ||
|
|
||
| if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") { | ||
| return String(boundary.dropFirst().dropLast()) | ||
| } else { | ||
| return String(boundary) | ||
| } | ||
| } | ||
|
|
||
| return nil | ||
| } |
There was a problem hiding this comment.
Typo in docstring and minor inconsistency with Android.
- Line 91: "multiplart" should be "multipart"
- Unlike the Android counterpart which calls
.trim()on the boundary, this implementation doesn't trim whitespace. Edge cases likeboundary= valuewould extract" value"(with leading space) on iOS but"value"on Android.
✏️ Suggested fix
/**
- Extracts the boundary value of the `content-type` header for multiplart/form-data requests, if provided
+ Extracts the boundary value of the `content-type` header for multipart/form-data requests, if provided
The boundary value might be surrounded by double quotes (") which will be stripped away.
*/
private func extractBoundary(from contentType: String) -> String? {
if let boundaryRange = contentType.range(of: "boundary=") {
var boundary = contentType[boundaryRange.upperBound...]
if let endRange = boundary.range(of: ";") {
boundary = boundary[..<endRange.lowerBound]
}
+ let trimmedBoundary = boundary.trimmingCharacters(in: .whitespaces)
- if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") {
- return String(boundary.dropFirst().dropLast())
+ if trimmedBoundary.hasPrefix("\"") && trimmedBoundary.hasSuffix("\"") {
+ return String(trimmedBoundary.dropFirst().dropLast())
} else {
- return String(boundary)
+ return String(trimmedBoundary)
}
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift` around lines 89 -
109, Fix the typo in the docstring ("multiplart" -> "multipart") and make
extractBoundary(from:) consistent with Android by trimming whitespace around the
extracted boundary; in the private func extractBoundary(from contentType:
String) locate where the boundary substring is computed (variable boundary),
trim leading/trailing whitespace from that substring before removing surrounding
quotes, and then return the cleaned String so inputs like `boundary= value`
yield "value".
| <<<<<<< HEAD | ||
| "name": "@capacitor-plus/ios", | ||
| "version": "8.0.8", | ||
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| ======= | ||
| "name": "@capacitor/ios", | ||
| "version": "8.3.1", | ||
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capacitorjs.com", | ||
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve merge conflict markers - blocking CI pipeline.
Same issue as other package.json files - unresolved Git merge conflict markers make the JSON invalid.
🔧 Suggested resolution (keeping Capacitor+ identity)
{
-<<<<<<< HEAD
"name": "@capacitor-plus/ios",
- "version": "8.0.8",
+ "version": "8.3.1",
"description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
"homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
"author": "Capgo Team <support@capgo.app> (https://capgo.app)",
-=======
- "name": "@capacitor/ios",
- "version": "8.3.1",
- "description": "Capacitor: Cross-platform apps with JavaScript and the web",
- "homepage": "https://capacitorjs.com",
- "author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
->>>>>>> upstream/main
"license": "MIT",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <<<<<<< HEAD | |
| "name": "@capacitor-plus/ios", | |
| "version": "8.0.8", | |
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | |
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | |
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | |
| ======= | |
| "name": "@capacitor/ios", | |
| "version": "8.3.1", | |
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | |
| "homepage": "https://capacitorjs.com", | |
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | |
| >>>>>>> upstream/main | |
| { | |
| "name": "@capacitor-plus/ios", | |
| "version": "8.3.1", | |
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | |
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | |
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | |
| "license": "MIT", |
🧰 Tools
🪛 Biome (2.4.11)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/package.json` around lines 2 - 14, Remove the unresolved Git conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and restore valid JSON by
keeping the Capacitor+ variant from the HEAD block: set "name" to
"@capacitor-plus/ios", "version" to "8.0.8", "description" to the Capacitor+
description, and use the HEAD "homepage" and "author" values; ensure commas and
quoting are correct so package.json is valid JSON with no leftover conflict
tokens.
| <<<<<<< HEAD | ||
| "@capacitor-plus/core": "^8.0.0", | ||
| "@capacitor/core": "^8.0.0" | ||
| ======= | ||
| "@capacitor/core": "^8.3.0" | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve peerDependencies merge conflict.
🔧 Suggested resolution
"peerDependencies": {
-<<<<<<< HEAD
"@capacitor-plus/core": "^8.0.0",
- "@capacitor/core": "^8.0.0"
-=======
- "@capacitor/core": "^8.3.0"
->>>>>>> upstream/main
+ "@capacitor/core": "^8.3.0"
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <<<<<<< HEAD | |
| "@capacitor-plus/core": "^8.0.0", | |
| "@capacitor/core": "^8.0.0" | |
| ======= | |
| "@capacitor/core": "^8.3.0" | |
| >>>>>>> upstream/main | |
| "peerDependencies": { | |
| "@capacitor-plus/core": "^8.0.0", | |
| "@capacitor/core": "^8.3.0" | |
| }, |
🧰 Tools
🪛 Biome (2.4.11)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: unexpected character <
(parse)
[error] 36-36: String values must be double quoted.
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 39-39: unexpected character =
(parse)
[error] 40-40: End of file expected
(parse)
[error] 40-40: End of file expected
(parse)
[error] 40-40: End of file expected
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: unexpected character >
(parse)
[error] 41-41: String values must be double quoted.
(parse)
[error] 41-41: unexpected character /
(parse)
[error] 41-41: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/package.json` around lines 36 - 41, Merge conflict markers left in
package.json for the dependencies block—remove the conflict markers and produce
a valid JSON dependencies object containing the correct entries: keep
"@capacitor-plus/core" (e.g. "^8.0.0") if your project needs it and a single
"@capacitor/core" entry (choose the intended version, e.g. "^8.3.0"), ensuring
no duplicate keys and that the resulting package.json parses as JSON; update the
"@capacitor-core" and "@capacitor-plus/core" entries accordingly.
| <<<<<<< HEAD | ||
| "version": "8.0.8", | ||
| ======= | ||
| "version": "8.3.1", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve the leftover merge markers before merging.
lerna.json is invalid JSON in its current state, so any tooling that reads it will fail until this conflict block is collapsed to a single version entry.
🩹 Minimal fix
-<<<<<<< HEAD
- "version": "8.0.8",
-=======
"version": "8.3.1",
->>>>>>> upstream/main📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <<<<<<< HEAD | |
| "version": "8.0.8", | |
| ======= | |
| "version": "8.3.1", | |
| >>>>>>> upstream/main | |
| "version": "8.3.1", |
🧰 Tools
🪛 Biome (2.4.11)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: String values must be double quoted.
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-18: End of file expected
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-20: End of file expected
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lerna.json` around lines 16 - 20, The lerna.json contains unresolved Git
merge markers (<<<<<<<, =======, >>>>>>>) around the "version" key; remove the
conflict block and collapse it to a single valid JSON entry for "version"
(choose the correct value, e.g., "8.3.1") so the file is valid JSON and no merge
markers remain.
| <<<<<<< HEAD | ||
| "@types/node": "^24.10.1", | ||
| "@types/tar": "^6.1.2", | ||
| "eslint": "^8.57.1", | ||
| "eslint-plugin-import": "^2.31.0", | ||
| ======= | ||
| "@types/node": "18.18.6", | ||
| "eslint": "^8.57.0", | ||
| >>>>>>> upstream/main | ||
| "lerna": "^7.1.3", | ||
| "prettier": "^3.6.2", | ||
| "prettier-plugin-java": "^2.7.7", | ||
| "rimraf": "^6.1.0", | ||
| "semver": "^7.3.7", | ||
| "swiftlint": "^2.0.0", | ||
| <<<<<<< HEAD | ||
| "tar": "^6.1.11", | ||
| "prettier-pretty-check": "^0.2.0" | ||
| ======= | ||
| "tar": "^7.5.3" | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve this merge block and keep dependencies aligned with the scripts.
This conflict is already breaking npm install, and the resolution cannot just take the upstream side wholesale because Line 22 still invokes prettier-pretty-check while that dependency is removed in this branch of the conflict. Collapse this to valid JSON and make sure the final devDependency set still satisfies the existing scripts.
🧰 Tools
🪛 Biome (2.4.11)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: String values must be double quoted.
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-40: End of file expected
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-43: End of file expected
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character /
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-50: End of file expected
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 35 - 55, Remove the git conflict markers in
package.json and produce a single valid JSON devDependencies block that includes
the tooling actually referenced by package scripts: ensure
"prettier-pretty-check" remains (since scripts invoke it), include "prettier",
"prettier-plugin-java", "eslint" and any eslint plugins used (e.g.,
"eslint-plugin-import") and keep "tar", "rimraf", "lerna", "semver", "swiftlint"
and types like "@types/node" present; resolve version choices consistently (pick
the branch-appropriate versions or unify to a single version) so npm install
succeeds and then run a quick grep over package.json scripts for names like
prettier-pretty-check, prettier, eslint, tar to confirm all referenced
devDependencies exist.
Merge Conflict Resolution Required
The automatic sync of the
plusbranch with upstream main encountered merge conflicts.What happened
Action needed: Review the branch and resolve any remaining concerns before merging.
This PR was created automatically by the Capacitor+ sync workflow
Summary by CodeRabbit
New Features
Bug Fixes
Documentation