Skip to content

Fix Array defaults bug in Vite-plugin#224

Merged
yamcodes merged 2 commits into
mainfrom
fix-array-defaults-bug-vite-plugin
Oct 13, 2025
Merged

Fix Array defaults bug in Vite-plugin#224
yamcodes merged 2 commits into
mainfrom
fix-array-defaults-bug-vite-plugin

Conversation

@yamcodes

@yamcodes yamcodes commented Oct 13, 2025

Copy link
Copy Markdown
Owner
  • Updated dependencies in pnpm-lock.yaml, including vitest and jsdom.
  • Added new environment variables (VITE_MY_NUMBER, VITE_MY_VAR, VITE_MY_BOOLEAN) to the Vite development environment.
  • Enhanced the Vite configuration to utilize the new environment variables.
  • Updated the App component to display the new environment variables.

These changes improve the development experience and ensure compatibility with the latest dependencies.

Related: #162 #163 #199

Summary by CodeRabbit

  • New Features

    • Added support for default values on array environment variables, including complex array types; can initialize to empty arrays.
    • Enabled mixed schemas combining string-based and type-based defaults.
    • Playground now displays example environment variables in the UI.
  • Bug Fixes

    • Resolved issue preventing array defaults from being accepted, improving validation while maintaining type safety.
  • Documentation

    • Documented array defaults in the Vite plugin with example usage.
  • Chores

    • Added a script to manage changesets.
    • Updated playground configuration to include new example environment variables.

…round

- Updated dependencies in pnpm-lock.yaml, including vitest and jsdom.
- Added new environment variables (VITE_MY_NUMBER, VITE_MY_VAR, VITE_MY_BOOLEAN) to the Vite development environment.
- Enhanced the Vite configuration to utilize the new environment variables.
- Updated the App component to display the new environment variables.

These changes improve the development experience and ensure compatibility with the latest dependencies.
@vercel

vercel Bot commented Oct 13, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Preview Comments Updated (UTC)
arkenv Skipped Skipped Oct 13, 2025 2:37pm

@changeset-bot

changeset-bot Bot commented Oct 13, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a428471

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@arkenv/vite-plugin Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added docs Adds or changes documentation, or acts as documentation in and of itself @arkenv/vite-plugin Issues or Pull Requests involving the Vite plugin for ArkEnv labels Oct 13, 2025
@coderabbitai

coderabbitai Bot commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Updates the Vite playground to define and render new VITE_* env vars, adds dependencies for env typing/validation, and adjusts the plugin’s TypeScript generics to accept broader schemas. Adds a Changeset note documenting array default support. Also adds a scripts entry in the plugin package.json.

Changes

Cohort / File(s) Summary
Docs: Changeset note
\.changeset/famous-animals-thank.md
Adds documentation about array defaults via type().default() and relaxed type constraints; includes examples.
Playground env files
apps/playgrounds/vite/.env.development, apps/playgrounds/vite/.env.production
Adds VITE_MY_VAR, VITE_MY_NUMBER, VITE_MY_BOOLEAN entries; retains existing keys.
Playground config and app
apps/playgrounds/vite/vite.config.ts, apps/playgrounds/vite/src/App.tsx
Config imports type from arkenv, replaces PORT with three VITE_* schema entries, parsing number/boolean via pipe; App renders the three env values and their JS types.
Playground dependencies
apps/playgrounds/vite/package.json
Adds arkenv, arktype to dependencies and @julr/vite-plugin-validate-env to devDependencies.
Vite plugin typing
packages/vite-plugin/src/index.ts
Broadens generic constraint from `Record<string, string
Vite plugin scripts
packages/vite-plugin/package.json
Adds changeset script; no runtime impact.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Dev as Developer
  participant Vite as Vite Build
  participant Plugin as @arkenv/vite-plugin
  participant ArkType as ArkType/arkenv type()
  participant Env as process.env

  Dev->>Vite: run dev/build
  Vite->>Plugin: initialize with EnvSchema<T>
  Plugin->>Env: read VITE_* variables
  Plugin->>ArkType: validate/parse with type() [+ defaults]
  ArkType-->>Plugin: parsed values (string/number/boolean/array)
  Plugin-->>Vite: define import.meta.env entries
  Vite-->>Dev: bundle with injected env values

  note over ArkType,Plugin: Defaults may be provided via type().default(() => ...)<br/>Including array defaults like string[]
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • Arkenv default export #147 — Adjusts arkenv public exports/types aligned with importing type and broader typing used by the Vite plugin.
  • Expose type function #139 — Changes around exposing/importing type from arkenv, matching this PR’s new type import and usage.

Suggested labels

example, arkenv

Poem

A nibble of envs, a whisker of types,
I hop through configs and validate pipes.
Arrays get defaults—how lovely, how neat!
VITE snacks for builds, a crunchy treat.
Thump-thump, ship it—quick little feet! 🐇✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title clearly states that the pull request fixes an array defaults bug in the Vite plugin, which directly reflects the documentation and type constraint changes for array defaults introduced in this changeset.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix-array-defaults-bug-vite-plugin

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

- Introduced VITE_MY_NUMBER, VITE_MY_VAR, and VITE_MY_BOOLEAN to the Vite production environment configuration.
- These additions enhance the flexibility and configurability of the Vite playground setup.

This update improves the development experience by allowing for more dynamic environment configurations.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
apps/playgrounds/vite/.env.development (1)

2-4: LGTM! Environment variables properly defined.

The three new VITE-prefixed variables are correctly configured for client-side exposure in Vite. The values are appropriate for a playground/demo environment.

The static analysis tool suggests two optional style improvements:

  1. Add a blank line at the end of the file
  2. Alphabetically order the keys (VITE_MY_BOOLEAN before VITE_MY_NUMBER)

Apply this diff if you'd like to address the style hints:

 PORT=1234
+VITE_MY_BOOLEAN=true
 VITE_MY_NUMBER=123
 VITE_MY_VAR=hey
-VITE_MY_BOOLEAN=true
+
apps/playgrounds/vite/.env.production (1)

2-4: LGTM! Production environment variables match development.

The environment variables are correctly mirrored from the development configuration, ensuring consistency across environments.

The same optional style improvements apply here:

 PORT=1234
+VITE_MY_BOOLEAN=true
 VITE_MY_NUMBER=123
 VITE_MY_VAR=hey
-VITE_MY_BOOLEAN=true
+
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b6b8828 and a428471.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • .changeset/famous-animals-thank.md (1 hunks)
  • apps/playgrounds/vite/.env.development (1 hunks)
  • apps/playgrounds/vite/.env.production (1 hunks)
  • apps/playgrounds/vite/package.json (1 hunks)
  • apps/playgrounds/vite/src/App.tsx (1 hunks)
  • apps/playgrounds/vite/vite.config.ts (1 hunks)
  • packages/vite-plugin/package.json (1 hunks)
  • packages/vite-plugin/src/index.ts (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (7)
apps/playgrounds/vite/.env.development (2)
packages/vite-plugin/src/index.test.ts (3)
  • config (39-72)
  • vi (78-81)
  • vi (27-31)
examples/with-vite-react-ts/src/App.tsx (1)
  • App (6-34)
.changeset/famous-animals-thank.md (2)
packages/arkenv/src/type.test.ts (6)
  • envType (202-217)
  • envType (192-200)
  • it (4-218)
  • envType (86-108)
  • envType (29-47)
  • envType (154-169)
packages/arkenv/src/array-defaults-integration.test.ts (3)
  • Thing (5-12)
  • env (14-30)
  • it (4-45)
packages/vite-plugin/src/index.ts (1)
packages/arkenv/src/create-env.ts (1)
  • EnvSchema (7-7)
apps/playgrounds/vite/.env.production (2)
examples/with-vite-react-ts/src/App.tsx (1)
  • App (6-34)
packages/vite-plugin/src/index.test.ts (5)
  • line (149-152)
  • config (39-72)
  • vi (78-81)
  • vi (27-31)
  • vi (33-37)
apps/playgrounds/vite/src/App.tsx (1)
examples/with-vite-react-ts/src/App.tsx (2)
  • App (6-34)
  • setCount (21-21)
apps/playgrounds/vite/package.json (4)
packages/vite-plugin/src/index.test.ts (4)
  • config (39-72)
  • beforeEach (77-128)
  • line (149-152)
  • vi (33-37)
packages/arkenv/src/index.test.ts (3)
  • vi (65-81)
  • vi (25-35)
  • vi (37-47)
packages/arkenv/src/type.test.ts (1)
  • it (4-218)
packages/arkenv/src/create-env.test.ts (1)
  • env (88-99)
apps/playgrounds/vite/vite.config.ts (2)
packages/vite-plugin/src/index.ts (1)
  • arkenv (10-19)
packages/arkenv/src/type.ts (1)
  • type (3-3)
🪛 dotenv-linter (3.3.0)
apps/playgrounds/vite/.env.development

[warning] 4-4: [EndingBlankLine] No blank line at the end of the file

(EndingBlankLine)


[warning] 4-4: [UnorderedKey] The VITE_MY_BOOLEAN key should go before the VITE_MY_NUMBER key

(UnorderedKey)

apps/playgrounds/vite/.env.production

[warning] 4-4: [UnorderedKey] The VITE_MY_BOOLEAN key should go before the VITE_MY_NUMBER key

(UnorderedKey)

🔇 Additional comments (6)
packages/vite-plugin/package.json (1)

52-53: LGTM! Scripts properly delegate to workspace root.

The new scripts follow the established monorepo pattern of delegating to workspace-level commands. This maintains consistency across packages.

apps/playgrounds/vite/package.json (1)

15-16: LGTM! Dependencies correctly added for environment handling.

The new dependencies are appropriate:

  • arkenv and arktype enable the type-safe environment variable configuration demonstrated in vite.config.ts
  • @julr/vite-plugin-validate-env provides additional validation capabilities
  • The arktype version matches the peer dependency requirement in the plugin

Also applies to: 21-21

.changeset/famous-animals-thank.md (1)

1-35: LGTM! Changeset documentation is clear and comprehensive.

The changeset effectively documents:

  • The problem (overly restrictive type constraints)
  • The solution (accepting any string-keyed record with ArkType validation)
  • Usage examples showing array defaults
  • Reference to the related core library fix

The example code demonstrates the key feature clearly and aligns with the PR objectives.

apps/playgrounds/vite/src/App.tsx (1)

31-43: Verify the environment variable types at runtime.

The UI correctly displays the environment variables and their types. However, note that Vite's import.meta.env typically exposes all VITE_* variables as strings unless explicitly transformed.

Looking at the plugin implementation (packages/vite-plugin/src/index.ts), the createEnv call validates the schema during the config hook but doesn't transform the values injected into import.meta.env. This means:

  • VITE_MY_NUMBER will be the string "123" (type: string)
  • VITE_MY_BOOLEAN will be the string "true" (type: string)
  • VITE_MY_VAR will be "hey" (type: string)

The parsing logic in vite.config.ts (lines 12-13) validates the schema but doesn't affect the runtime values exposed to the client.

Run the dev server and verify the displayed types in the browser. If they're all strings (as expected), consider updating the config to use Vite's define option to inject the parsed values, or document this behavior for clarity.

apps/playgrounds/vite/vite.config.ts (1)

3-3: LGTM! Schema definitions are well-structured.

The type import and schema definitions follow arkenv patterns correctly:

  • String type for VITE_MY_VAR
  • Parsing logic for numeric and boolean values using .pipe()

Note that this plugin validates the environment schema during the config phase but doesn't transform the values exposed to the client code via import.meta.env. The VITE_* variables will still be strings at runtime in the browser.

If you need the parsed types in the client code, consider using Vite's define option to inject the transformed values:

export default defineConfig({
  define: {
    'import.meta.env.VITE_MY_NUMBER': 123,
    'import.meta.env.VITE_MY_BOOLEAN': true,
  },
  plugins: [
    react(),
    arkenv({
      VITE_MY_VAR: "string",
      VITE_MY_NUMBER: type("string").pipe((str) => Number.parseInt(str, 10)),
      VITE_MY_BOOLEAN: type("string").pipe((str) => str === "true"),
    }),
  ],
});

Alternatively, if this is intentional (validation-only), consider documenting this behavior.

Also applies to: 11-13

packages/vite-plugin/src/index.ts (1)

5-12: LGTM! Type constraint correctly relaxed to support array defaults.

The change from Record<string, string | undefined> to Record<string, unknown> is the key fix that enables array defaults using type("array[]").default(() => [...]) syntax. The TODO comment appropriately acknowledges this is pragmatic rather than ideal.

This change:

  • Allows broader schema definitions (arrays, numbers, booleans with defaults)
  • Maintains type safety through ArkType's validation system
  • Preserves const-correctness with the const T generic parameter
  • Delegates type checking to ArkType's EnvSchema<T> type

The TODO is reasonable—finding a more precise type that matches ArkType's accepted schemas would be ideal but may require deep integration with ArkType's internal type system. The current approach is a pragmatic solution that unblocks the feature.

@yamcodes
yamcodes merged commit ecf9b64 into main Oct 13, 2025
16 of 17 checks passed
@yamcodes
yamcodes deleted the fix-array-defaults-bug-vite-plugin branch October 13, 2025 14:45
@arkenv-bot arkenv-bot Bot mentioned this pull request Oct 13, 2025
yamcodes pushed a commit that referenced this pull request Oct 13, 2025
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @arkenv/vite-plugin@0.0.14

### Patch Changes

- #### Support array defaults using `type().default()` syntax
_[`#224`](#224)
[`ecf9b64`](ecf9b64)
[@yamcodes](https://github.com/yamcodes)_

Fix to an issue where `type("array[]").default(() => [...])` syntax was
not accepted by the plugin due to overly restrictive type constraints.
The plugin now accepts any string-keyed record while still maintaining
type safety through ArkType's validation system.

    ##### New Features

- Array defaults to empty using `type("string[]").default(() => [])`
syntax
    -   Support for complex array types with defaults
    -   Mixed schemas combining string-based and type-based defaults

    ##### Example

    ```typescript
    // vite.config.ts
    import arkenv from "@arkenv/vite-plugin";
    import { type } from "arkenv";

    export default defineConfig({
      plugins: [
        arkenv({
ALLOWED_ORIGINS: type("string[]").default(() => ["localhost"]),
          FEATURE_FLAGS: type("string[]").default(() => []),
          PORT: "number.port",
        }),
      ],
    });
    ```

    > [!NOTE]
> This is the same fix as in [`arkenv@0.7.2` (the core
library)](https://github.com/yamcodes/arkenv/releases/tag/arkenv%400.7.2),
but for the Vite plugin.

- #### Fix `import.meta.env` not respecting morphed environment
variables _[`#227`](#227)
[`d41878f`](d41878f)
[@yamcodes](https://github.com/yamcodes)_

The Vite plugin now properly exposes transformed environment variables
through `import.meta.env`.

Previously, type transformations (`string → number`, `string → boolean`)
and default values were lost because the plugin only called
`createEnv()` without integrating the results with Vite's environment
system.

Now the plugin uses Vite's `define` option to expose the morphed values,
ensuring all schema transformations are respected.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
yamcodes pushed a commit that referenced this pull request Nov 10, 2025
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [@arkenv/vite-plugin](https://arkenv.js.org)
([source](https://redirect.github.com/yamcodes/arkenv)) | [`^0.0.10` ->
`^0.0.14`](https://renovatebot.com/diffs/npm/@arkenv%2fvite-plugin/0.0.10/0.0.14)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@arkenv%2fvite-plugin/0.0.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@arkenv%2fvite-plugin/0.0.10/0.0.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>yamcodes/arkenv (@&#8203;arkenv/vite-plugin)</summary>

###
[`v0.0.14`](https://redirect.github.com/yamcodes/arkenv/releases/tag/%40arkenv/vite-plugin%400.0.14)

[Compare
Source](https://redirect.github.com/yamcodes/arkenv/compare/@arkenv/vite-plugin@0.0.13...@arkenv/vite-plugin@0.0.14)

##### Patch Changes

- #### Support array defaults using `type().default()` syntax
*[`#224`](https://redirect.github.com/yamcodes/arkenv/pull/224)
[`ecf9b64`](https://redirect.github.com/yamcodes/arkenv/commit/ecf9b64a680d3af5c5786b288fda35608590f7a9)
[@&#8203;yamcodes](https://redirect.github.com/yamcodes)*

Fix to an issue where `type("array[]").default(() => [...])` syntax was
not accepted by the plugin due to overly restrictive type constraints.
The plugin now accepts any string-keyed record while still maintaining
type safety through ArkType's validation system.

  ##### New Features

- Array defaults to empty using `type("string[]").default(() => [])`
syntax
  - Support for complex array types with defaults
  - Mixed schemas combining string-based and type-based defaults

  ##### Example

  ```typescript
  // vite.config.ts
  import arkenv from "@&#8203;arkenv/vite-plugin";
  import { type } from "arkenv";

  export default defineConfig({
    plugins: [
      arkenv({
        ALLOWED_ORIGINS: type("string[]").default(() => ["localhost"]),
        FEATURE_FLAGS: type("string[]").default(() => []),
        PORT: "number.port",
      }),
    ],
  });
  ```

  > \[!NOTE]
> This is the same fix as in [`arkenv@0.7.2` (the core
library)](https://redirect.github.com/yamcodes/arkenv/releases/tag/arkenv%400.7.2),
but for the Vite plugin.

- #### Fix `import.meta.env` not respecting morphed environment
variables
*[`#227`](https://redirect.github.com/yamcodes/arkenv/pull/227)
[`d41878f`](https://redirect.github.com/yamcodes/arkenv/commit/d41878fe9cc2524f06ac2f0ef35f2f5ba58ee06b)
[@&#8203;yamcodes](https://redirect.github.com/yamcodes)*

The Vite plugin now properly exposes transformed environment variables
through `import.meta.env`.

Previously, type transformations (`string → number`, `string → boolean`)
and default values were lost because the plugin only called
`createEnv()` without integrating the results with Vite's environment
system.

Now the plugin uses Vite's `define` option to expose the morphed values,
ensuring all schema transformations are respected.

###
[`v0.0.13`](https://redirect.github.com/yamcodes/arkenv/releases/tag/%40arkenv/vite-plugin%400.0.13)

[Compare
Source](https://redirect.github.com/yamcodes/arkenv/compare/@arkenv/vite-plugin@0.0.12...@arkenv/vite-plugin@0.0.13)

##### Patch Changes

- #### Support Vite 2.x
*[`#212`](https://redirect.github.com/yamcodes/arkenv/pull/212)
[`bfe08f6`](https://redirect.github.com/yamcodes/arkenv/commit/bfe08f6d9f21352186420f0f68611840e164da52)
[@&#8203;yamcodes](https://redirect.github.com/yamcodes)*

Extended the supported Vite versions to include **2.9.18** through
**7.x** (inclusive).

Also, we've added the `vite-plugin` keyword to the `package.json`, and a
section in the `README.md` explaining why this plugin is a Vite only
plugin (and not a Rollup plugin).

<details><summary>Updated 1 dependency</summary>

<small>


[`e554e2b`](https://redirect.github.com/yamcodes/arkenv/commit/e554e2b41aab1b8e29d873982ea587c069f4732d)

</small>

- `arkenv@0.7.3`

</details>

###
[`v0.0.12`](https://redirect.github.com/yamcodes/arkenv/releases/tag/%40arkenv/vite-plugin%400.0.12)

[Compare
Source](https://redirect.github.com/yamcodes/arkenv/compare/@arkenv/vite-plugin@0.0.11...@arkenv/vite-plugin@0.0.12)

##### Patch Changes

<details><summary>Updated 1 dependency</summary>

<small>


[`e50dba1`](https://redirect.github.com/yamcodes/arkenv/commit/e50dba1f19418f8fc007dc786df1172067e3d07c)

</small>

- `arkenv@0.7.2`

</details>

###
[`v0.0.11`](https://redirect.github.com/yamcodes/arkenv/releases/tag/%40arkenv/vite-plugin%400.0.11)

[Compare
Source](https://redirect.github.com/yamcodes/arkenv/compare/@arkenv/vite-plugin@0.0.10...@arkenv/vite-plugin@0.0.11)

##### Patch Changes

<details><summary>Updated 1 dependency</summary>

<small>


[`221f9ef`](https://redirect.github.com/yamcodes/arkenv/commit/221f9efdef65691b0c5155b12ec460404dddbe82)
[`221f9ef`](https://redirect.github.com/yamcodes/arkenv/commit/221f9efdef65691b0c5155b12ec460404dddbe82)

</small>

- `arkenv@0.7.1`

</details>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "on friday" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/yamcodes/arkenv).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@coderabbitai coderabbitai Bot mentioned this pull request Dec 5, 2025
@yamcodes yamcodes mentioned this pull request Jan 1, 2026
@yamcodes yamcodes added this to the v1 milestone Jan 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

@arkenv/vite-plugin Issues or Pull Requests involving the Vite plugin for ArkEnv docs Adds or changes documentation, or acts as documentation in and of itself

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant