Full Code of solidjs/solid for AI

main a0524c066d8f cached
178 files
822.6 KB
228.5k tokens
924 symbols
1 requests
Download .txt
Showing preview only (874K chars total). Download the full file or copy to clipboard to get everything.
Repository: solidjs/solid
Branch: main
Commit: a0524c066d8f
Files: 178
Total size: 822.6 KB

Directory structure:
gitextract_kiwcvw3q/

├── .changeset/
│   ├── README.md
│   └── config.json
├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── main-ci.yml
├── .gitignore
├── .gitpod.yml
├── .nvmrc
├── .prettierrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── documentation/
│   └── resources/
│       └── examples.md
├── package.json
├── packages/
│   ├── babel-preset-solid/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── index.js
│   │   ├── package.json
│   │   └── test.js
│   ├── solid/
│   │   ├── .npmignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── babel.config.cjs
│   │   ├── bench/
│   │   │   ├── bench.cjs
│   │   │   ├── libraries/
│   │   │   │   ├── kairo.cjs
│   │   │   │   ├── preact.cjs
│   │   │   │   ├── rval-mod.cjs
│   │   │   │   ├── s-mod.cjs
│   │   │   │   ├── s.cjs
│   │   │   │   ├── sinuous-mod.cjs
│   │   │   │   ├── sinuous.cjs
│   │   │   │   ├── usignal.cjs
│   │   │   │   └── vuerx.cjs
│   │   │   ├── prototypes/
│   │   │   │   ├── message-noarray.cjs
│   │   │   │   ├── message.cjs
│   │   │   │   ├── queue-noarray.cjs
│   │   │   │   └── queue.cjs
│   │   │   └── results.md
│   │   ├── h/
│   │   │   ├── README.md
│   │   │   ├── jsx-dev-runtime/
│   │   │   │   └── package.json
│   │   │   ├── jsx-runtime/
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   └── index.ts
│   │   │   │   └── tsconfig.json
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── hyperscript.ts
│   │   │   │   └── index.ts
│   │   │   └── tsconfig.json
│   │   ├── html/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   └── lit.ts
│   │   │   └── tsconfig.json
│   │   ├── jsx-runtime.d.ts
│   │   ├── package.json
│   │   ├── rollup.config.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── reactive/
│   │   │   │   ├── array.ts
│   │   │   │   ├── observable.ts
│   │   │   │   ├── scheduler.ts
│   │   │   │   └── signal.ts
│   │   │   ├── render/
│   │   │   │   ├── Suspense.ts
│   │   │   │   ├── component.ts
│   │   │   │   ├── flow.ts
│   │   │   │   ├── hydration.ts
│   │   │   │   └── index.ts
│   │   │   └── server/
│   │   │       ├── index.ts
│   │   │       ├── reactive.ts
│   │   │       └── rendering.ts
│   │   ├── store/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   ├── modifiers.ts
│   │   │   │   ├── mutable.ts
│   │   │   │   ├── server.ts
│   │   │   │   └── store.ts
│   │   │   ├── test/
│   │   │   │   ├── modifiers.spec.ts
│   │   │   │   ├── mutable.spec.ts
│   │   │   │   ├── mutableWithClass.spec.tsx
│   │   │   │   └── store.spec.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── test/
│   │   │   ├── MessageChannel.ts
│   │   │   ├── array.spec.ts
│   │   │   ├── component.bench.ts
│   │   │   ├── component.spec.ts
│   │   │   ├── component.type-tests.ts
│   │   │   ├── dev.spec.ts
│   │   │   ├── external-source.spec.ts
│   │   │   ├── observable.spec.ts
│   │   │   ├── rendering.spec.ts
│   │   │   ├── resource.spec.ts
│   │   │   ├── resource.type-tests.ts
│   │   │   ├── scheduler.spec.ts
│   │   │   ├── signals.memo.spec.ts
│   │   │   ├── signals.spec.ts
│   │   │   └── signals.type-tests.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   ├── universal/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   └── universal.ts
│   │   │   └── tsconfig.json
│   │   ├── vite.config.mjs
│   │   └── web/
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── server/
│   │       │   ├── index.ts
│   │       │   └── server.ts
│   │       ├── src/
│   │       │   ├── client.ts
│   │       │   ├── core.ts
│   │       │   ├── index.ts
│   │       │   ├── jsx.ts
│   │       │   └── server-mock.ts
│   │       ├── storage/
│   │       │   ├── package.json
│   │       │   ├── src/
│   │       │   │   └── index.ts
│   │       │   ├── tsconfig.build.json
│   │       │   └── tsconfig.json
│   │       ├── test/
│   │       │   ├── context.spec.tsx
│   │       │   ├── dynamic.spec.tsx
│   │       │   ├── element.spec.tsx
│   │       │   ├── errorboundary.spec.tsx
│   │       │   ├── for.spec.tsx
│   │       │   ├── index.spec.tsx
│   │       │   ├── portal.spec.tsx
│   │       │   ├── server-mock.spec.tsx
│   │       │   ├── show.spec.tsx
│   │       │   ├── suspense.spec.tsx
│   │       │   └── switch.spec.tsx
│   │       ├── tsconfig.build.json
│   │       └── tsconfig.json
│   ├── solid-element/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── sample.jsx
│   │   ├── src/
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── solid-ssr/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── examples/
│   │   │   ├── .gitignore
│   │   │   ├── async/
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   ├── shared/
│   │   │   │   ├── src/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── App.js
│   │   │   │   │   │   ├── Home.js
│   │   │   │   │   │   ├── Profile/
│   │   │   │   │   │   │   ├── Profile.js
│   │   │   │   │   │   │   └── index.js
│   │   │   │   │   │   └── Settings.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── router.js
│   │   │   │   └── static/
│   │   │   │       └── styles.css
│   │   │   ├── ssg/
│   │   │   │   ├── export.js
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   ├── ssr/
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   └── stream/
│   │   │       ├── index.js
│   │   │       └── rollup.config.js
│   │   ├── package.json
│   │   └── static/
│   │       ├── index.cjs
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       ├── writeToDisk.cjs
│   │       └── writeToDisk.js
│   └── test-integration/
│       ├── CHANGELOG.md
│       ├── babel.config.cjs
│       ├── package.json
│       ├── test-imports.mjs
│       ├── tests/
│       │   └── downloaded.spec.ts
│       └── tsconfig.json
├── pnpm-workspace.yaml
├── tsconfig.json
├── tsconfig.test.json
└── turbo.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .changeset/README.md
================================================
# Changesets

Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)


================================================
FILE: .changeset/config.json
================================================
{
  "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json",
  "changelog": "@changesets/cli/changelog",
  "commit": false,
  "fixed": [],
  "linked": [["solid-js", "babel-preset-solid"]],
  "access": "public",
  "baseBranch": "main",
  "updateInternalDependencies": "patch",
  "ignore": []
}


================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = LF
charset = utf-8
insert_final_newline = true

================================================
FILE: .github/FUNDING.yml
================================================
open_collective: solid


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: '🐛 Bug report'
description: Create a report to help us improve
body:
  - type: markdown
    attributes:
      value: |
        Thank you for reporting an issue :pray:.

        This issue tracker is for reporting bugs found in `solid` (https://github.com/solidjs/solid).
        If you have a question about how to achieve something and are struggling, please post a question
        inside of `solid` Discussions tab: https://github.com/solidjs/solid/discussions

        Before submitting a new bug/issue, please check the links below to see if there is a solution or question posted there already:
         - `solid` Issues tab: https://github.com/solidjs/solid/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc
         - `solid` closed issues tab: https://github.com/solidjs/solid/issues?q=is%3Aissue+sort%3Aupdated-desc+is%3Aclosed
         - `solid` Discussions tab: https://github.com/solidjs/solid/discussions

        The more information you fill in, the better the community can help you.
  - type: textarea
    id: description
    attributes:
      label: Describe the bug
      description: Provide a clear and concise description of the challenge you are running into.
    validations:
      required: true
  - type: input
    id: link
    attributes:
      label: Your Example Website or App
      description: |
        Which website or app were you using when the bug happened?
        Note:
        - Your bug will may get fixed much faster if we can run your code and it doesn't have dependencies other than the solid-js  npm package.
        - To create a shareable code example you can use Stackblitz (https://stackblitz.com/). Please no localhost URLs.
        - Please read these tips for providing a minimal example: https://stackoverflow.com/help/mcve.
      placeholder: |
        e.g. https://stackblitz.com/edit/...... OR Github Repo
    validations:
      required: true
  - type: textarea
    id: steps
    attributes:
      label: Steps to Reproduce the Bug or Issue
      description: Describe the steps we have to take to reproduce the behavior.
      placeholder: |
        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error
    validations:
      required: true
  - type: textarea
    id: expected
    attributes:
      label: Expected behavior
      description: Provide a clear and concise description of what you expected to happen.
      placeholder: |
        As a user, I expected ___ behavior but i am seeing ___
    validations:
      required: true
  - type: textarea
    id: screenshots_or_videos
    attributes:
      label: Screenshots or Videos
      description: |
        If applicable, add screenshots or a video to help explain your problem.
        For more information on the supported file image/file types and the file size limits, please refer
        to the following link: https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/attaching-files
      placeholder: |
        You can drag your video or image files inside of this editor ↓
  - type: textarea
    id: platform
    attributes:
      label: Platform
      value: |
        - OS: [e.g. macOS, Windows, Linux]
        - Browser: [e.g. Chrome, Safari, Firefox]
        - Version: [e.g. 91.1]
    validations:
      required: true
  - type: textarea
    id: additional
    attributes:
      label: Additional context
      description: Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: 🤔 Long question or idea
    url: https://github.com/solidjs/solid/discussions
    about: Ask long-form questions and discuss ideas.
  - name: 💬 Community Chat
    url: https://discord.com/invite/solidjs
    about: Ask quick questions or simply chat on the SolidJS Discord server.
  - name: 💬 New Updates (Twitter)
    url: https://twitter.com/solid_js
    about: Link to our twitter account if you want to follow us and stay up to date with news
  - name: 💬 New Updates (Reddit)
    url: https://www.reddit.com/r/solidjs/
    about: Link to our twitter account if you want to follow us and stay up to date with news
  - name: 🍿 YouTube Channel
    url: https://www.youtube.com/c/RyanCarniato9
    about: Are you a techlead or wanting to learn more about SolidJS? Watch Ryan Carniato (creator of solidJS) share detailed technical deep dives into topics like how SolidJS, Server Side Rendering (SSR), ReactJS, Svelte, MarkoJS & Partial Hydration works under the hood and so much more


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
  Thanks for submitting a pull request!
  We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory.

  Before submitting a pull request, please make sure the following is done:

  1. Fork [the repository](https://github.com/solidjs/solid) and create your branch from `main`.
  2. Run `pnpm i` in the repository root.
  3. If you've fixed a bug or added code that should be tested, add tests!
  4. You should run `pnpm build` before running any tests as it copies some files in that are required for Solid to work.
  5. Ensure the test suite passes (`pnpm test`).
  6. Format your code with [prettier](https://github.com/prettier/prettier).
  7. Commit with conventional commits standards
-->

## Summary

<!--
 Explain the **motivation** for making this change. What existing problem does the pull request solve?
-->

## How did you test this change?

<!--
  Demonstrate the code is solid. Example: The exact commands you ran and their output, screenshots / videos if the pull request changes the user interface.
  How exactly did you verify that your PR solves the issue you wanted to solve?
-->


================================================
FILE: .github/workflows/main-ci.yml
================================================
name: 'Solid CI'

on:
  pull_request:
    branches:
      - '*'
  push:
    branches:
      - main

jobs:
 job:
  runs-on: ubuntu-latest
  steps:
  - uses: actions/checkout@v4
  - uses: pnpm/action-setup@v4
  - uses: actions/setup-node@v4
    with:
      node-version-file: ".nvmrc"
      registry-url: "https://registry.npmjs.org"
      cache: "pnpm"

  - name: Installing deps
    run: pnpm install

  - name: Building
    run: pnpm run build

  - name: Testing & Coverage
    run: |
      pnpm run test
      pnpm run coverage

  - name: Coveralls
    uses: coverallsapp/github-action@v2
    with:
      base-path: packages/solid
      path-to-lcov: "./packages/solid/coverage/lcov.info"
      github-token: ${{ secrets.GITHUB_TOKEN }}

  - name: Archive production artifacts
    uses: actions/upload-artifact@v4
    with:
      name: dist-folder
      path: |
        '*/dist'
        '*/types'


================================================
FILE: .gitignore
================================================
node_modules/
dist/
lib/
.vscode/
.idea/
coverage/
types/
.DS_Store
.turbo/

packages/solid/src/jsx.d.ts
packages/solid/h/jsx-runtime/src/jsx.d.ts
packages/solid/web/server/server.d.ts
packages/solid/web/src/client.d.ts
packages/solid/universal/src/universal.d.ts

# vscode devcontainers see issues #419 and #421 for context
/.devcontainer.json
/devcontainer


================================================
FILE: .gitpod.yml
================================================
tasks:
  - init: pnpm install && pnpm run build
vscode:
  extensions: ["esbenp.prettier-vscode"]


================================================
FILE: .nvmrc
================================================
22.13.1


================================================
FILE: .prettierrc
================================================
{
  "trailingComma": "none",
  "tabWidth": 2,
  "semi": true,
  "singleQuote": false,
  "arrowParens": "avoid",
  "printWidth": 100
}

================================================
FILE: CHANGELOG.md
================================================
# Changelog

## 1.8.0 - 2023-10-09

I admit this is not the most exciting release from a feature standpoint. We are in that holding pattern between the end of 1.x and the start of 2.0. We recently made our new reactive experiments public and continue to build those out in public with [@solidjs/signals](https://github.com/solidjs/signals).

This version is more about addressing some of the fundamentals that will help us in other projects like SolidStart while we do the transition. A big part of this is applying what we have learned when doing performance benchmarks for the work that has been funded by [Google Chrome Aurora](https://www.solidjs.com/blog/chrome-supports-solidjs).

Async and Resources need work and are too all in. It is great to have a solution but now that we have a better understanding we need to start breaking things apart into their fundamental pieces.

### De-duping Streaming Serialization

This is the marquee feature of this release and is largely the work of @lxsmnsyc. Solid has been able to serialize promises and do streaming for a couple of years now, but it was very special-cased. Now it is a generic mechanism.

This matters because it means that we have decoupled the promise serialization from Resources, and in so decoupled the whole when the stream is done from them. This opens up things like nested promises.

More so we have a mechanism now that deeply de-dupes data serialized across flushes. This is important for features like Islands where you might pass the same props to multiple Islands across different Suspense boundaries and don't want to send the data more than once. And even examples where that data can be accessed at varying depths (recursive comments in say a Hackernews site).

### Hydration Improvements

Fragments for Hydration have been a bit of a pain and we keep seeming to have different issues reported around element duplication. Most commonly this has been around where there are `lazy` component siblings or where the fragment is top-level. After looking into and fixing an [issue for Astro](https://github.com/withastro/astro/pull/8365) I decided to look at some of the oldest bugs in Solid and found it was a similar bug.

In many cases, the DOM can change throughout Hydration while doing things like streaming but we need to pause and resume hydration because code isn't available yet. While we don't create elements during hydration, getting an accurate snapshot of the DOM for the current state for future list reconciliation is a process we've had a few tries at but in 1.8 we update this in a way that makes sure it doesn't get out of date.

Also in 1.8, we have added some performance improvements to hydration in the form of not redundantly setting attributes or props as the page hydrates similar to how we don't update text. This is all migration towards a future where we don't need to do as much hydration, but it is important to note that values will be kept as they were on the server rather than how they may compute at runtime during hydration.

### Smaller Templates

In 1.7 we removed unnecessary closing tags from template strings. It was a bit painful because we were a bit overzealous at first. While I believe in the end we got to a good place, ultimately all but the simplest reductions have been hidden behind a compiler flag(`omitNestedClosingTags`). Thanks to work from @intrnl we are implementing another template size reduction technique of removing unnecessary quotes. Quotes are actually not required by HTML in some cases and it can add up.

### Other

#### Fix NGINX Server Side Includes

Comments led with `#` are treated as special directives for a few different servers so we've needed to change our open hydration markers to `$`. As usual, your version of Solid and the Babel Plugin should be the same to ensure this matches up.

#### Better Guards on Global Scripts

Solid uses an inline HydrationScript as a way to do processing before the framework and code have loaded. To handle things like event capture and streaming. However, we didn't do a good job of guarding the right thing when multiple were added to the same page, a situation that can happen in Micro-frontends or 3rd party Islands solutions. Now the script guards against duplicate inclusion.

## 1.7.0 - 2023-03-30

Solid has experienced incredible growth in usage the last 6 months. Companies are using it to power production applications and SolidStart Beta has been a big part of that. As a natural part of this growth and increased use at scale we are continuing to learn what works well and what the rough edges in Solid are today.

This v1.7 release marks the beginning of the migration roadmap to v2.0. We are beginning to re-evaluate core APIs and will begin introducing new ones while reasonably deprecating older ones in a manner that eases breaking changes. Our intention is to ease the broader ecosystem into preparing for improvements that a major 2.0 will unlock for the whole community.

### Improved TypeScript

#### Null-Asserted Control Flow

One of the pains of using Solid with TypeScript has been that JSX control flows can't really type narrow. This is true, but starting with the migration to explicit `keyed` in v1.5 we now complete this story by introducing callback forms for `<Show>` and `<Match>` that work when non-keyed.

The main difference is the callback form instead of passing in the value as it does when `keyed`, passes in a function that is type narrowed.

```js
// keyed w/ callback - reruns full callback on change
<Show when={user()} keyed>
  {nonNullUser => <div>{nonNullUser.name}</div>}
</Show>

// non-keyed w/o callback... - only updates the one expression, needs ! assertion
<Show when={user()}>
  <div>{user()!.name}</div>
</Show>

// NEW!
// non-keyed w/ callback - only updates the one expression
<Show when={user()}>
  {nonNullUser => <div>{nonNullUser().name}</div>}
</Show>
```

Keep in mind because we are non-null asserting the input signal so it won't expect null in closures that execute when the condition is no longer satisfied. For this reason the accessor from the callback is special and will throw when attempted to be accessed when the condition is no longer true. This may be unexpected but it is our best attempt to keep TypeScript strict and not present inconsistency in reactivity. Luckily this only applies to things like timers which you should be cleaning up anyway and not things like event handlers. We recommend using the original conditions source in those closures if you must.

#### Better Event Types for Input Elements

This has irked people for a while but we come by it honestly, `target` is gives you a type of `Element` rather than the specific element that is the target. That means no access to `.value` or `.checked`. The reason is there is no way to know at compile time what the target of an event will be. The `currentTarget` will be the element you attach the event to but the target can be anything.

There is a way to work around this though, in that if we know the `currentTarget` is of type that generates the event and that the `currentTarget` is the the type of this element we can assume it is the `target` as well. Not perfect logic but it is what React does and we do too.

Now `onInput`, `onChange`, `onBlur`, `onFocus`, `onFocusIn`, and `onFocusOut` all support more detailed `target` when applied to `HTMLInputElement`, `HTMLTextAreaElement`, and `HTMLSelectElement`.

#### Stricter JSX Elements

Strict JSX elements have been tricky because we have to acknowledge at a certain point that TypeScript is to serve our purposes rather than to represent all possible values that could work. For us the ambiguity lies in functions.

Solid's JSX needs to accept functions to handle dynamic insertion. However, in authoring it leads to awkward situations.

The first you hit the first time use Solid. You create that counter and don't call `count` as a function and it works.

```js
function Counter() {
  const [count, setCount] = createSignal(1);

  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
```

This example works in some places and not others which might lead to the wrong conclusions.

The second place you might hit this is when you get a little further on your journey and decide you need a component to re-render and decide that you can just wrap the whole thing in a function:

```js
function MyComp(props) {
  return () => {
    // look working early returns
    if (props.count > 5) {
      return <div>Maximum Tries</div>;
    }

    return <div>Attempt {props.count}</div>;
  };
}
```

Again this seems fine, except the fact that every time `count` changes you are recreating all the DOM Elements even when it resolves to the same conditional.

Eventually you might even not think twice about passing functions into children of arbitrary components:

```js
<MyComp>
  <MyComp2>
    <MyComp3>{() => <div>{resource()}</div>}</MyComp3>
  </MyComp2>
</MyComp>
```

But what does this do? When is the function called?

As it turns out removing functions from `JSX.Element` type makes all of these scenarios error. Components only expect the values dictated by their types.

```js
function MyLayout(props: { children: JSX.Element }): JSX.Element;

function MyFor<T, U extends JSX.Element>(props: { each: T[],  children: (item: T) => U }): JSX.Element;

// valid
<MyLayout>Hello</MyLayout>
<MyLayout><p>Hello</p></MyLayout>
<MyLayout>{name()}</MyLayout>
<MyLayout>{name() && <p>Hello</p>}</MyLayout>
<MyLayout>{(() => {
  return <p{name()}</p>
})()}</MyLayout>
<MyLayout>{untrack(() => {
  return <p>{name()}</p>
})}</MyLayout>
<MyFor each={users()}>{(user) => <div>{user.name}</div>}</MyFor>

// invalid
<MyLayout>{name}</MyLayout>
<MyLayout>{() => <p>Hello</p>}</MyLayout>
<MyLayout>{() => "Hello"}</MyLayout>
<MyLayout>{() => name() && <p>Hello</p>}</MyLayout>
<MyFor each={users}>{(user) => <div>{user.name}</div>}</MyFor>
<MyFor each={users()}><div>Not a Function</div></MyFor>
```

The tradeoff here is that authoring components you can no longer just return a Signal or Memo without casting. If using JSX you can always return a Fragment.

If not you will need to cast to `unknown as JSX.Element`.

### Better Errors and Cleanup

#### `catchError` replaces `onError`

Error Handling is complicated enough without having to try to guess how they propagate. `onError` admittedly is a lower level primitive but fundamentally had this flaw. It worked by registering an error handler on the parent scope, but left it ambiguous how to handle siblings. Is it a queue? Are they independent?

As a result we are introducing `catchError` in this release which introduces its own scope to catch any errors below it. The first argument in the primitive is similar to the try and the second argument is the catch.

```js
catchError(
  () => {
    // do stuff
    throw new Error("I've Errored");
  },
  err => console.log(err)
);
```

`onError` will still be present until it can be removed in a future major version.

#### Standardized Errors

Error Handling has had many weird edge cases introduced by applications throwing unusual values. In v1.7 we wrap all thrown values that aren't of type `Error` in a `new Error` and attach the original thrown value as `.cause`.

### More Performant Dev Tools

Now that [Solid Dev Tools](https://github.com/thetarnav/solid-devtools) have been stabilizing, we have a much better idea what support we need for them. In so we were able to remove the very costly serialization we were doing for generating unique identifiers. Conventions around naming and exports were streamlined and standardized as well.

### Others

- Smaller compiled output, remove auxilary closing tags
- Support for `prop:` and `attr:` in Spreads
- Don't apply special props (like `readonly`) to custom elements
- Introduced improved serializer, [seroval](https://github.com/lxsmnsyc/seroval)
- Fixed quirks in Solid's treeshaking in Rollup
- Minify inline class and style attributes
- Update `solid-ssr` to type `"module"`

## 1.6.0 - 2022-10-20

Solid v1.6 doesn't bring a ton of new features but brings some big improvements in existing ones.

### Highlights

#### Official Partial Hydration Support

Solid has worked for quite some time in partial hydrated ("Islands") frameworks like Astro, Iles, Solitude, etc.. but now we have added core features to support this effort better. These features are mostly designed for metaframework authors rather than the end user they are exposed through a couple APIs.

`<Hydration />` joins `<NoHydration />` as being a way to resume hydration and hydration ids during server rendering. Now we can stop and start hydratable sections. This is important because it opens up a new optimization.

`createResource` calls under non-hydrating sections do not serialize. That means that resources that are server only stay on the server. The intention is that hydrating Islands can then serialize their `props` coming in. Essentially only shipping the JSON for data actually used on the client.

The power here is static markup can interview dynamic components.

```js
<h1>Server Rendered Header</h1>
<Island>
  <h2>Server Rendered Sub Header</h2>
  <p>{serverOnlyResource().text}</p>
  <DifferentIsland>
    <p>More server-renderd content</p>
  </DifferentIsland>
</Island>
```

Keep in mind Server rendered content like this can only be rendered on the server so to maintain a client navigation with this paradigm requires a special router that handles HTML partials.

Similarly we want the trees to talk to each other so `hydrate` calls now have been expanded to accept a parent `Owner` this will allow Islands to communicate through Contex without shipping the whole tree to browser.

```js
<h1>Server Rendered Header</h1>
<ClientProvider>
  <h2>Server Rendered Sub Header</h2>
  <ClientIslandThatReadsContext />
</ClientProvider>
```

These improvements make it easier to create Partial Hydration solutions on top of Solid, and serve to improve the capabilities of the ones we already have.

#### Native Spread Improvements

Native spreads are something we started at very naively. Simply just iterating an object that has some reactive properties and updating the DOM element. However, this didn't take into consideration two problems.

First properties on objects can change, they can be added or removed, and more so the object itself can be swapped. Since Solid doesn't re-render it needs to keep a fixed reference to the merged properties. Secondly, these are merged. Properties override others. What this means is we need to consider the element holistically to know that the right things are applied.

For Components this was a never a problem since they are just function calls. Unfortunately for native elements this means all those compiler optimizations we do for specific bindings now need to get pulled into this. Which is why we avoided it in the past. But the behavior was too unpredictable.

In 1.6 we have smartened spread to merge properly using similar approach to how process Components. We've also found new ways to optimize the experience. (See below).

### Other Improvements

#### Deproxification

Working on new Spread behavior we realized that while we can't tell from compilation which spreads can change. We can tell at runtime which are proxies. And in so if we only need to merge things which don't swap, and aren't proxies we can avoid making a Proxy.

What is great about this is it has a cascading effect. If component props aren't a proxy, then `splitProps` and `mergeProps` don't need to create them, and so on. While this requires a little extra code it is a real win.

We get a lot request for low end IoT devices because of Solid's incredible performance. In tests Solid outperforms many of the Virtual DOM solutions in this space. However most of them don't support proxies.

So now if you don't use a `Store` or swap out the props object:

```js
// this is fine
<div {...props} />

// these could swap out the object so they make proxies
<div {...props.something} />
// or
<div {...someSignal()} />
```

We don't need to introduce any proxy the user didn't create. This makes Solid a viable option for these low-end devices.

## 1.5.0 - 2022-08-26

### Key Highlights

#### New Batching Behavior

Solid 1.4 patched a long time hole in Solid's behavior. Until that point Stores did not obey batching. However, it shone a light on something that should maybe have been obvious before. Batching behavior which stays in the past is basically broken for mutable data, No Solid only has `createMutable` and `produce` but with these sort of primitives the sole purpose is that you perform a sequence of actions, and batching not making this properly was basically broken. Adding an element to an array then removing another item shouldn't just skip the first operation.

```js
const store = createMutable(["a", "b", "c"]);

const move = store.splice(1, 1);
store.splice(0, 0, ...move);

// solid 1.4
// ["b", "a", "b", "c"];

// solid 1.5
// ["b", "a", "c"];
```

After a bunch of careful thought and auditting we decided that Solid's `batch` function should behave the same as how reactivity propagates in the system once a signal is set. As in we just add observers to a queue to run, but if we read from a derived value that is stale it will evaluate eagerly. In so signals will update immediately in a batch now and any derived value will be on read. The only purpose of it is to group writes that begin outside of the reactive system, like in event handlers.

#### More Powerful Resources

Resources continue to get improvements. A common pattern in Islands frameworks like Astro is to fetch the data from the out side and pass it in. In this case you wouldn't want Solid to do the fetching on initial render or the serialization, but you still may want to pass it to a resource so it updates on any change. For that to work reactivity needs to run in the browser. The whole thing has been awkward to wire up but no longer.

`ssrLoadFrom` field lets you specify where the value comes from during ssr. The default is `server` which fetches on the server and serializes it for client hydration. But `initial` will use the `initialValue` instead and not do any fetching or addtional serialization.

```js
const [user] = createResource(fetchUser, {
  initialValue: globalThis.DATA.user,
  ssrLoadFrom: "initial"
});
```

We've improved TypeScript by adding a new `state` field which covers a more detailed view of the Resource state beyond `loading` and `error`. You can now check whether a Resource is `"unresolved"`, `"pending"`, `"ready"`, `"refreshing"`, or `"error"`.

| state      | value resolved | loading | has error |
| ---------- | -------------- | ------- | --------- |
| unresolved | No             | No      | No        |
| pending    | No             | Yes     | No        |
| ready      | Yes            | No      | No        |
| refreshing | Yes            | Yes     | No        |
| errored    | No             | No      | Yes       |

A widely requested feature has been allowing them to be stores. While higher level APIs are still being determined we now have a way to plugin the internal storage by passing something with the signature of a signal to the new _Experimental_ `storage` option.

```js
function createDeepSignal<T>(value: T): Signal<T> {
  const [store, setStore] = createStore({
    value
  });
  return [
    () => store.value,
    (v: T) => {
      const unwrapped = unwrap(store.value);
      typeof v === "function" && (v = v(unwrapped));
      setStore("value", reconcile(v));
      return store.value;
    }
  ] as Signal<T>;
}

const [resource] = createResource(fetcher, {
  storage: createDeepSignal
});
```

#### Consolidated SSR

This release marks the end of years long effort to merge async and streaming mechanism. Since pre 1.0 these were seperate. Solid's original SSR efforts used reactivity on the server with different compilation. It was easiest to migrate synchronous and streaming rendering and for a time async had a different compilation. We got them on the same compilation 2 years ago but runtimes were different. Piece by piece things have progressed until finally async is now just streaming if flushed at the end.

This means some things have improved across the board. Async triggered Error Boundaries previously were only ever client rendered (throwing an error across the network), but now if they happen any time before sending to the browser they are server rendered. `onCleanup` now runs on the server if a branch changes. Keep in mind this is for rendering effects (like setting a status code) and not true side effects as not all rendering cleans up.

Finally we've had a chance to do a bunch of SSR rendering performance improvements. Including replacing our data serializer with an early copy of Dylan Piercey from [Marko](https://markojs.com)'s upcoming serializer for Marko 6. Which boasts performance improvements of up to 6x `devalue` which we used previously.

#### Keyed Control Flow

Solid's `<Show>` and `<Match>` control flow originally re-rendered based on value change rather than truthy-ness changing. This allowed the children to be "keyed" to the value but lead to over rendering in common cases. Pre 1.0 it was decided to make these only re-render when statement changed from `true` to `false` or vice versa, except for the callback form that was still keyed.

This worked pretty well except it was not obvious that a callback was keyed. So in 1.5 we are making this behavior explicit. If you want keyed you should specify it via attribute:

```js
// re-render whenever user changes

// normal
<Show when={user()} keyed>
  <div>{user().name}</div>
</Show>

// callback
<Show when={user()} keyed>
  {user => <div>{user.name}</div>}
</Show>
```

However, to not be breaking if a callback is present we will assume it's keyed. We still recommend you start adding these attributes (and TS will fail without them).

In the future we will introduce a non-keyed callback form as well so users can benefit from type narrowing in that case as well.

### Other Improvements

### `children.toArray`

Children helper now has the ability to be coerced to an array:

```js
const resolved = children(() => props.children);
resolved.toArray(); // definitely an array
```

#### Better SSR Spreads

Finally fixed spread merging with non-spread properties during SSR, including the ability to merge children.

#### Better Error Handling

We weren't handling falsey errors previously. Now when Solid receives an error that isn't an `Error` object or a string it will coerce it into an `Unknown Error`.

## 1.4.0 - 2022-05-12

### New Features

#### Resource Deferred Streaming

Streaming brings a lot of performance benefits but it also comes with the tradeoff we need to respond with the headers before we can send any content. This means we must set the Response headers early if we want to benefit from streaming. While it's always possible to fetch first and delay rendering that slows down everything. Even our async server rendering doesn't block rendering but instead just waits to respond to the end.

But what if you want to stream but also want to wait on some key data loading so you still have an opportunity to handle the response on the server before sending it to the browser?

We now have the ability to tell Solid's stream renderer to wait for a resource before flushing the stream. That you can opt in by setting `deferStream` option.

```js
// fetches a user and streams content as soon as possible
const [user] = createResource(() => params.id, fetchUser);

// fetches a user but only streams content after this resource has loaded
const [user] = createResource(() => params.id, fetchUser, { deferStream: true });
```

#### Top Level Arrays in Stores

Since Stores were first introduced it has always bugged me that the most common case, creating a list required nesting it under a property to track properly. Thanks to some exploration into proxy traps and iteration we now support top level arrays. In addition to its other modes, the Store setter will accept an array which allows for common operations.

```js
const [todos, setTodos] = createStore([
  { id: 1, title: "Thing I have to do", done: false },
  { id: 2, title: "Learn a New Framework", done: false }
]);

// set at an index
setTodos(1, done, true);

// use an array
setTodos([...todos, { id: 3, title: "New Todo", done: false }])

// iterate over it with <For>
<For each={todos}>{todo => <Todo todo={todo} />}</For>;
```

Through this change we also stopped over execution when listening to specific properties. To support iteration Solid previously would notify the owning object of any array when an was index added/removed or object new property created or deleted on any object.

The one caveat is downstream optimized control flow that untrack index reads on arrays will now need to track the iterated object explicity. Solid exports a `$TRACK` symbol used to subscribe to the object and all its properties.

#### Stale Resource Reads

Suspense and Transitions are amazingly powerful feature but occasionally you want to opt out of the consistency and show things out of date because it will show up faster and some of things you are waiting for are not as high priority. In so you want the Transition to end sooner, but not necessarily stop showing the stale data for part of the screen. It is still preferable to receding back to loading spinner state.

Solid's Resources now support being able to read the value without triggering Suspense. As long as it has loaded previously `latest` property won't cause fallback appear or Transitions to hold. This will always return the `latest` value regardless whether it is stale (ie.. a new value is being fetched) and will reactively update. This is super powerful in Transitions as you can use the Resources own `loading` state to know if it is stale. Since the Transition will hold while the critical data is loading, the loading state will not be applied to the in view screen until that Transition has ended. If the resource is still loading now you can show that it is stale.

```js
const [resource] = createResource(source, fetcher);

// read it as usual
resource();

// read the latest (don't suspend if loaded at least once)
resource.latest;
```

Example: https://codesandbox.io/s/solid-stale-resource-y3fy4l

#### Combining multiple Custom Renderers

The Babel plugin now allows configuring multiple custom renderers at the same time. The primary case it is so a developer can still lever Solid's optimized DOM compilation while using their custom renderer. To make this work specify the tags each renderer is reponsible for. It will try to resolve them in order.

```js
import { HTMLElements, SVGElements } from "solid-js/web";
let solidConfig = {
  moduleName: "solid-js/web",
  // @ts-ignore
  generate: "dynamic",
  renderers: [
    {
      name: "dom",
      moduleName: "solid-js/web",
      elements: [...HTMLElements, ...SVGElements]
    },
    {
      name: "universal",
      moduleName: "solid-three",
      elements: []
    }
  ]
};
```

### Improvements/Fixes

#### Synchronous Top Level `createEffect`

These were originally deferred to a microtask to resemble how effects are queued under a listener. However it is more correct to run immediate like everything else top level.

#### Better Types around Components

This one took the effort of many resident TypeScript experts, but we've now landed on some better types for components. The biggest change is `Component` no longer has an opinion on whether it should have `children` or not. We've added supplementary types `ParentComponent` and `FlowComponent` to denote Components that may have `children` or always have `children`. And we've added `VoidComponent` for those which may never have children.

#### Sources in `createResource` are now Memos

A small change but it was unusual to have refetching trigger a reactive expression outside of a reactive context. Now on refetch it grabs the last source value rather than re-running it.

#### `createMutable` batches array methods like push, pop, etc..

Now these built-ins are batched and more performant. We've also add `modifyMutable` that applies modifiers batched to stores created with `createMutable`.

```js
modifyMutable(state.data.user, reconcile({ firstName: "Jake", middleName: "R" }));
```

#### Stores and mutables now respect batch

Writing to a store or mutable within `batch` (including effects) no longer immediately updates the value, so reading within the same batch gives the old value. This guarantees consistency with memos and other computations, just like signals.

#### Better Support for React JSX transform

We have added support to `solid-js/h` to support the new React JSX transform. You can use it directly in TypeScript by using:

```json
{
  "jsx": "react-jsx",
  "jsxImportSource": "solid-js/h"
}
```

Keep in mind this has all the consequences of not using the custom transform. It means larger library code, slower performance, and worse ergonomics. Remember to wrap your reactive expressions in functions.

#### HyperScript now returns functions

This one is a potentially breaking change, but the current behavior was broken. It was possible(and common) for children to be created before the parents the way JSX worked. This was an oversight on my original design that needs to be fixed, as it breaks context, and disposal logic. So now when you get your results back from `h` you need to call it. Solid's `render` function will handle this automatically.

```js
const getDiv = h("div", "Hello");

document.body.appendChild(getDiv()); // call as a function to have it create the element.
```

### Removals and Deprecations

#### `className`, `htmlFor` deprecated

While they still work for now, Solid will remove support for these React-isms in a future version. They leave us with multiple ways to set the same attribute. This is problematic for trying to merge them. Solid updates independently so it is too easy for these things to trample on each other. Also when optimizing for compilation since with things like Spreads you can't know if the property is present, Solid has to err on the side of caution. This means more code and less performance.

#### Experimental `refetchResources` removed

This primitive ended up being too general to be useful. There are enough cases we can't rely on the refetch everything by default mentality. For that reason we are dropping support of this experimental feature.

## 1.3.0 - 2022-01-05

### New Features

#### HTML Streaming

This release adds support for HTML streaming. Now we not only stream data after the initial shell but the HTML as it finishes. The big benefit is that now for cached results, or times when the network are slow we no longer have to show the placeholder while waiting for JavaScript bundle to load. As soon as the HTML is available it will be streamed and inserted.

With it comes new streaming API `renderToStream`. This is a universal API designed to handle both Node and Web writable streams. It returns an object that mirrors a Readable stream on both platforms that has both `pipe` (node) and `pipeTo` (web). The benefit of this `pipe` API is the user can choose when to insert the content in the output stream whether soon as possible, or `onCompleteShell`, or `onCompleteAll`. This decouples Solid's rendering a from the stream a bit but leaves things open to performance improvements in the future.

```js
// node
const stream = renderToStream(() => <App />).pipe(res);

// web
const stream = renderToStream(() => <App />).pipeTo(writable);
```

#### Error Boundaries on the Server

We've added support for Error Boundaries on the Server for all rendering methods(`renderToString`, `renderToStringAsync`, `renderToStream`). Errors can be caught both from synchronous rendering and from errors that happen in Resource resolution. However, Our approach doesn't guarentee all errors are handled on the server as with streaming it is possible that the Error Boundary has already made it to the browser while a nested Suspense component hasn't settled. If an Error is hit it will propagate up to the top most Suspense Boundary that hasn't been flushed yet. If it is not handled by an Error Boundary before that it will abort rendering, and send the Error to the browser to propagate up to the nearest Error Boundary.

This works now but there is more to explore here in improving Error handling in general with SSR. So look forward to feedback on the feature.

#### Isolated Server Render/Hydration Contexts

Sometimes you want to server render and hydrate multiple Solid apps on the same page. Maybe you are using the Islands architecture with something like [Astro](https://astro.build). We now have the ability to pass a unique `renderId` on all our server rendering methods and to the `hydrate` function. This will isolate all hydration and resource resolution. This means we can use things like server side Suspense in these solutions.

Also now you only need to include the Hydration Script once on the page. Each Island will be responsible for initializing it's own resources.

```js
// on the server
const html = renderToString(() => <Island1 />, { renderId: "island1" });

// for the browser
hydrate(() => <Island1 />, mountEl, { renderId: "island1" });
```

#### `createReaction`

This new primitive is mostly for more advanced use cases and is very helpful for interopt with purely pull based systems (like integrating with React's render cycle). It registers an untracked side effect and returns a tracking function. The tracking function is used to track code block, and the side effect is not fired until the first time any of the dependencies in the tracking code is updated. `track` must be called to track again.

```js
const [s, set] = createSignal("start");

const track = createReaction(() => console.log("something"));

// next time s changes run the reaction
track(() => s());

set("end"); // "something"

set("final"); // no-op as reaction only runs on first update, need to call track again.
```

This primitive is niche for certain use cases but where it is useful it is indispensible (like the next feature which uses a similar API).

#### External Sources (experimental)

Ever wanted to use a third party reactive library directly in Solid, like MobX, Vue Reactivity, or Kairo. We are experimenting with adding native support so reactive atoms from these libraries can be used directly in Solid's primitives and JSX without a wrapper. This feature is still experimental since supporting Transitions and Concurrent Rendering will take some more effort. But we have added `enableExternalSource` enable this feature. Thanks @3Shain for designing this solution.

```js
import { Reaction, makeAutoObservable } from "mobx";
import { enableExternalSource } from "solid-js";
import { render } from "solid-js/web";

let id = 0;
enableExternalSource((fn, trigger) => {
  const reaction = new Reaction(`externalSource@${++id}`, trigger);
  return {
    track: x => {
      let next;
      reaction.track(() => (next = fn(x)));
      return next;
    },
    dispose: () => {
      reaction.dispose();
    }
  };
});

class Timer {
  secondsPassed = 0;

  constructor() {
    makeAutoObservable(this);
  }

  increase() {
    this.secondsPassed += 1;
  }

  reset() {
    this.secondsPassed = 0;
  }
}

// component driven directly off MobX
function App() {
  const timer = new Timer();
  setInterval(() => {
    timer.increase();
  }, 1000);

  return <button onClick={() => timer.reset()}>Seconds passed: {timer.secondsPassed}</button>;
}

render(() => <App />, document.getElementById("app"));
```

#### `refetchResources` (experimental)

In efforts to allow for scaling from simple resources up to cached solutions we are adding some experimental features to `createResource` to work with library writers to develop the best patterns. Caching is always a tricky problem and with SSR and streaming being part of the equation the core framework needs at minimum to provide some hooks into orchestrating them.

Sometimes it's valuable to trigger `refetch` across many resources. Now you can.

```js
import { createResource, refetchResources } from "solid-js";

const userCache = {};

function MyComponent(props) {
  const [data] = createResource(
    () => props.id,
    (userId, { refetching }) => {
      const cached = userCache[userId];

      // return cached value if available and not refetching
      if (cached && !refetching) return cached;
      return fetchUser(userId);
    }
  );
}

// somewhere else
refetchResources();
```

You can also pass a parameter to `refetchResources` to provide additional information to the `refetching` info of the fetcher. This could be used for conditional cache invalidation. Like only refetch resources related to `users`. This mechanism requires a bit of wiring but the idea is you'd wrap `createResource` in maybe a `createQuery` and implement your own conventions around resource cache management. Still working out how this should work best, but the goal is to provide the mechanisms to support resource caches without being responsible for their implementation.

To opt-out being part of the global refetch createResource now takes a `globalRefetch` option that can be set to false. In addition to a new option to disable `refetchResources` there is no an `onHydrated` callback that takes the same arguments as the fetcher. When a resource is restored from the server the fetcher is not called. However, this callback will be. This is useful for populating caches.

### Improvements

#### Better TypeScript Support

Thanks to the tireless efforts of several contributors we now have significantly better types in Solid. This was a huge effort and involved pulling in maintainers of TypeScript to help us work through it. Thank you @trusktr for spearheading the effort.

#### Better SourceMaps

Work has been done to improve sourcemaps by updating `babel-plugin-dom-expressions` to better preserve identifiers from the JSX. Thanks to @LXSMNSYC for exploring and implementing this.

### Breaking Changes/Deprecations

#### `startTransition` no longer takes callback as a second argument

Instead it returns a promise you can await. This works better for chaining sequences of actions.

```js
const [start, isPending] = useTransition();

start(() => doSomething()).then(() => allDone());
```

#### Resource fetcher info object replaces `getPrev`

To streamline API for refetch we are slightly updating the `createResource`:

```js
const [data] = createResource(sourceSignal, (source, { value, refetching }) => {});
```

For those using existing 2nd argument:

```js
const [data] = createResource(sourceSignal, (source, getPrev) => {
  const value = getPrev();
});

// becomes
const [data] = createResource(sourceSignal, (source, { value }) => {});
```

#### Deprecating Legacy Streaming APIs

`pipeToNodeWritable` and `pipeToWritable` are deprecated. They will still work for now with basic usage but some of the more advanced options didn't map over to the new APIs directly and have been removed. Move to using `renderToStream`.

### Bug Fixes

- Fixed browser extensions modifying the head breaking hydration.
- Fixed reinserting `<html>` on hydration from document.
- Fixed over-executing on multi-select with `createSelector`.
- Fixed event delegation conflicting with document event listeners.
- Fixed self owning source infinite recursion.
- Fixed faulty treesplitting for hydration in client only render.
- Fixed return type of `preload` on lazy components to always be a promise.
- Fixed compile error with leading white space after opening tags when generating ssr.

## 1.2.0 - 2021-10-25

### New Features

#### Custom Renderers

This release adds support custom renderers through a new "universal" transform. Solid now provides a sub module `solid-js/universal` that exports a `createRenderer` method that allows you to create your own runtimes. This will enable things like native mobile and desktop, canvas and webgl, or even rendering to the terminal. This is still new so very much looking for feedback.

#### Spreads Added to Solid's `html`

It's been a long time coming but Solid's Tagged Template Literals now support element and component spreads using htm inspired syntax.

```js
html`<div ...${props} />`;
```

### Fixes

#### Dynamic Spreads now work on Components

Previously spreads on components would only track property changes on bound objects and not when the whole object changed. This now works:

```js
<MyComponent {...getStuff()} />
```

#### ClassList properly merges multiple classnames in the key

It is common in libraries like Tailwind to apply multiple classes at the same time. There was an issue where true and false resolutions were cancelling each other out. This would only set `text-sm`.

```js
<div
  classList={{
    "px-2.5 py-1.5 text-xs": false,
    "px-3 py-2 text-sm": false,
    "px-4 py-2 text-sm": true,
    "px-4 py-2 text-base": false,
    "px-6 py-3 text-base": false
  }}
/>
```

#### Consistent handling of HTMLEntities

Things like `&nbsp;` used to render differently depending if in elements or components(or fragments). This has been made consistent across all three.

#### Various improvements to Types and Transitions

A lot of bugs from the last minor release were around Transitions that have been addressed. And as always Types have been gradually improving.

## 1.1.0 - 2021-08-09

Expanding Solid's concurrency to include scheduling. Bug fixes around Types and around reactive execution order guarantees.

### New Features

#### `createUniqueId`

A universal id generator that works across server/browser.

```js
const id = createUniqueId();
```

> **Note** on the server this only works under hydratable components

#### `from`

A simple helper to make it easier to interopt with external producers like RxJS observables or with Svelte Stores. This basically turns any subscribable (object with a `subscribe` method) into a Signal and manages subscription and disposal.

```js
const signal = from(obsv$);
```

It can also take a custom producer function where the function is passed a setter function returns a unsubscribe function:

```js
const clock = from(set => {
  const t = setInterval(() => set(1), 1000);
  return () => clearInterval(t);
});
```

> Note: Signals created by `from` have equality checks turned off to interface better with external streams and sources.

#### `enableScheduling` (experimental)

By default Solid's concurrent rendering/Transitions doesn't schedule work differently and just runs synchronously. Its purpose is to smooth out IO situations like Navigation. However now you can opt into interruptible scheduling similar to React's behavior by calling this once at your programs entry. I've yet to see a realworld scenario where this makes a big difference but now we can do cool demos too and start testing it.

#### `startTransition`

Works like its counterpart in `useTransition`, this useful when you don't need pending state.

```js
import { createSignal, startTransition } from "solid-js";

function App() {
  const [signal, setSignal] = createSignal("Howdy");
  function clickHandler(e) {
    startTransition(() => setSignal("Holla"));
  }

  /* ...stuff */
}
```

## 1.0.0 - 2021-06-27

### Breaking Changes

### setSignal now supports function form

While that in itself is a great new feature as you can do:

```js
const [count, setCount] = createSignal(0);

setCount(c => c + 1);
```

This promotes immutable patterns, let's you access the previous value without it being tracked, and makes Signals consistent with State.

It means that when functions are stored in signals you need to use this form to remove ambiguity

```js
const [count, setCount] = createSignal(ComponentA);

// Do this:
setCount(() => ComponentB);

// Don't do this as it will call the function immediately:
setCount(ComponentB);
```

#### `createState` moved and renamed

`createState` has been renamed to `createStore` and moved to `solid-js/store`. Also moved to `solid-js/store`: `createMutable`, `produce`, `reconcile`

#### SSR Entry points

`renderToString` and `renderToStringAsync` now only return their stringified markup. To insert scripts you need to call `generateHydrationScript` or use the new `<HydrationScript>` component.

`renderToNodeStream` and `renderToWebStream` have been replaced with `pipeToNodeWritable` and `pipeToWritable`, respectively.

#### Options Objects

Most non-essential arguments on reactive primitives are now living on an options object. This was done to homogenize the API and make it easier to make future additions while remaining backwards compatible.

#### on

No longer uses rest parameters for multiple dependencies. Instead pass an array. This facilitates new option to defer execution until dependencies change.

#### Actions renamed to Directives

To remove future confusion with other uses of actions the `JSX.Actions` interace is now the `JSX.Directives` interface.

## 0.26.0 - 2021-04-09

This release is about finalizing some API changes on the road to 1.0. This one has one breaking change and not much else.

#### Signals no longer always notify by default

Solid's original behavior has been to always notify on signal change even if the value hasn't changed. The idea was to simulate stream behavior. However, this has some downsides:

1. Inconsistent with State.. I made the decision to make state equality check by default, it is weird signals and memo's do not.
2. More likely to hit infinite loops. Equality check naturally stops infinite loops in some cases. While infinite loops aren't good and code that produces them suspect, it is nice to keep things clean.
3. It is consistent with other modern reactive libraries like MobX and Vue.

The API has not changed. You can opt out of the default behavior by passing in your own comparator or false to the 2nd parameter of `createSignal` and the 3rd parameter of `createMemo`.

My hope this is the last release before I start making 1.0 RC's. This one has big enough impact I want to get this out first. I imagine the remaining changes will be just syntax.

## 0.25.0 - 2021-03-28

This release is about refining the APIs as we approach the our release candidate for 1.0.

### Breaking Changes

#### Resource API

Minor difference to allow the first argument to be optional and support more features in the future. New full signature is:

```ts
export function createResource<T, U>(
  fn: U | false | (() => U | false),
  fetcher: (k: U, getPrev: () => T | undefined) => T | Promise<T>,
  options?: { initialValue?: T }
): ResourceReturn<T>;
```

3rd argument is now an options object instead of just the initial value. This breaking. But this also allows the first argument to be optional for the non-tracking case. Need a promise that only loads once? Don't have need to re-use the fetcher. Do this:

```js
const [data] = createResource(async () => (await fetch(`https://someapi.com/info`)).json());
```

#### on/onCapture

These are an escape hatch for unusual events. Previously these were custom attributes but now they are namespaced like:

```jsx
<div on:someUnusualEvent={e => console.log(e.target)} />
```

#### change `main` field to be node

Now that we are supporting SSR for legacy(non-ESM) systems I need to use the main field to indicate a node env. We will be using the "browser" field for the client build in Solid. This straight up breaks Jest which doesn't respect that. I've created `solid-jest` to handle this.

https://github.com/solidjs/solid-jest

### New Features

#### Namespace Types

Types added for Namespace attributes. You probably won't need most of these because they are for more advanced usage. However to use them you need to extend the JSX Namespace:

```ts
declare module "solid-js" {
  namespace JSX {
    interface Directives {
      // use:____
    }
    interface ExplicitProperties {
      // prop:____
    }
    interface ExplicitAttributes {
      // attr:____
    }
    interface CustomEvents {
      // on:____
    }
    interface CustomCaptureEvents {
      // oncapture:____
    }
  }
}
```

#### Lazy component preload

Lazy components now have a preload function so you can pre-emptively load them.

```js
const LazyComp = lazy(() => import("./some-comp"));

// load ahead of time
LazyComp.preload();
```

#### Error Boundary reset

Error boundaries now have the ability to reset themselves and try again. It is the second argument to the fallback.

```js
<ErrorBoundary
  fallback={(err, reset) => {
    if (count++ < 3) return reset();
    return "Failure";
  }}
>
  <Component />
</ErrorBoundary>
```

## 0.24.0 - 2021-02-03

This release is the start of the rework of the SSR solution. Consolidating them under a single method. Unfortunately this one comes with several breaking changes.

### Breaking Changes

#### Removed `solid-js/dom`

It's been a few versions deprecated. It's gone.

#### Updated Resource API

Changed to more resemble SWR and React Query. Needed to remove `createResourceState`so now need to use a getter over `createResource` to get same effect. See updated documentation.

#### Change SSR render call signatures

They now return results objects that include the generated hydration script. No more need to generate it separately. Also comes autowrapped in the `script` tag now.

#### `assignProps` to `mergeProps`

While you use them the same way mostly it no longer has `Object.assign` semantics and always returns a new object. This is important as in many cases we need to upgrade to a Proxy.

#### Renamed `getContextOwner` to `getOwner`

Removes confusion around context and consistent with new helper `runWithOwner`.

#### Solid Element no longer uses State for props

This reduces the size of the library especially for those not using state. It also should slightly increase performance as no need for deep nesting of proxies. It also makes things behave more consistently avoided unintended deep wrapping.

### Non-breaking Changes

#### New non-reactive Async SSR

I have now combined sync/streaming/async SSR into the same compiler output. To do so I have developed a new non-reactive Async SSR approach. After realizing how fast Solid renders, it occurred to me on the server we could do a much simpler approach if we were willing to re-render all content in Suspense boundaries. While that is some wasted work, compared to including the reactive system it's a killing.

#### Increase SSR Performance

Through reusing static strings in the template we reduce repeated creation costs. This small improvement can make 5-8% improvements where you have many rows.

#### Event Delegation

Solid is now being more strict on what events it delegates. Limiting to standard pointer/touch/mouse/keyboard events. Custom events will no longer be delegated automatically. This increases compatibility for Web Component users who don't compose their events. Non-delegated events will still work and binding array syntax with them.

#### State getters no longer memos

Automatic memos put some constraints on the disposal system that get in the way of making the approach flexible to hold all manner of reactive primitives. Some previous limitations included not being able to have nested getters. You can still manually create a memo and put it in a getter but the default will not be memoized.

### New Features

#### `children` helper

Resolves children and returns a memo. This makes it much easier to deal with children. Using same mechanism `<Switch>` can now have dynamic children like `<For>` inside.

#### "solid" Export Conidition

This is the way to package the JSX components to be compiled to work on server or client. By putting the "solid" condition the source JSX will be prioritized over normal browser builds.

### Bug Fixes

- Top level primitive values not working with `reconcile`
- Fix Dynamic Components to handle SVG
- Rename potentially conflicting properties for event delegtion
- Fixed State spreads to not loose reactiviy. Added support for dynamically created properties to track in spreads and helpers
- TypeScript, always TypeScript

## 0.23.0 - 2020-12-05

This release is mostly bug fixes. Breaking change for TS users. JSX types no longer pollutes global namespace. This means you need to update your projects to import it.

For users TS 4.1 or above add to your tsconfig to have JSX types in all your TSX files:

```js
"compilerOptions" {
  "jsx": "preserve",
  "jsxImportSource": "solid-js",
}
```

Or mixing and matching? You can set JSX types per file using the pragma at the top of each file:

```js
/* @jsxImportSource solid-js */
```

You can now import `JSX` types directly from Solid as neccessary:

```js
import { JSX } from "solid-js";
```

## 0.22.0 - 2020-11-14

### Unified Exports (Deprecation `solid-js/dom`)

Solid now has streamlined exports for isomorphic development. This means from now on using `solid-js/web` instead of `solid-js/dom`. Based on compiler options it will swap out the appropriate packages for web. You should only ever import `solid-js`, `solid-js/h`, `solid-js/html`, and `solid-js/web` directly in your code.

`solid-js/web` now exports an `isServer` field which indicates whether the code is executed for server rendering. This is constant in the respective packages meaning it can allow for powerful treeshaking/dead code elimination in final bundles even when used directly in end user code or 3rd party libraries.

### Dev Mode

Aliasing `solid-js` to `solid-js/dev` in your bundler links in a Dev mode of Solid. It's still a WIP process but it introduces some new APIs. First signals and state (and resources) have the ability to set a name for debug purposes as an options argument.

We also export a `serializeGraph` method which will serialize all the signals below the executing context in the reactive graph.

Finally there is a new `globalThis._$afterUpdate` hook that can be assigned that will be called after every render that can be used for tracking purposes.

This is just the start but it is my intention to develop these features to allow for better HMR and DevTools.

> Note: If the libraries are not being pulled into your bundle and are treated as external you may need to alias `solid-js` to `solid-js/dev` in your bundler in order to use dev mode.

### Self contained HyperScript/Lit Modules

We now ship the respective DOM expressions code. This makes it much easier to use directly from a CDN like Skypack. You literally can develop with Solid in the old school write it in notepad before npm was a thing sort of way.

```html
<html>
  <body>
    <script type="module">
      import { createSignal, onCleanup } from "https://cdn.skypack.dev/solid-js";
      import { render } from "https://cdn.skypack.dev/solid-js/web";
      import html from "https://cdn.skypack.dev/solid-js/html";

      const App = () => {
        const [count, setCount] = createSignal(0),
          timer = setInterval(() => setCount(count() + 1), 1000);
        onCleanup(() => clearInterval(timer));
        return html`<div>${count}</div>`;
      };
      render(App, document.body);
    </script>
  </body>
</html>
```

Save this in a text file called "site.html" and double click it and instant Solid in your browser.

### renderToWebStream

New `renderToWebStream` for synchronous SSR mode. This allows us to stream from things like Cloudflare Workers.

### createMutable

New mutable state primitive. Useful for interopt with other libraries. We can use this potentially for things like Vue/MobX compat. Or when we need to interact with libraries that can't be aware of Solid's reactive system, yet we want to capture updates. It supports getters and setters.

Use with caution as it can promote difficult to reason about code, anti-patterns, and unexpected performance cliffs. Keep in mind Vue and MobX care less about these inefficient patterns since they have a VDOM safety net. We do not. For advanced users only.

```js
const user = createMutable({
  firstName: "John",
  lastName: "Smith",
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  },
  set fullName(value) {
    const parts = value.split(" ");
    batch(() => {
      this.firstName = parts[0];
      this.lastName = parts[1];
    });
  }
});
console.log(user.fullName); // John Smith
user.fullName = "Jake Murray";
console.log(user.firstName); // Jake
```

### State Getter/Setters are now Wrapped

Getters are now wrapped in `createMemo` and setters in `batch`. However, this introduces a new limitation that they can only be top level to have this behavior.

### State compatible with Prop Helpers

You can now use state with `assignProps` and `splitProps` helpers.

### Removed DOM SSR

No longer supporting hydratable DOM SSR in patched(ie... JSDOM) node environments. Use the standard SSR methods instead. Can still run Solid in JSDOM for things like Jest, but can't be used for isomorphic development.

## 0.21.0 - 2020-10-17

### Attribute and Prop changes

We will now default to using Attributes where possible to be consistent. Solid is aiming to generally reflect the case insensitiveness of HTML. Custom Elements remain the one place that defaults to property setters on Dynamic elements.

While TypeScript 4.2 is yet to be released, we are introduce `attr`, `prop`, `use` and `style` namespace directives. To allow more expressiveness in binding syntax.

### Other Changes

- New `on` and `onMount` helpers
- More performant SSR escaping
- Lazy eval SSR Component props (fix SSR Context API)
- Add support for SSR with Solid Styled Components
- Fix Lit Dom Expressions style in Template tags
- Fix JSX Types

## 0.20.0 - 2020-09-24

### Re-scheduling Reactivity.

This release makes large changes to the Reactive System. Key changes are deferring `createEffect` to be after rendering and introducing `createComputed` do reactive graph updates like loading async data.

### Concurrency

In addition the reactive model brings updates to Suspense and Transitions. Solid now has true concurrent rendering at a granular level. This mechanism does differ from React as it currently only supports a single future.

### Removed APIs

`afterEffects`, `createDependentEffect`, and `suspend` have been removed as they no longer make sense with the new reactive system timing.

## 0.19.0 - 2020-08-23

API Changes to support better SSR

### Breaking Changes:

#### Set State

Mutable form is no longer a default. It was strangely inconsistent as you could accidentally mutate in immutable forms. No indicator why it should behave differently and work. Increased the size of `state` for everyone and added performance overhead with additional proxy wrapping. Also it was based on returning undefined meaning function forms could never return undefined to blank a vlue. Solid has changed it into a state setter modifier `produce` after ImmerJS naming.

```js
// top level
setState(produce(s => (s.name = "John")));

// nested
setState(
  "user",
  produce(s => (s.name = "John"))
);
```

#### Prop APIs

After writing `setDefaults`, `cloneProps`, and about to introduce `mergeProps` it became clear we can do this all with a single `assignProps` helper. So the former has been removed and now we have:

```js
// default props
props = assignProps({}, { name: "Smith" }, props);

// clone props
newProps = assignProps({}, props);

// merge props
assignProps(props, otherProps);
```

It follows the same pattern as ES `Object.assign` adding properties to the first argument and returning it. Except this method copies property descriptors without accessing them to preserve reactivity.

#### `freeze` & `sample` have been renamed

These APIs never had the most obvious naming, borrowing from SRP and digital circuit concepts rather than common english. They are now `batch` and `untrack` respectively which better reflect their purpose. These are now deprecated and will be removed in next minor version.

#### Resource API

For better automatic hydration support it is prudent to change resource signatures to take functions that return promises rather than promises themselves. This factory function has a lot advantages. This allows the library to decide whether to execute it or not. In certain cases we can choose skipping creating the promise altogether. It also leaves the door open for things like retry.

We use this mechanism to wire up streamed data from the server and automatic data hydration for resources rendered into the page in async SSR.

#### SSR Improvements

New experimental support for Suspense aware synchronous, asynchronous, and streaming SSR with hydration, progressive hydration, and automatic isomorphic data serialization. Completely removed what was there before with a simple static generator and more examples, so all existing projects using `solid-ssr` package will break with this release. This is a much better foundation, and I hope to build better things on top.

### New

#### State Getters

For convenience of passing derived values or external reactive expressions through Solid's state initializer you can now add `getter`'s.

```jsx
const [state, setState] = createState({
  firstName: "Jon",
  lastName: "Snow",
  get greeting() {
    return `You know nothing ${state.firstName} ${state.lastName}`;
  }
});

return <div>{state.greeting}</div>;
```

#### Control Flow

Dynamic allows swapping Component dynamically.

```jsx
// element tag name
const [comp, setComp] = createSignal("h1");

<Dynamic component={comp()} {...otherProps} />;

// Component
setComp(MyComp);
```

ErrorBoundary catches uncaught downstream errors and shows a fallback.

```jsx
<ErrorBoundary fallback={<div>Something went terribly wrong</div>}>
  <MyComp />
</ErrorBoundary>
```

#### Portals render in the Head

You can now render portals in the head with no additional div element.

#### Multi-version detection

Common hard to track issue with Solid is when multiple versions of the library are running on the same page. It breaks reactivity, and is sometimes difficult to notice. Solid now detects if a version has already been loaded at runtime and complains.

### Bug Fixes & Updates

Arguably a new feature but Solid now detects computation owners with pending dependency changes when trying to resolve nested computations. In so it will resolve those dependencies first. This fixes a long time issue with conditional processing with not directly related reactive atoms.

Improved TypeScript Types.

## 0.18.0 - 2020-05-01

A lot of bug fixes, and introduction of string based SSR.
Breaking Changes:

- Removal of `forwardRef`. Value and function handled by just `ref`.
- Change to how TypeScript is managed. Brought all JSX types inside the repo, and improved Component typing.
- Changed default renderer in `solid-ssr` to string renderer.

## 0.17.0 - 2020-03-24

A lot of consolidation in preparation for release candidate

- Big refactor of core reactive system and render list reconciler
  - Significantly smaller reducing core by atleast 3kb minified
- Better handling of nested reactive nodes in Fragments
- Update SSR mechanisms, added progressive event hydration, created repo for SSR environment (`solid-ssr`)
- `@once` compiler hint to statically bind values
- Better wrapping hueristics for booleans and ternaries in JSX

Breaking Changes

- Removed `transform` prop from control flow. Idiomatic approach is to make a HOC for transformations of this nature.
- Removed selectWhen/selectEach control flow transforms.
- Changed event system
  - `on____` prop to stop differentiating on case. Super confusing.Instead will try to delegate unless unable. Made TypeScript all CamelCase (although technically both forms behave identically)
  - Removed `model` event delegation approach. Instead to create bound event use array: `onClick={[handler, row.id]}`. Inspired by Inferno's `linkEvent` helper.
  - Renamed `events` prop to `on` prop
  - Added `onCapture` prop for capture events

## 0.16.0 - 2020-01-14

Big changes to experimental features:

- New resource API `createResource` and `createResourceState` to replace `loadResource`. These are built to prioritize read capabilities and simplify implementation.
- Support for Async SSR `renderToString` now returns a promise. Uses Suspense to know when it is done.
- Progressive Hydration with code splitting support. Ability to track events and replay as hydration completes to reduce "uncanny valley". Components can be lazily loaded even during hydration. **No support for async data on hydration yet**, so render it from server and load into state synchronously.
- New error boundary api with `onError`. If an error occurs in context or child context the nearest handler/s will be called.
- Deprecating the `force` `setState` modifier as it is confusing.

## 0.15.0 - 2019-12-16

A lot fixes and new features:

- Suspense improvements: `SuspenseList`, `useTransition`, trigger on read. Update API, and added `reload` and retry capability. Removed need for `awaitSuspense` by making `Show` and `Switch` control flows `Suspense` aware.
- Deprecate `selectWhen` and `selectEach`.
- Untrack all Components. No more fear of nesting Components in JSX expressions. Top level in a Component will always be inert now.
- Support for safe boolean and logical operators. This allows for the same optimization as the `Show` control flow for simple inline JSX conditionals like `<div>{state.count > 5 && <MyComp />}</div>`.
- Support for non-curried operator forms. All operators now support an accessor first form as well as the functional curried form. Ex `map(() => state.list, item => item)`
- Fix issues with spreading over `children` props.
- Better Type Definitions.

## 0.14.0 - 2019-11-16

v0.14.0 brings changes to the render runtime and `setState` API

- Adds diffing to batched computations to improve update performance
- Supports support for mutable(TypeScript safe) `setState` API inspired by Immer. Function setters in Solid now pass a mutable version of state. Modifying will schedule updates. This form must not return a value. It can still be used immutably simply by returning the new value.
- Changes how `force` and `reconcile` helpers work. They can now be used on nested paths.
- Removes support for multi-path `setState`.

## 0.13.0 - 2019-10-27

v0.13.0 contains large changes to the reactive system and compiler.

The main update is to simplify reactivity by removing computation recycling. While this was a useful feature to avoid unnecessary computation nodes, Solid now uses batching as a different approach to get similar results. Most templating libraries can offer breakneck update speeds without fine grained updates. The real cost of these top down approaches is the need to redo structural reconciliation. The current approach is that different computations will be created for each:

- Dynamic insert expression (any expression between tags)
- Spread operator
- JSX template entry point(Top level tag, Fragment, or Component Children)

To aid in performance simple text inserts the `textContent` binding is now optimized so they can be batched.

In addition there are some improvements to template cloning and SVG handing in SSR.

## 0.12.0 - 2019-10-18

v0.12.0 contains a breaking change to the reactive rendering system

- Removal of explicit dynamic binding, bindings will default to reactive unless impossible to be so (literal, function declaration, simple variable)
- SVG Camelcase attribute Support
- Prettier now supported!

## 0.11.0 - 2019-09-27

v0.11.0 continues to add updates to the reactive system as well as some new features:

- Fix reactivity resolution ordering on downstream conditionals
- Add basic (non-namespaced) SVG support
- Add experimental Server Side Rendering and Client Side Hydration capabilities
- Add Suspense aware control flow transformation (`awaitSuspense`)
- Allow state objects to track functions
- More TypeScript definition improvments and fixes

## 0.10.0 - 2019-08-11

v0.10.0 makes significant changes to the reactive system. Key updates:

- Fixed synchronicity on all hooks/control flows.
- Adds the ability to use comparators on `createMemo`.
- Fixes bugs with nested control flows.
- Fixes bugs with Suspense.
- Update Suspense `delayMs` to `maxDuration` to match React. (Usage of `maxDuration` still experimental)

## 0.9.0 - 2019-07-20

v0.9.0 makes signifigant changes to underlying reconciler.

- New Control Flow
- Removes Custom Directives
- New Functional Operators

## 0.8.0 - 2019-06-14

v0.8.0 brings further improvements in reducing bundle size and optimizations in reactivity. New Features:

- Universal loadResource API
- afterEffects hook
- Switch Control Flow

## 0.7.0 - 2019-05-25

v0.7.0 brings further improvements in tree shaking, Context API including Provide control flow, and suspense helpers for loading Async Components and Data.

This is a breaking change as in order to support this version, Solid has forked S.js the underlying library and now ships with it built in. This means Solid will no longer be compatible other S.js libraries. It is a turning point but enables the powerful new features.

## 0.6.0 - 2019-05-07

v0.6.0 brings a Tree Shakeable runtime. This means when Solid used with JSX the compiler can intelligently only include the code that is being used.

This is a breaking change in that:

- No longer need to import 'r' and selectWhen and selectEach directives have been moved to solid-js from solid-js/dom. You should not need to import from 'solid-js/dom' directly anymore as your compiled code will do it automatically.
- HyperScript and Lit imports have been made the default import now.. ex:

```js
import html from "solid-js/html";
```

- Tidied up the compiled template code. This should make it much nicer to debug when not minified.

## 0.5.0 - 2019-04-14

- Add support for multiple renderers (JSX, Tagged Template Literals, HyperScript). Added direct imports or 'solid-js/dom' alternatives 'solid-js/html' and 'solid-js/h'.
- Reorganized dependencies work.

## 0.4.2 - 2019-03-18

- Add fallbacks for control flow
- Add new Portal Control Flow - This allows nodes to be rendered outside of the component tree with support for satelite ShadowRoots.
- Add new Suspend Control Flow - This renders content to a isolated document and display fallback content in its place until ready. Good for nested Async Data Fetching.
- Default node placeholders to comments (improved text interpolation)
- Added events binding for irregular event names

## 0.4.0 - 2019-02-16

- Rename API to create\_\_ to be semantically correct
- Added implicit event delegation

## 0.3.8 - 2019-01-31

- Add support for HyperScript

## 0.3.7 - 2019-01-16

- Improved data reconciler performance
- Added data reconciler options

## 0.3.4 - 2019-01-04

- Added optional comparator for signals.
- Removed redundant type checks and extra function calls.
- Changed S.js to a dependency instead of a peer dependency.

## 0.3.2 - 2018-12-30

- Separated useSignal getter/setters for clearer more consistent API

## 0.3.1 - 2018-12-29

- Remove operators from core package since are auxilliary with new API.
- Updated JSX Dom Expressions to use new control flow JSX and JSX Fragment support.

## 0.3.0 - 2018-12-25

- New setState API inspired by Falcor paths to handle ranges.
- Reduction in API to remove State object functions and change to explicit methods.
- Expose reconcile method to do deep differences against immutable data sources (previously automatically done for selectors).
- Removed 'from' operators as limited usefulness with new patterns.

## 0.2.0 - 2018-11-13

- Large simplifications to remove inconsistency around wrapping and unwrapping values. State values are always wrapped get, and fully unwrapped on set.
- Updated binding syntax. Dynamic expressions are now bound with an inner parenthesis `{( )}`js
- Removed Immutable State object. May attempt something similar in the future but at this time it wasn't worth the effort trying to attempt both. There are better approaches to Proxy Immutable data structures.


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or
  advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
  address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at community@solidjs.com. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the project community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

[homepage]: http://contributor-covenant.org


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to SolidJS

Thank you for investing your time in contributing to our project! ✨.

Read our [Code of Conduct](https://github.com/solidjs/solid/blob/main/CODE_OF_CONDUCT.md) to keep our community approachable and respectable. Solid accepts a number of contributions from the broader community. More hands indeed make lighter work. We're however selective of the types of contributions we receive.

This usually involves vetting code quality, current focus, alignment with team philosophies etc. It's typically a good idea to submit a proposal for a change before spending time implementing it. This is to ensure that your efforts align with the current needs or more practically that work isn't completed by multiple contributors.

Note: If you would like your project listed here please submit a PR or contact a core/ecosystem member on Discord.

## Team Structure & Organization

There are a lot of opportunities to get involved. We organize Solid community efforts via Discord and typically onboard dedicated contributors into focused teams:

- Docs (headed by [@LadyBluenotes](https://github.com/ladybluenotes))
- Infrastructure (headed by [@davedbase](https://github.com/davedbase))
- Advocacy (headed by [@hindsight](https://github.com/eslachance))
- Growth (headed by [@davedbase](https://github.com/davedbase))
- Translators (headed by [@davedbase](https://github.com/davedbase))

Most team members are part of the Ecosystem Team or Core Team. Entry into these groups is selected by Core Members only. We do not accept applications or requests for entry. Selections are made ad-hoc according to internal needs. Selections are typically announced at Community Meetings which occur quarterly.

## Meetings and Schedules

SolidJS team members organize via Discord chat and audio channels. Channels exist to manage these conversations and threads within channels are used to focus on specific topics. A number of meetings occur weekly between each group however there is no set cadence or recurring schedule. Typically attendance for team members is requested to maintain membership, however we respect and recognize OSS contributions are typically ad hoc and as can be given by our members and generous donors.

## Official Opportunities

As a growing community, Solid has an on-going need for developers, writers, designers and general thought leaders. The following is a list of openings and tasks that Core attempts to maintain often.

### Docs Team

  To get involved, check out our [Contributing Guide](https://github.com/solidjs/solid-docs-next/blob/main/CONTRIBUTING.md) in the new docs repository!
  
- General/Core Docs
  - Write new drafts for the new docs repo
  - Work on the infrastructure for the new docs site
  - Create videos, diagrams, and other multimedia content
- Solid Start 1.0 API
  - Draft an initial, comprehensive set of docs for Solid Start
  - This currently takes place in [this subfolder](https://github.com/solidjs/solid-docs-next/tree/main/content/start) on `solid-docs-next`

### Infrastructure Team

- Solid Site
  - Help maintain the current Solid website by implementing bugs, testing and reporting issues
  - Port the current website from being an SPA to Solid Start
  - Website redevelopment project for 2.0
- Solid Service API
  - Help implement our API service that powers solid REPL
  - Test, validate and implement security and bug fixes
  - Add new missing features
- Develop new Solid Docs platform and website
  - Help coordinate creating MDX components
  - Developer infrastructure for delivering future community documentation platform
- Solidex (our ecosystem directory)
  - How maintain a list of ecosystem projects and resources (articles, podcasts etc.)
  - Vet incoming PR from submissions and merge + deploy updated the directory
  - Improve workflow and systems for managing Solidex
  - Implement an API (via Solid Service API) to search and filter resources
- Solid Dev Tools
  - We're actively looking for individuals to prototype and experiment on a set of developer tools.

### Solid Start Team

Solid Start is our new meta framework that focuses on enhancing Solid's DX story and general usability. Similar to SvelteKit, Next and other meta frameworks, this project is considered a primary core supported effort. Solid Start is approaching its beta release and we're looking for developers to test, validate and build on top of it. Join the #solid-start channel on Discord or the [solid-start](https://github.com/solidjs/solid-start) to learn more.

## Ecosystem Opportunities

SolidJS core members maintain a separate project called [SolidJS Community](https://github.com/solidjs-community). This is a large and lush ecosystem community project that encompasses a number of critical core tooling such as Solid Primitives, Solid Aria (similar to React Aria) etc.

The following are projects looking for leaders or support:

- [**Solid Aria**](https://github.com/solidjs-community/solid-aria) (lead by [@fabien-ml](https://github.com/fabien-ml)): A port of React Aria.
- [**Solid Examples**](https://github.com/solidjs-community/solid-examples) (lead by [@foolswisdom](https://github.com/mosheduminer)): A list of examples, patterns and app implementations.
- [**Solid Codemod**](https://github.com/solidjs-community/solid-codemod) (lead by [@trivikr](https://github.com/trivikr)): Convert React or other libraries to Solid automatically.
- [**Solid Snippets**](https://github.com/solidjs-community/solid-snippets) (lead by [@thetarnav](https://github.com/thetarnav)): VSCode snippet library.
- [**Solid DSL**](https://github.com/solidjs-community/solid-dsl) (lead by [@davedbase](https://github.com/davedbase)): A project to explore enhancing JSX or other DSL options.
- [**Solid Primitives**](https://github.com/solidjs-community/solid-primitives) (lead by [@davedbase](https://github.com/davedbase)): A large primitives (hooks) library.

Contributing to ecosystem projects is just as important as contributing to Solid core projects. As Solid grows a lush, well supported and high-quality set of packages and learning materials will benefit it's users and future viability.

## Where do I start?

If you haven't found any interesting information on this page then we encourage you to start hacking at a Solid related utility or package that does. Building useful tools for fellow OSS ecosystem and Solid users enhances the whole platform.

We can't wait to see what you build!

## Building Solid

This repository uses [pnpm](https://pnpm.io/) and
[Turborepo](https://turborepo.org/).
If you want to build Solid from scratch, use the following steps:

1. `corepack enable` (use the correct version of PNPM, https://nodejs.org/api/corepack.html#enabling-the-feature)
2. `pnpm install` (install all dependencies)
3. `pnpm build`

You can then run all tests via `pnpm test`.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2016-2025 Ryan Carniato

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<p>
  <img src="https://assets.solidjs.com/banner?project=Library&type=core" alt="SolidJS" />
</p>

[![Build Status](https://img.shields.io/github/actions/workflow/status/solidjs/solid/main-ci.yml?branch=main&logo=github&style=for-the-badge)](https://github.com/solidjs/solid/actions/workflows/main-ci.yml)
[![Coverage Status](https://img.shields.io/coveralls/github/solidjs/solid.svg?style=for-the-badge)](https://coveralls.io/github/solidjs/solid?branch=main)

[![NPM Version](https://img.shields.io/npm/v/solid-js.svg?style=for-the-badge)](https://www.npmjs.com/package/solid-js)
[![](https://img.shields.io/npm/dm/solid-js.svg?style=for-the-badge)](https://www.npmjs.com/package/solid-js)
[![Discord](https://img.shields.io/discord/722131463138705510?style=for-the-badge)](https://discord.com/invite/solidjs)
[![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/solidjs?style=for-the-badge)](https://www.reddit.com/r/solidjs/)

**[Website](https://www.solidjs.com/) • [API Docs](https://docs.solidjs.com/) • [Features Tutorial](https://www.solidjs.com/tutorial/introduction_basics) • [Playground](https://playground.solidjs.com/?version=1.3.13#NobwRAdghgtgpmAXGGUCWEwBowBcCeADgsrgM4Ae2YZA9gK4BOAxiWGjIbY7gAQi9GcCABM4jXgF9eAM0a0YvADo1aAGzQiAtACsyAegDucAEYqA3EogcuPfr2ZCouOAGU0Ac2hqps+YpU6DW09CysrGXoIZlw0WgheAGEGCBdGAAoASn4rXgd4sj5gZhTcLF4yOFxkqNwAXV4AXgcnF3cvKDV0gAZMywT8iELeDEc4eFSm3iymgD4KqprU9JLamYBqXgBGPvCBoVwmBPTcvN4AHhN6XFx43gJiRpUrm-iVXnjEjWYAa0aQUZCCa4SSzU5nfirZaZSTgi76F63CBgga7CCwiBWISicTpGaNebnJZpXj6WblES0Zj0YEAOg8VQAompxsJcAAhfAASREJzAUEIhBUmTRYEkdSAA) • [Discord](https://discord.com/invite/solidjs)**

Solid is a declarative JavaScript library for creating user interfaces. Instead of using a Virtual DOM, it compiles its templates to real DOM nodes and updates them with fine-grained reactions. Declare your state and use it throughout your app, and when a piece of state changes, only the code that depends on it will rerun.

## At a Glance
```tsx
import { createSignal } from "solid-js";
import { render } from "solid-js/web";

function Counter() {
  const [count, setCount] = createSignal(0);
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");

  return (
    <>
      <button onClick={() => setCount(c => c + 1)}>
        {doubleCount()}
      </button>
    </>
  );
}

render(Counter, document.getElementById("app")!);
```

Try this code in our [playground](https://playground.solidjs.com/anonymous/0c88df54-91b0-4c88-bd20-e962bde49725)!

<details>
<summary>Explain this!</summary>

```tsx
import { createSignal } from "solid-js";
import { render } from "solid-js/web";

// A component is just a function that returns a DOM node
function Counter() {
  // Create a piece of reactive state, giving us an accessor, count(), and a setter, setCount()
  const [count, setCount] = createSignal(0);
  
  //To create derived state, just wrap an expression in a function
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");

  // JSX allows you to write HTML within your JavaScript function and include dynamic expressions using the { } syntax
  // The only part of this that will ever rerender is the doubleCount() text.
  return (
    <>
      <button onClick={() => setCount(c => c + 1)}>
        Increment: {doubleCount()}
      </button>
    </>
  );
}

// The render function mounts a component onto your page
render(Counter, document.getElementById("app")!);
```

Solid compiles your JSX down to efficient real DOM updates. It uses the same reactive primitives (`createSignal`) at runtime but making sure there's as little rerendering as possible. Here's what that looks like in this example:

```js
import { template as _$template } from "solid-js/web";
import { delegateEvents as _$delegateEvents } from "solid-js/web";
import { insert as _$insert } from "solid-js/web";
//The compiler pulls out any static HTML
const _tmpl$ = /*#__PURE__*/_$template(`<button>Increment: `);

import { createSignal, createEffect } from "solid-js";
import { render } from "solid-js/web";

function Counter() {
  const [count, setCount] = createSignal(0);
  
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");
  
  return (() => {
    //_el$ is a real DOM node!
    const _el$ = _tmpl$();
    _el$.$$click = () => setCount(c => c + 1);
     //This inserts the count as a child of the button in a way that allows count to update without rerendering the whole button
    _$insert(_el$, doubleCount);
    return _el$;
  })();
}
render(Counter, document.getElementById("app"));
_$delegateEvents(["click"]);
```

</details>

## Key Features

- Fine-grained updates to the real DOM
- Declarative data: model your state as a system with reactive primitives
- Render-once mental model: your components are regular JavaScript functions that run once to set up your view
- Automatic dependency tracking: accessing your reactive state subscribes to it
- [Small](https://dev.to/this-is-learning/javascript-framework-todomvc-size-comparison-504f) and [fast](https://krausest.github.io/js-framework-benchmark/current.html)
- Simple: learn a few powerful concepts that can be reused, combined, and built on top of
- Provides modern framework features like JSX, fragments, Context, Portals, Suspense, streaming SSR, progressive hydration, Error Boundaries and concurrent rendering.
- Naturally debuggable: A `<div>` is a real div, so you can use your browser's devtools to inspect the rendering
- [Web component friendly](https://github.com/solidjs/solid/tree/main/packages/solid-element#readme) and can author custom elements
- Isomorphic: render your components on the client and the server
- Universal: write [custom renderers](https://github.com/solidjs/solid/releases/tag/v1.2.0) to use Solid anywhere
- A growing community and ecosystem with active core team support

<details>
 
<summary>Quick Start</summary>

You can get started with a simple app by running the following in your terminal:

```sh
> npx degit solidjs/templates/js my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm
```

Or for TypeScript:

```sh
> npx degit solidjs/templates/ts my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm
```

This will create a minimal, client-rendered application powered by [Vite](https://vitejs.dev/).

Or you can install the dependencies in your own setup. To use Solid with JSX (_recommended_), run:

```sh
> npm i -D babel-preset-solid
> npm i solid-js
```

The easiest way to get set up is to add `babel-preset-solid` to your `.babelrc`, babel config for webpack, or rollup configuration:

```js
"presets": ["solid"]
```

For TypeScript to work, remember to set your `.tsconfig` to handle Solid's JSX:

```js
"compilerOptions": {
  "jsx": "preserve",
  "jsxImportSource": "solid-js",
}
```

</details>

## Why Solid?

### Performant

Meticulously engineered for performance and with half a decade of research behind it, Solid's performance is almost indistinguishable from optimized vanilla JavaScript (See Solid on the [JS Framework Benchmark](https://krausest.github.io/js-framework-benchmark/current.html)). Solid is [small](https://bundlephobia.com/package/solid-js@1.3.15) and completely tree-shakable, and [fast](https://levelup.gitconnected.com/how-we-wrote-the-fastest-javascript-ui-framework-again-db097ddd99b6) when rendering on the server, too. Whether you're writing a fully client-rendered SPA or a server-rendered app, your users see it faster than ever. ([Read more about Solid's performance](https://dev.to/ryansolid/thinking-granular-how-is-solidjs-so-performant-4g37) from the library's creator.)

### Powerful

Solid is fully-featured with everything you can expect from a modern framework. Performant state management is built-in with Context and Stores: you don't have to reach for a third party library to manage global state (if you don't want to). With Resources, you can use data loaded from the server like any other piece of state and build a responsive UI for it thanks to Suspense and concurrent rendering. And when you're ready to move to the server, Solid has full SSR and serverless support, with streaming and progressive hydration to get to interactive as quickly as possible. (Check out our full [interactive features walkthrough](https://www.solidjs.com/tutorial/introduction_basics).)

### Pragmatic

Do more with less: use simple, composable primitives without hidden rules and gotchas. In Solid, components are just functions - rendering is determined purely by how your state is used - so you're free to organize your code how you like and you don't have to learn a new rendering system. Solid encourages patterns like declarative code and read-write segregation that help keep your project maintainable, but isn't opinionated enough to get in your way.

### Productive

Solid is built on established tools like JSX and TypeScript and integrates with the Vite ecosystem. Solid's bare-metal, minimal abstractions give you direct access to the DOM, making it easy to use your favorite native JavaScript libraries like D3. And the Solid ecosystem is growing fast, with [custom primitives](https://github.com/solidjs-community/solid-primitives), [component libraries](https://kobalte.dev), and build-time utilities that let you [write Solid code in new ways](https://github.com/LXSMNSYC/solid-labels).

## More

Check out our official [documentation](https://docs.solidjs.com) or browse some [examples](https://github.com/solidjs/solid/blob/main/documentation/resources/examples.md)

## Browser Support

SolidJS Core is committed to supporting the last 2 years of modern browsers including Firefox, Safari, Chrome and Edge (for desktop and mobile devices). We do not support IE or similar sunset browsers. For server environments, we support Node LTS and the latest Deno and Cloudflare Worker runtimes.

<img src="https://saucelabs.github.io/images/opensauce/powered-by-saucelabs-badge-gray.svg?sanitize=true" alt="Testing Powered By SauceLabs" width="300"/>

## Community

Come chat with us on [Discord](https://discord.com/invite/solidjs)! Solid's creator and the rest of the core team are active there, and we're always looking for contributions.

### Contributors

<a href="https://github.com/solidjs/solid/graphs/contributors"><img src="https://opencollective.com/solid/contributors.svg?width=890&amp;button=false" style="max-width:100%;"></a>

### Open Collective

Support us with a donation and help us continue our activities. [[Contribute](https://opencollective.com/solid)]

<a href="https://opencollective.com/solid/backer/0/website" target="_blank"><img src="https://opencollective.com/solid/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/1/website" target="_blank"><img src="https://opencollective.com/solid/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/2/website" target="_blank"><img src="https://opencollective.com/solid/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/3/website" target="_blank"><img src="https://opencollective.com/solid/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/4/website" target="_blank"><img src="https://opencollective.com/solid/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/5/website" target="_blank"><img src="https://opencollective.com/solid/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/6/website" target="_blank"><img src="https://opencollective.com/solid/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/7/website" target="_blank"><img src="https://opencollective.com/solid/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/8/website" target="_blank"><img src="https://opencollective.com/solid/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/9/website" target="_blank"><img src="https://opencollective.com/solid/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/10/website" target="_blank"><img src="https://opencollective.com/solid/backer/10/avatar.svg"></a>

### Sponsors

Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/solid#sponsor)]

<a href="https://opencollective.com/solid/sponsor/0/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/1/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/2/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/3/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/4/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/5/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/6/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/7/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/8/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/9/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/10/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/11/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/12/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/12/avatar.svg"></a>


================================================
FILE: documentation/resources/examples.md
================================================
# Examples

## Online
- [Counter](https://codesandbox.io/s/8no2n9k94l) Simple Counter
- [Simple Todos](https://codesandbox.io/s/lrm786ojqz) Todos with LocalStorage persistence
- [Simple Routing](https://codesandbox.io/s/jjp8m8nlz5) Use 'switch' control flow for simple routing
- [Scoreboard](https://codesandbox.io/s/solid-scoreboard-sjpje) Make use of hooks to do some simple transitions
- [Tic Tac Toe](https://playground.solidjs.com/anonymous/335adbcd-289e-42f8-9a9c-152a96277747) Simple Example of the classic game
- [Form Validation](https://codesandbox.io/s/solid-form-validation-2cdti) HTML 5 validators with custom async validation
- [CSS Animations](https://codesandbox.io/s/basic-css-transition-36rln?file=/index.js) Using Solid Transition Group
- [Styled Components](https://codesandbox.io/s/solid-styled-components-yv2t1) A simple example of creating Styled Components.
- [Styled JSX](https://codesandbox.io/s/solid-styled-jsx-xgx6b) A simple example of using Styled JSX with Solid.
- [Counter Context](https://codesandbox.io/s/counter-context-gur76) Implement a global store with Context API
- [Async Resource](https://codesandbox.io/s/2o4wmxj9zy) Ajax requests to SWAPI with Promise cancellation
- [Async Resource GraphQL](https://codesandbox.io/s/async-resource-graphql-r4rcx?file=/index.js) Simple resource for handling graphql request.
- [Suspense](https://codesandbox.io/s/5v67oym224) Various Async loading with Solid's Suspend control flow
- [Suspense Tabs](https://codesandbox.io/s/solid-suspense-tabs-vkgpj) Deferred loading spinners for smooth UX.
- [SuspenseList](https://codesandbox.io/s/solid-suspenselist-eorvk) Orchestrating multiple Suspense Components.
- [Redux Undoable Todos](https://codesandbox.io/s/pkjw38r8mj) Example from Redux site done with Solid.
- [Simple Todos Template Literals](https://codesandbox.io/s/jpm68z1q33) Simple Todos using Lit DOM Expressions
- [Simple Todos HyperScript](https://codesandbox.io/s/0vmjlmq94v) Simple Todos using Hyper DOM Expressions

## Demos
- [TodoMVC](https://github.com/solidjs/solid-todomvc) Classic TodoMVC example
- [Real World Demo](https://github.com/solidjs/solid-realworld) Real World Demo for Solid
- [Hacker News](https://github.com/solidjs/solid-hackernews) Hacker News Clone for Solid
- [Storybook](https://github.com/rturnq/storybook-solid) Solid with Storybook

## Benchmarks
- [JS Framework Benchmark](https://github.com/krausest/js-framework-benchmark/tree/master/frameworks/keyed/solid) The one and only
- [Sierpinski's Triangle Demo](https://github.com/ryansolid/solid-sierpinski-triangle-demo) Solid implementation of the React Fiber demo.
- [WebComponent Todos](https://github.com/shprink/web-components-todo/tree/main/solid) Showing off Solid Element
- [UIBench Benchmark](https://github.com/ryansolid/solid-uibench) a benchmark tests a variety of UI scenarios.
- [DBMon Benchmark](https://github.com/ryansolid/solid-dbmon) A benchmark testing ability of libraries to render unoptimized data.


================================================
FILE: package.json
================================================
{
  "name": "solid-js",
  "description": "A declarative JavaScript library for building user interfaces.",
  "version": "1.0.0",
  "author": "Ryan Carniato",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/solidjs/solid"
  },
  "private": true,
  "scripts": {
    "preinstall": "npx only-allow pnpm",
    "postinstall": "simple-git-hooks",
    "test": "turbo run test test-types",
    "coverage": "turbo run coverage",
    "build": "turbo run build",
    "types": "turbo run types",
    "publish": "pnpm run build && pnpm run types && pnpm run release:only",
    "bump": "changeset add",
    "release:only": "changeset publish",
    "format": "prettier --write --cache \"**/*.[tj]s?(x)\""
  },
  "devDependencies": {
    "@babel/cli": "^7.18.9",
    "@babel/core": "^7.20.12",
    "@babel/preset-env": "^7.18.9",
    "@babel/preset-typescript": "^7.18.6",
    "@changesets/cli": "^2.25.2",
    "@rollup/plugin-babel": "^6.0.3",
    "@rollup/plugin-commonjs": "^24.0.0",
    "@rollup/plugin-json": "^6.0.0",
    "@rollup/plugin-node-resolve": "^15.0.1",
    "@rollup/plugin-replace": "^5.0.2",
    "@types/node": "^22.7.5",
    "@vitest/coverage-v8": "^2.1.2",
    "babel-plugin-jsx-dom-expressions": "^0.40.3",
    "coveralls": "^3.1.1",
    "csstype": "^3.1.0",
    "dom-expressions": "0.40.4",
    "hyper-dom-expressions": "0.40.4",
    "jsdom": "^25.0.1",
    "lit-dom-expressions": "0.40.4",
    "ncp": "^2.0.0",
    "npm-run-all": "^4.1.5",
    "prettier": "^3.6.2",
    "rimraf": "^3.0.2",
    "rollup": "^4.24.0",
    "rollup-plugin-cleanup": "^3.2.1",
    "rollup-plugin-copy": "^3.4.0",
    "seroval": "~1.5.0",
    "simple-git-hooks": "^2.8.1",
    "symlink-dir": "^5.0.1",
    "tsconfig-replace-paths": "^0.0.11",
    "turbo": "^1.3.1",
    "typescript": "~5.7.2",
    "vite-plugin-solid": "^2.6.1",
    "vitest": "^2.1.2"
  },
  "simple-git-hooks": {
    "pre-commit": "pnpm run format"
  },
  "pnpm": {
    "overrides": {
      "babel-preset-solid": "workspace:*"
    }
  },
  "engines": {
    "pnpm": "^9.15.0"
  },
  "packageManager": "pnpm@9.15.0"
}


================================================
FILE: packages/babel-preset-solid/CHANGELOG.md
================================================
# babel-preset-solid

## 1.9.10

### Patch Changes

- 6c92555: Update dom-expressions, seroval plugins, optional chaining ref, style optimization
- Updated dependencies [2270ae9]
- Updated dependencies [94d87f1]
- Updated dependencies [3114302]
- Updated dependencies [6c92555]
  - solid-js@1.9.10

## 1.9.9

### Patch Changes

- c07887c: fix #2524 closedby types, fix regression inlining style/classList
- Updated dependencies [f59ee48]
- Updated dependencies [62c5a98]
- Updated dependencies [62c5a98]
- Updated dependencies [c07887c]
  - solid-js@1.9.9

## 1.9.8

### Patch Changes

- 2cd810f: compiler and jsx type updates
  - fix: ssr style undefined
  - fix: ssr double escaped array
  - fix: skip jsxImportSource skipping transform
  - fix: @once on style, classlist
  - JSX type updates
  - Update Universal Renderer Types

## 1.9.6

### Patch Changes

- 8356213: update compiler config, fix boolean attribute regression, update JSX types

## 1.9.5

### Patch Changes

- 35266c1: JSX type updates, preliminary MathML support, fix spread overescaping

## 1.9.3

### Patch Changes

- 9b70a15: validation fixes, type updates, ssr attribute fix

## 1.9.2

### Patch Changes

- 22aff14: update validation: smaller lib, opt out, better table handling
  add `on:` event types for native events

## 1.9.0

### Minor Changes

- 2a3a1980: update dom-expressions
  - Improved Custom Element/Shadow DOM traversal - @olivercoad
  - Better heuristic to determine when to importNode - @titoBouzout
  - handleEvent syntax to allow custom event properties when not delegated - @titoBouzout
  - support for bool: attribute namespace - @titoBouzout
  - add "is" as detection for custom element - @titoBouzout
  - fix missing exports in different envs - @trusktr
  - better hydration mismatch errors - @ryansolid
  - improved HTML validation of JSX partials - @titoBouzout

## 1.8.22

### Patch Changes

- 26128ec0: fix #2259 attr: in ssr, updates some types

## 1.8.19

### Patch Changes

- 816a5c61: fix #2209 processing parent before child value binding in select
- 424a31a3: optimize hydration keys

## 1.8.18

### Patch Changes

- 6693b56f: update TS, custom elements, and a lot compiler fixes
  fixes #2144, #2145, #2178, #2192

## 1.8.17

### Patch Changes

- 72c5381d: fix #2134, merge dom expressions fix #2136, fix #2137, fix #2110

## 1.8.16

### Patch Changes

- 071cd42f: fix #2100, fix #2102 - hydration errors due to over optimization

## 1.8.15

### Patch Changes

- 4ee461dc: improve template escaping, fragment hydration, SVG use types

## 1.8.12

### Patch Changes

- 85b26c36: fix #2041, fix #2043 - async renderer timing, numeric prop literals

## 1.8.9

### Patch Changes

- 80d4830f: fix #2016 value spread, smaller build output

## 1.8.8

### Patch Changes

- 968e2cc9: update seroval, fix #1972, fix #1980, fix #2002, support partial ALS

## 1.8.6

### Patch Changes

- 54e1aecf: update seroval, fix this, optimize star imports, fix #1952 hydration race condition

## 1.8.4

### Patch Changes

- cf0542a4: fix #1927, fix #1929, fix #1931, update storage API

## 1.8.2

### Patch Changes

- dd492c5e: fix #1917, fix #1918 error handling with serialization

## 1.8.0

### Minor Changes

- 2c087cbb: update to seroval streaming serializer, change ssr markers
- 2c087cbb: hydration perf improvement, fix #1849

### Patch Changes

- 2c087cbb: remove attribute quotes in template, batch serialization
- 2c087cbb: improved serialization/guards, fix #1413, fix #1796 hydration with lazy

## 1.8.0-beta.2

### Minor Changes

- e3a97d28: hydration perf improvement, fix #1849

## 1.8.0-beta.1

### Patch Changes

- f6d511db: remove attribute quotes in template, batch serialization

## 1.8.0-beta.0

### Minor Changes

- d8e0e8e8: update to seroval streaming serializer, change ssr markers

### Patch Changes

- bf09b838: improved serialization/guards, fix #1413, fix #1796 hydration with lazy

## 1.7.12

### Patch Changes

- 10ac07af: update jsx types, iife compiler optimization

## 1.7.7

### Patch Changes

- e660e5a3: add prettier code format in git-commit-hook

## 1.7.4

### Patch Changes

- 91110701: fix element/test mismatch issues #1684, #1697, #1707
  fix solid-ssr types
  add missing JSX types #1690
  fix firefox iframe #1688

## 1.7.3

### Patch Changes

- 655f0b7e: fix attr in ssr spread, fix static undefined classList values, fix #1666 directives in TTLs

## 1.7.2

### Patch Changes

- 699d88eb: More thorough close tag ommission fix

## 1.7.1

### Patch Changes

- d4087fe7: fix 1663: template element closing errors

## 1.7.0

### Minor Changes

- f7dc355f: Remove FunctionElement from JSX.Element types
- 940e5745: change to seroval serializer, better ssr fragment fixes
- 2b80f706: Reduce DOM compiler output size
  Remove auxilary closing tags and lazy evaluate templates
- 74f00e15: Support prop/attr directives in spreads, apply prop aliases only to specific elements

### Patch Changes

- 41ca6522: fixes around templates and hydration
- 3de9432c: Better Input Event Types, Template Pruning, Universal Renderer Fixes
- a382c0c5: minify inline style, class
- 6a4fe46c: fix #1553 improper html entity encoding in literal expressions

## 1.7.0-beta.5

### Patch Changes

- a382c0c5: minify inline style, class

## 1.7.0-beta.4

### Patch Changes

- 3de9432c: Better Input Event Types, Template Pruning, Universal Renderer Fixes

## 1.7.0-beta.3

### Patch Changes

- 41ca6522: fixes around templates and hydration

## 1.7.0-beta.2

### Minor Changes

- 940e5745: change to seroval serializer, better ssr fragment fixes

## 1.7.0-beta.1

### Minor Changes

- 2b80f706: Reduce DOM compiler output size
  Remove auxilary closing tags and lazy evaluate templates
- 74f00e15: Support prop/attr directives in spreads, apply prop aliases only to specific elements

## 1.7.0-beta.0

### Minor Changes

- f7dc355: Remove FunctionElement from JSX.Element types

### Patch Changes

- 6a4fe46: fix #1553 improper html entity encoding in literal expressions

## 1.6.16

### Patch Changes

- d10da016: Fix #1651 hydration markers introduced too early

## 1.6.13

### Patch Changes

- 60f8624d: fix #1596 ssr fragment text merge, fix #1599 ssr onCleanup

## 1.6.12

### Patch Changes

- 676ed331: docs: fix typos
- 081ca06c: fix #1553 html encoding for native strings on components
- 4fdec4f9: fix #1564, fix #1567 template literal bugs

## 1.6.10

### Patch Changes

- 7ab43a4: fix #1492 SSR Spread Breaks Hydration
  fix #1495 runWithOwner not clearing listener
  fix #1498 unrecoverable error in async batch

## 1.6.9

### Patch Changes

- a572c12: Streaming without a wrapper and compile time JSX validation

## 1.6.7

### Patch Changes

- 89baf12: fix boolean escaping, improve ssr performance

## 1.6.6

### Patch Changes

- 2119211: fix #1423 - inlined arrow functions in SSR and update rollup

## 1.6.3

### Patch Changes

- e95e95f: Bug fixes and testing changelog


================================================
FILE: packages/babel-preset-solid/README.md
================================================
# babel-preset-solid
Babel preset to transform JSX into Solid runtime calls.

### Install

Via NPM

```javascript
npm install babel-preset-solid --save-dev
```

or Yarn

```javascript
yarn add babel-preset-solid --dev
```

### Usage

Make or update your .babelrc config file with the preset:

```javascript
{
  "presets": [
    "solid"
  ]
}
```

Via package.json

```javascript
   ...
   "babel": {
     "presets": [
       "es2015",
       "solid"
     ],
     "plugins": [
     ]
   },
   ...
```

### Usage for SSR code
When need to transform JSX code to be used on the server, pass the following options

```javascript
{
  "presets": [
    ["solid", { "generate": "ssr", "hydratable": true }]
  ]
}
```
And for the browser build pass the hydratable option as well:
```javascript
{
  "presets": [
    ["solid", { "generate": "dom", "hydratable": true }]
  ]
}
```


================================================
FILE: packages/babel-preset-solid/index.js
================================================
const jsxTransform = require("babel-plugin-jsx-dom-expressions");

module.exports = function (context, options = {}) {
  const plugins = [
    [
      jsxTransform,
      Object.assign(
        {
          moduleName: "solid-js/web",
          builtIns: [
            "For",
            "Show",
            "Switch",
            "Match",
            "Suspense",
            "SuspenseList",
            "Portal",
            "Index",
            "Dynamic",
            "ErrorBoundary"
          ],
          contextToCustomElements: true,
          wrapConditionals: true,
          generate: "dom"
        },
        options
      )
    ]
  ];

  return {
    plugins
  };
};


================================================
FILE: packages/babel-preset-solid/package.json
================================================
{
  "name": "babel-preset-solid",
  "version": "1.9.10",
  "description": "Babel preset to transform JSX for Solid.js",
  "author": "Ryan Carniato <ryansolid@gmail.com>",
  "homepage": "https://github.com/solidjs/solid/blob/main/packages/babel-preset-solid#readme",
  "license": "MIT",
  "repository": "https://github.com/solidjs/solid/blob/main/packages/babel-preset-solid",
  "main": "index.js",
  "files": [
    "index.js"
  ],
  "scripts": {
    "test": "node test.js"
  },
  "dependencies": {
    "babel-plugin-jsx-dom-expressions": "^0.40.3"
  },
  "peerDependencies": {
    "@babel/core": "^7.0.0",
    "solid-js": "^1.9.10"
  },
  "peerDependenciesMeta": {
    "solid-js": {
      "optional": true
    }
  }
}


================================================
FILE: packages/babel-preset-solid/test.js
================================================
const babel = require("@babel/core");
const preset = require(".");
const assert = require("assert");

const { code } = babel.transformSync("const v = <div a b={2} />;", {
  presets: [preset],
  babelrc: false,
  compact: true
});

assert.equal(
  code,
  'import{template as _$template}from"solid-js/web";var _tmpl$=/*#__PURE__*/_$template(`<div a b=2>`);const v=_tmpl$();'
);
console.log("passed");


================================================
FILE: packages/solid/.npmignore
================================================
types/tsconfig.tsbuildinfo


================================================
FILE: packages/solid/CHANGELOG.md
================================================
# solid-js

## 1.9.11

### Patch Changes

- 6628d9f: Update dom-expressions/seroval to latest

## 1.9.10

### Patch Changes

- 2270ae9: Fix: Collision during SSR in createResource due to `loading` property.
- 94d87f1: Update `build:clean` and `types:clean` script to include missing paths
- 3114302: Improve `splitProps` performance
- 6c92555: Update dom-expressions, seroval plugins, optional chaining ref, style optimization

## 1.9.9

### Patch Changes

- f59ee48: fix dynamic overtracking
- 62c5a98: Update `SuspenseList` to handle hydration context
- 62c5a98: Add unit tests for `resolveSSRNode` and `createResource` functions
- c07887c: fix #2524 closedby types, fix regression inlining style/classList

## 1.9.8

### Patch Changes

- 09a9c1d: Export RendererOptions and Renderer types from solid-js/universal
- 472c007: fix(scheduler): adjust yield timing logic to improve task scheduling …
- 3d3207d: fix #2491 no key on merge false
- 2cd810f: compiler and jsx type updates
  - fix: ssr style undefined
  - fix: ssr double escaped array
  - fix: skip jsxImportSource skipping transform
  - fix: @once on style, classlist
  - JSX type updates
  - Update Universal Renderer Types
- cbff564: feat: createMutable support for class inheritance
- e056eab: add support for `is` in `Dynamic`, closes #2413
- bdba4dc: Fix resource instances always getting cached on SSR
- Updated dependencies [2cd810f]
  - babel-preset-solid@1.9.8

## 1.9.7

### Patch Changes

- 84ca952: Fix hydration issues caused by seroval update.
- 4cd7eb1: Catch synchronous errors in `createResource`.

## 1.9.6

### Patch Changes

- 362e99f: fix #2444 prev value in memo messing with reactive rendering
- 8356213: update compiler config, fix boolean attribute regression, update JSX types
- c65faec: fix #2428 - owner always present in resource fetcher
- 6380b01: fix #2399: novalidate, #2460 spellcheck types

## 1.9.5

### Patch Changes

- 86ae8a9: add optional initalValue argument to `from` helper
- 89e016d: dev: Add `internal` flag to signal
- 9431b88: Mirror createDynamic for SSR
- 35266c1: JSX type updates, preliminary MathML support, fix spread overescaping
- 0eab77d: Removed unnecessary evaluations of <Show> and <Match> conditions.
- fff8aed: Update typescript to 5.7
- f9ef621: dev: Add afterRegisterGraph hook replacing afterCreateSignal

## 1.9.4

### Patch Changes

- b93956f: fix escaping in resolution done outside of DOM Expressions
- 199dd69: fix reconcile null guard
- 7f9cd3d: lazy image, tagged template detection, security fixes
- 32aa744: Improve resolving arguments in createResource

## 1.9.3

### Patch Changes

- bb6ce8b: Reordering setter overloads
- 9b70a15: validation fixes, type updates, ssr attribute fix

## 1.9.2

### Patch Changes

- 22aff14: update validation: smaller lib, opt out, better table handling
  add `on:` event types for native events
- e2e2a03: Fix setter type compatibility with kobalte select and add tests

## 1.9.1

### Patch Changes

- fb67b687: fix anchor host interfering with event delegation
- 7ecf92d3: fix #2304 component props can be string, explicit imports in tests

## 1.9.0

### Minor Changes

- 4f8597dc: better handling of exports client/server
- 120bf06d: fix!: Remove browser field from package.json
- 2a3a1980: update dom-expressions
  - Improved Custom Element/Shadow DOM traversal - @olivercoad
  - Better heuristic to determine when to importNode - @titoBouzout
  - handleEvent syntax to allow custom event properties when not delegated - @titoBouzout
  - support for bool: attribute namespace - @titoBouzout
  - add "is" as detection for custom element - @titoBouzout
  - fix missing exports in different envs - @trusktr
  - better hydration mismatch errors - @ryansolid
  - improved HTML validation of JSX partials - @titoBouzout

### Patch Changes

- 80b09589: Improve signal setter type for code completion of string literal unions.
- 51bec61a: update TS to NodeNext

## 1.8.23

### Patch Changes

- bc20a4ce: update types, fix hydration cancel timing error, sync ssr script appending
- 9697c94b: jsdoc: Fix incorrect links of reactive utility `on`
- 9e192d7e: fix #2282: Add Check for Proxy support
- 379293d9: use correct hydration id in server lazy
- 73c00927: Fix missing code block end in `useTransition`'s jsdoc comment
- e4b2c668: fix missing disposal of nested transition nodes
- 94929afa: fix wrapping of object with `null` prototype

## 1.8.22

### Patch Changes

- f8ae663c: Fix broken links in Readme
- 19d0295f: fix stranded effects during hydration cancelation
- 26128ec0: fix #2259 attr: in ssr, updates some types

## 1.8.21

### Patch Changes

- a036a63a: shortcut hydrate call when hydration is done

## 1.8.20

### Patch Changes

- c8fe58e9: fix #2250 hydration error, fix lazy component loading, better hydration cancelation
- 80dd2769: fix #2236 improper shortcircuit in resource hydration

## 1.8.19

### Patch Changes

- 3fc015c2: track length in array helpers, fix mobx external source
- f909c1c1: fix #2228 - chained resources with initial values
- 816a5c61: fix #2209 processing parent before child value binding in select
- 424a31a3: optimize hydration keys

## 1.8.18

### Patch Changes

- 6693b56f: update TS, custom elements, and a lot compiler fixes
  fixes #2144, #2145, #2178, #2192
- a8c2a8f3: remove weird server resource hack, fix hydrated resource state

## 1.8.17

### Patch Changes

- 72c5381d: fix #2134, merge dom expressions fix #2136, fix #2137, fix #2110
- e065e475: fix #2135 ssr of top level fragments under Suspense

## 1.8.16

### Patch Changes

- 8de75a47: fix #2065 forward initial value to `on`
- 071cd42f: fix #2100, fix #2102 - hydration errors due to over optimization
- 3212f74d: Adjust some JSDocs

## 1.8.15

### Patch Changes

- 829af663: fix #2047 early interaction/multiple resources
- 4ee461dc: improve template escaping, fragment hydration, SVG use types

## 1.8.14

### Patch Changes

- 4b76be80: fix storage export in top-level package.json

## 1.8.13

### Patch Changes

- 3ac8210c: fix storage export

## 1.8.12

### Patch Changes

- aba5de08: fix #1746 class properties not working getters in createMutable
- 85b26c36: fix #2041, fix #2043 - async renderer timing, numeric prop literals

## 1.8.11

### Patch Changes

- 1ec67f15: fix #2028, fix #2029 revert spread value bypass, and guard multi-text

## 1.8.10

### Patch Changes

- 169d23b4: fix disposal timing when streaming

## 1.8.9

### Patch Changes

- 80d4830f: fix #2016 value spread, smaller build output
- 918586fb: fix #2017 object replacing array in `reconcile`
- 71bea784: fix #1971 order of merged properties
- b0862d39: fix #2014 html not replaced when resource resolves next `tick`
- cbc8d3ee: remove seroval plugins from build output

## 1.8.8

### Patch Changes

- 40b5d78d: chore(types): return mapped type for splitProps excluded `other` value
- 968e2cc9: update seroval, fix #1972, fix #1980, fix #2002, support partial ALS
- 292aba41: fix #1982 ErrorBoundary with ExternalSource
- 7e5667ab: fix #1998 Switch relying on order
- 8d2de12f: fix #1850 untrack in external source
- b887587a: fix #1973 array over object reconcile

## 1.8.7

### Patch Changes

- 22667bbc: fix: createSignal not found when bundled
- e09a3cc3: fix timing issue with deferStream

## 1.8.6

### Patch Changes

- 2b320376: Add types directory export for each package
- fb7f4bc1: fix #1950 leaking error tracking
- b092368c: feat(DEV): Add afterCreateSignal hook to DevHooks
- 54e1aecf: update seroval, fix this, optimize star imports, fix #1952 hydration race condition

## 1.8.5

### Patch Changes

- 80ca972f: fix `onHydrate` call being skipped

## 1.8.4

### Patch Changes

- cf0542a4: fix #1927, fix #1929, fix #1931, update storage API
- 3f3a3396: serialization error handling, experimental async storage

## 1.8.3

### Patch Changes

- 1f0226e1: fix #1917 for real this time

## 1.8.2

### Patch Changes

- b632dfd5: Add missing `indexArray` to server-side runtime.
- dd492c5e: fix #1917, fix #1918 error handling with serialization
- 4968fe26: Add `.js` extension to import

## 1.8.1

### Patch Changes

- 0b9b71aa: better errors for hydration

## 1.8.0

### Minor Changes

- 2c087cbb: update to seroval streaming serializer, change ssr markers
- 2c087cbb: hydration perf improvement, fix #1849

### Patch Changes

- 2c087cbb: remove attribute quotes in template, batch serialization
- 2c087cbb: improved serialization/guards, fix #1413, fix #1796 hydration with lazy
- 2c087cbb: fix: missing `has` property in `SharedConfig`
- 2c087cbb: fix #1905, fix #1908 JSX type ommissions

## 1.8.0-beta.2

### Minor Changes

- e3a97d28: hydration perf improvement, fix #1849

### Patch Changes

- d797a143: fix #1905, fix #1908 JSX type ommissions

## 1.8.0-beta.1

### Patch Changes

- f6d511db: remove attribute quotes in template, batch serialization
- af625dd3: fix: missing `has` property in `SharedConfig`

## 1.8.0-beta.0

### Minor Changes

- d8e0e8e8: update to seroval streaming serializer, change ssr markers

### Patch Changes

- bf09b838: improved serialization/guards, fix #1413, fix #1796 hydration with lazy

## 1.7.12

### Patch Changes

- 12eb1552: fix #1875 - mergeProps not handling undefined on SSR
- 13b1fa6e: fix #1883 initialize createDeferred with transition value
- 10ac07af: update jsx types, iife compiler optimization
- 8b49110b: Allow passing defer:boolean to `on`

## 1.7.11

### Patch Changes

- 26740b88: fix #1848 Suspense Default Context Non-Null

## 1.7.10

### Patch Changes

- 5ed448ae: Export `ContextProviderComponent`, `ResolvedChildren` and `ResolvedJSXElement` types
- 7dd1f413: fix .pipeTo signature to return promise
- c2008f02: Fix underscore property
- 792e7dea: fix #1821 improve context performance

## 1.7.9

### Patch Changes

- 44a2bf0b: fix #1814 incorrect typing embedding for h and html
- 6cd10c73: Changes how the Setter type was declared without actually functionally changing it, fixing the Setter type being assignable to any other Setter type; fixes #1818.

  Generically typed Setters must now non-null assert their parameter, i.e.

  ```diff
  function myCustomSignal<T>(v: T) {
    const [get, set] = createSignal<T>();
  -   const mySetter: Setter<T | undefined> = (v?) => set(v);
  +   const mySetter: Setter<T | undefined> = (v?) => set(v!);

    const [get, set] = createSignal<T>(v);
  -   const mySetter: Setter<T> = (v?) => set(v);
  +   const mySetter: Setter<T> = (v?) => set(v!);
  }
  ```

- 6c9879c9: fix in introspection in stores
- 039cf60d: update universal runtime readme
- 852f4c76: add missing link jsx types

## 1.7.8

### Patch Changes

- efd23186: fix #1780 invalid HTML comments
- 51074fab: remove optional chaining, reduce bundle size
- fe6f03f9: fix #1795 early effects running during async hydration

## 1.7.7

### Patch Changes

- c4cbfd3c: fix(Portal): reactive in children when pass signal directly
- 0100bd12: Propagate errors to parents when throwing errors in nested catchError
- 46e5e787: Improve type inference of `createSelector`.
- 8ba0e80a: Fix `mergeProps`.
- e660e5a3: add prettier code format in git-commit-hook
- 93d44d45: fix #1787 missing CJS types

## 1.7.6

### Patch Changes

- 83c99d51: fix #1739 resolved state of disabled resources
- f99dd044: Solid-Element: Add clarification on 'props' parameter in customElement function
- 88493691: apply reference optimization to mergeProps
- 514ef679: test: add tests to `splitProps`
- 20261537: fix #1735 web component instantiation before constructor
- 194f93c7: Improve performance in `splitProps` and `mergeProps`

## 1.7.5

### Patch Changes

- 5288cfa8: fix #1713, fix non-option jsx types
- 8852c199: test: add tests to `splitProps` and `mergeProps`

## 1.7.4

### Patch Changes

- 1b5ea076: perf: avoid unnecessary flat
- 91110701: fix element/test mismatch issues #1684, #1697, #1707
  fix solid-ssr types
  add missing JSX types #1690
  fix firefox iframe #1688

## 1.7.3

### Patch Changes

- 655f0b7e: fix attr in ssr spread, fix static undefined classList values, fix #1666 directives in TTLs
- 8ce2c47b: Portal fixes #1676, #1677

## 1.7.2

### Patch Changes

- 27994dc9: Another attempt at fixing skypack
- dfec6883: fix #1668 proto methods on store data nodes

## 1.7.1

### Patch Changes

- ba024813: fix ref timing in portals

## 1.7.0

### Minor Changes

- 503b6328: Add type narrowing non-keyed control flow
- 86c32279: always cast to errors when handled
- f7dc355f: Remove FunctionElement from JSX.Element types
- 940e5745: change to seroval serializer, better ssr fragment fixes
- 608b3c3a: Add catchError/deprecate onError
- 2b80f706: Reduce DOM compiler output size
  Remove auxilary closing tags and lazy evaluate templates
- 8d0877e4: fix #1562 cleanup order
- 74f00e15: Support prop/attr directives in spreads, apply prop aliases only to specific elements

### Patch Changes

- 6b77d9ed: Better types on function callback control flow
- 41ca6522: fixes around templates and hydration
- 840933b8: fix #1653 portal bypasses Suspense
- cb6a383d: ensure narrowed values are non-null
- 3de9432c: Better Input Event Types, Template Pruning, Universal Renderer Fixes
- 2cb6f3d6: fix treeshaking in rollup 3
- 24469762: Add a reference to the component funciton to DevComponent owner.
  Rename DevComponent's property from `componentName` to `name`.
- 5545d3ee: Type narrowed flow on the server, add stale warning
- 0dc8e365: Make non-null control flow assertion stricter by throwing
- 4929530b: Remove name generation of owners and signals
- 71c40af6: DEV: Minor additions and change the API of dev hooks
- 6a4fe46c: fix #1553 improper html entity encoding in literal expressions
- 5d671b89: Fix external source tests
- 23c157ac: fix backward compatibility of template, fix #1639 loading on iframe

## 1.7.0-beta.5

### Patch Changes

- 0dc8e365: Make non-null control flow assertion stricter by throwing

## 1.7.0-beta.4

### Patch Changes

- cb6a383d: ensure narrowed values are non-null
- 3de9432c: Better Input Event Types, Template Pruning, Universal Renderer Fixes
- 2cb6f3d6: fix treeshaking in rollup 3
- 23c157ac: fix backward compatibility of template, fix #1639 loading on iframe

## 1.7.0-beta.3

### Patch Changes

- 41ca6522: fixes around templates and hydration

## 1.7.0-beta.2

### Minor Changes

- 940e5745: change to seroval serializer, better ssr fragment fixes

## 1.7.0-beta.1

### Minor Changes

- 608b3c3a: Add catchError/deprecate onError
- 2b80f706: Reduce DOM compiler output size
  Remove auxilary closing tags and lazy evaluate templates
- 8d0877e4: fix #1562 cleanup order
- 74f00e15: Support prop/attr directives in spreads, apply prop aliases only to specific elements

### Patch Changes

- 6b77d9ed: Better types on function callback control flow
- 24469762: Add a reference to the component funciton to DevComponent owner.
  Rename DevComponent's property from `componentName` to `name`.
- 5545d3ee: Type narrowed flow on the server, add stale warning

## 1.7.0-beta.0

### Minor Changes

- 503b632: Add type narrowing non-keyed control flow
- 86c3227: always cast to errors when handled
- f7dc355: Remove FunctionElement from JSX.Element types

### Patch Changes

- 4929530: Remove name generation of owners and signals
- 71c40af: DEV: Minor additions and change the API of dev hooks
- e245736: Fixed test case for setStore 7 parameter overload by fixing KeyOf giving number for KeyOf<never>
- 6a4fe46: fix #1553 improper html entity encoding in literal expressions

## 1.6.16

### Patch Changes

- d10da016: Fix #1651 hydration markers introduced too early
- 620c7636: Switch test runner from Jest to Vitest

## 1.6.15

### Patch Changes

- e8448ebd: fix #1624 early fallback removal, add missing svg pathLength type
- da83ebda: defer ssr cleanup to next macrotask

## 1.6.14

### Patch Changes

- 6cceab2f: fix #1613 broken renderToString

## 1.6.13

### Patch Changes

- af20f00b: fix #1602 wrong resource state during SSR
- 60f8624d: fix #1596 ssr fragment text merge, fix #1599 ssr onCleanup

## 1.6.12

### Patch Changes

- e2888c77: Correct the type of `isServer` const to `boolean` from `false`.
- 676ed331: docs: fix typos
- b8a3ff13: fix #1586 error boundary called twice
- 1aff80c6: fix #1573 top level reconcile not merging
- 53db3f0f: fix fallback hydration
- 47d574a8: fix #1588: dynamic mount elements in Portals without recreation
- e245736f: Fixed test case for setStore 7 parameter overload by fixing KeyOf giving number for KeyOf<never>
- 61d1fe25: Export `isDev` const from solid-js/web for differentiating between dev/prod env.
- 4fdec4f9: fix #1564, fix #1567 template literal bugs

## 1.6.11

### Patch Changes

- bfbd002: Fixed the store setter's recursive fallback overload not terminating with non-numbers
- 1ecdea4: chore: export package.json
- 91d518a: fix: createResource should not ignores empty string throw
- 18e734d: Support null for detachedOwner in createRoot
- 12d458d: fix #1547, missing SVGPattern type
- 4aaa94b: Fix: swap KeyOf for MutableKeyOf in one of the SetStoreFunction overload
- c26f933: Add fast track for `untrack` in case of `null` listener
- 6fb3cd8: fix #1541: process errors at the end of synchronous execution
- c5b208c: fix #1522, errors stop future effects from running

## 1.6.10

### Patch Changes

- 1b32e63: Fix broken comments description link to solid docs
- dd879da: fix #1493 export DynamicProps
- d89e791: Add generic to onCleanup
- 695d99b: Export `EffectOptions` and `OnOptions` from main module
- d35a1ca: Fixed the return type of the `Symbol.observable` method of the `observable` in the generated `.d.ts`
- 7ab43a4: fix #1492 SSR Spread Breaks Hydration
  fix #1495 runWithOwner not clearing listener
  fix #1498 unrecoverable error in async batch

## 1.6.9

### Patch Changes

- a572c12: Streaming without a wrapper and compile time JSX validation
- 0ad9859: fix #1478 error infinite loop
- 12629a3: DEV: registerGraph `graph` property added to values

## 1.6.8

### Patch Changes

- 6db2d89: Fix #1461 - streaming broken due to reusing same resources for lazy dedupe

## 1.6.7

### Patch Changes

- c4ac14c: Format/Cleanup Types and code style
- 1384496: Fix unowned roots having owner in dev
- 1dbd5a9: stub out render and hydrate on server
- 368e508: make splitProps with dynamic source return proxies
- 54f3068: fix #1452 runWithOwner responsible for errors in its scope
- c8edacd: Fix lazy defined in components during SSR
- 89baf12: fix boolean escaping, improve ssr performance

## 1.6.6

### Patch Changes

- a603850: Export SignalOptions
- 2119211: fix #1423 - inlined arrow functions in SSR and update rollup
- 5a5a72d: Fix #1436 incorrectly missing proxy detection
- 5eb575a: fix: delete lazy contexts one by one as they are completed

## 1.6.5

### Patch Changes

- 50d1304: fix #1416 nulls in array reconcile
- ee71b16: fix #1410 - node 14 compatibility. Remove `||=` operator that isn't available on some legacy platforms.

## 1.6.4

### Patch Changes

- a42a5f6: memoize merging functions

## 1.6.3

### Patch Changes

- e95e95f: Bug fixes and testing changelog


================================================
FILE: packages/solid/README.md
================================================
<p>
  <img src="https://assets.solidjs.com/banner?project=Library&type=core" alt="SolidJS" />
</p>

[![Build Status](https://img.shields.io/github/actions/workflow/status/solidjs/solid/main-ci.yml?branch=main&logo=github&style=for-the-badge)](https://github.com/solidjs/solid/actions/workflows/main-ci.yml)
[![Coverage Status](https://img.shields.io/coveralls/github/solidjs/solid.svg?style=for-the-badge)](https://coveralls.io/github/solidjs/solid?branch=main)

[![NPM Version](https://img.shields.io/npm/v/solid-js.svg?style=for-the-badge)](https://www.npmjs.com/package/solid-js)
[![](https://img.shields.io/npm/dm/solid-js.svg?style=for-the-badge)](https://www.npmjs.com/package/solid-js)
[![Discord](https://img.shields.io/discord/722131463138705510?style=for-the-badge)](https://discord.com/invite/solidjs)
[![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/solidjs?style=for-the-badge)](https://www.reddit.com/r/solidjs/)

**[Website](https://www.solidjs.com/) • [API Docs](https://docs.solidjs.com/) • [Features Tutorial](https://www.solidjs.com/tutorial/introduction_basics) • [Playground](https://playground.solidjs.com/?version=1.3.13#NobwRAdghgtgpmAXGGUCWEwBowBcCeADgsrgM4Ae2YZA9gK4BOAxiWGjIbY7gAQi9GcCABM4jXgF9eAM0a0YvADo1aAGzQiAtACsyAegDucAEYqA3EogcuPfr2ZCouOAGU0Ac2hqps+YpU6DW09CysrGXoIZlw0WgheAGEGCBdGAAoASn4rXgd4sj5gZhTcLF4yOFxkqNwAXV4AXgcnF3cvKDV0gAZMywT8iELeDEc4eFSm3iymgD4KqprU9JLamYBqXgBGPvCBoVwmBPTcvN4AHhN6XFx43gJiRpUrm-iVXnjEjWYAa0aQUZCCa4SSzU5nfirZaZSTgi76F63CBgga7CCwiBWISicTpGaNebnJZpXj6WblES0Zj0YEAOg8VQAompxsJcAAhfAASREJzAUEIhBUmTRYEkdSAA) • [Discord](https://discord.com/invite/solidjs)**

Solid is a declarative JavaScript library for creating user interfaces. Instead of using a Virtual DOM, it compiles its templates to real DOM nodes and updates them with fine-grained reactions. Declare your state and use it throughout your app, and when a piece of state changes, only the code that depends on it will rerun. Check out our [intro video](https://www.youtube.com/watch?v=cELFZQAMdhQ) or read on!

## Key Features

- Fine-grained updates to the real DOM
- Declarative data: model your state as a system with reactive primitives
- Render-once mental model: your components are regular JavaScript functions that run once to set up your view
- Automatic dependency tracking: accessing your reactive state subscribes to it
- [Small](https://dev.to/this-is-learning/javascript-framework-todomvc-size-comparison-504f) and [fast](https://krausest.github.io/js-framework-benchmark/current.html)
- Simple: learn a few powerful concepts that can be reused, combined, and built on top of
- Provides modern framework features like JSX, fragments, Context, Portals, Suspense, streaming SSR, progressive hydration, Error Boundaries and concurrent rendering.
- Naturally debuggable: A `<div>` is a real div, so you can use your browser's devtools to inspect the rendering
- [Web component friendly](https://github.com/solidjs/solid/tree/main/packages/solid-element#readme) and can author custom elements
- Isomorphic: render your components on the client and the server
- Universal: write [custom renderers](https://github.com/solidjs/solid/releases/tag/v1.2.0) to use Solid anywhere
- A growing community and ecosystem with active core team support

<details>

<summary>Quick Start</summary>

You can get started with a simple app by running the following in your terminal:

```sh
> npx degit solidjs/templates/js my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm
```

Or for TypeScript:

```sh
> npx degit solidjs/templates/ts my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm
```

This will create a minimal, client-rendered application powered by [Vite](https://vitejs.dev/).

Or you can install the dependencies in your own setup. To use Solid with JSX (_recommended_), run:

```sh
> npm i -D babel-preset-solid
> npm i solid-js
```

The easiest way to get set up is to add `babel-preset-solid` to your `.babelrc`, babel config for webpack, or rollup configuration:

```js
"presets": ["solid"]
```

For TypeScript to work, remember to set your `.tsconfig` to handle Solid's JSX:

```js
"compilerOptions": {
  "jsx": "preserve",
  "jsxImportSource": "solid-js",
}
```

</details>

## Why Solid?

### Performant

Meticulously engineered for performance and with half a decade of research behind it, Solid's performance is almost indistinguishable from optimized vanilla JavaScript (See Solid on the [JS Framework Benchmark](https://krausest.github.io/js-framework-benchmark/current.html)). Solid is [small](https://bundlephobia.com/package/solid-js@1.3.15) and completely tree-shakable, and [fast](https://levelup.gitconnected.com/how-we-wrote-the-fastest-javascript-ui-framework-again-db097ddd99b6) when rendering on the server, too. Whether you're writing a fully client-rendered SPA or a server-rendered app, your users see it faster than ever. ([Read more about Solid's performance](https://dev.to/ryansolid/thinking-granular-how-is-solidjs-so-performant-4g37) from the library's creator.)

### Powerful

Solid is fully-featured with everything you can expect from a modern framework. Performant state management is built-in with Context and Stores: you don't have to reach for a third party library to manage global state (if you don't want to). With Resources, you can use data loaded from the server like any other piece of state and build a responsive UI for it thanks to Suspense and concurrent rendering. And when you're ready to move to the server, Solid has full SSR and serverless support, with streaming and progressive hydration to get to interactive as quickly as possible. (Check out our full [interactive features walkthrough](https://www.solidjs.com/tutorial/introduction_basics).)

### Pragmatic

Do more with less: use simple, composable primitives without hidden rules and gotchas. In Solid, components are just functions - rendering is determined purely by how your state is used - so you're free to organize your code how you like and you don't have to learn a new rendering system. Solid encourages patterns like declarative code and read-write segregation that help keep your project maintainable, but isn't opinionated enough to get in your way.

### Productive

Solid is built on established tools like JSX and TypeScript and integrates with the Vite ecosystem. Solid's bare-metal, minimal abstractions give you direct access to the DOM, making it easy to use your favorite native JavaScript libraries like D3. And the Solid ecosystem is growing fast, with [custom primitives](https://github.com/solidjs-community/solid-primitives), [component libraries](https://github.com/hope-ui/hope-ui), and build-time utilities that let you [write Solid code in new ways](https://github.com/LXSMNSYC/solid-labels).

<details>
<summary>Show Me!</summary>

```jsx
import { render } from "solid-js/web";
import { createSignal } from "solid-js";

// A component is just a function that (optionally) accepts properties and returns a DOM node
const Counter = props => {
  // Create a piece of reactive state, giving us a accessor, count(), and a setter, setCount()
  const [count, setCount] = createSignal(props.startingCount || 1);

  // The increment function calls the setter
  const increment = () => setCount(count() + 1);

  console.log(
    "The body of the function runs once, like you'd expect from calling any other function, so you only ever see this console log once."
  );

  // JSX allows us to write HTML within our JavaScript function and include dynamic expressions using the { } syntax
  // The only part of this that will ever rerender is the count() text.
  return (
    <button type="button" onClick={increment}>
      Increment {count()}
    </button>
  );
};

// The render function mounts a component onto your page
render(() => <Counter startingCount={2} />, document.getElementById("app"));
```

See it in action in our interactive [Playground](https://playground.solidjs.com/?hash=-894962706&version=1.3.13)!

Solid compiles our JSX down to efficient real DOM expressions updates, still using the same reactive primitives (`createSignal`) at runtime but making sure there's as little rerendering as possible. Here's what that looks like in this example:

```js
import { render, createComponent, delegateEvents, insert, template } from "solid-js/web";
import { createSignal } from "solid-js";

const _tmpl$ = /*#__PURE__*/ template(`<button type="button">Increment </button>`, 2);

const Counter = props => {
  const [count, setCount] = createSignal(props.startingCount || 1);
  const increment = () => setCount(count() + 1);

  console.log("The body of the function runs once . . .");

  return (() => {
    //_el$ is a real DOM node!
    const _el$ = _tmpl$.cloneNode(true);
    _el$.firstChild;

    _el$.$$click = increment;

    //This inserts the count as a child of the button in a way that allows count to update without rerendering the whole button
    insert(_el$, count, null);

    return _el$;
  })();
};

render(
  () =>
    createComponent(Counter, {
      startingCount: 2
    }),
  document.getElementById("app")
);

delegateEvents(["click"]);
```

</details>

## More

Check out our official [documentation](https://www.solidjs.com/guide) or browse some [examples](https://github.com/solidjs/solid/blob/main/documentation/resources/examples.md)

## Browser Support

SolidJS Core is committed to supporting the last 2 years of modern browsers including Firefox, Safari, Chrome and Edge (for desktop and mobile devices). We do not support IE or similar sunset browsers. For server environments, we support Node LTS and the latest Deno and Cloudflare Worker runtimes.

<img src="https://saucelabs.github.io/images/opensauce/powered-by-saucelabs-badge-gray.svg?sanitize=true" alt="Testing Powered By SauceLabs" width="300"/>

## Community

Come chat with us on [Discord](https://discord.com/invite/solidjs)! Solid's creator and the rest of the core team are active there, and we're always looking for contributions.

### Contributors

<a href="https://github.com/solidjs/solid/graphs/contributors"><img src="https://opencollective.com/solid/contributors.svg?width=890&amp;button=false" style="max-width:100%;"></a>

### Open Collective

Support us with a donation and help us continue our activities. [[Contribute](https://opencollective.com/solid)]

<a href="https://opencollective.com/solid/backer/0/website" target="_blank"><img src="https://opencollective.com/solid/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/1/website" target="_blank"><img src="https://opencollective.com/solid/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/2/website" target="_blank"><img src="https://opencollective.com/solid/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/3/website" target="_blank"><img src="https://opencollective.com/solid/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/4/website" target="_blank"><img src="https://opencollective.com/solid/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/5/website" target="_blank"><img src="https://opencollective.com/solid/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/6/website" target="_blank"><img src="https://opencollective.com/solid/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/7/website" target="_blank"><img src="https://opencollective.com/solid/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/8/website" target="_blank"><img src="https://opencollective.com/solid/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/9/website" target="_blank"><img src="https://opencollective.com/solid/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/solid/backer/10/website" target="_blank"><img src="https://opencollective.com/solid/backer/10/avatar.svg"></a>

### Sponsors

Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/solid#sponsor)]

<a href="https://opencollective.com/solid/sponsor/0/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/1/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/2/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/3/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/4/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/5/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/6/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/7/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/8/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/9/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/10/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/11/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/solid/sponsor/12/website" target="_blank"><img src="https://opencollective.com/solid/sponsor/12/avatar.svg"></a>


================================================
FILE: packages/solid/babel.config.cjs
================================================
const path = require('path');

module.exports = {
  env: {
    test: {
      presets: [
        ["@babel/preset-env", { targets: { node: "current" } }],
        "@babel/preset-typescript"
      ],
      plugins: [
        [
          "babel-plugin-transform-rename-import",
          {
            replacements: [
              {
                original: "rxcore",
                replacement: path.join(__dirname, "../../packages/solid/web/src/core")
              },
              {
                original: "^solid-js$",
                replacement: path.join(__dirname, "src"),
              }
            ]
          }
        ],
        [
          "babel-plugin-jsx-dom-expressions",
          {
            moduleName: path.join(__dirname, "web/src/index"),
            contextToCustomElements: true,
            wrapConditionals: true
          }
        ]
      ]
    }
  }
};


================================================
FILE: packages/solid/bench/bench.cjs
================================================
const { createRoot, createSignal, createComputed } = require("../dist/solid.cjs");

var now = typeof process === 'undefined' ? browserNow : nodeNow;

var COUNT = 1e5;

main();

function main() {
  var createTotal = 0;
  createTotal += bench(createDataSignals, COUNT, COUNT);
  createTotal += bench(createComputations0to1, COUNT, 0);
  createTotal += bench(createComputations1to1, COUNT, COUNT);
  createTotal += bench(createComputations2to1, COUNT / 2, COUNT);
  createTotal += bench(createComputations4to1, COUNT / 4, COUNT);
  createTotal += bench(createComputations1000to1, COUNT / 1000, COUNT);
  //total += bench1(createComputations8, COUNT, 8 * COUNT);
  createTotal += bench(createComputations1to2, COUNT, COUNT / 2);
  createTotal += bench(createComputations1to4, COUNT, COUNT / 4);
  createTotal += bench(createComputations1to8, COUNT, COUNT / 8);
  createTotal += bench(createComputations1to1000, COUNT, COUNT / 1000);
  console.log(`create total: ${createTotal.toFixed(0)}`);
  console.log('---');
  var updateTotal = 0;
  updateTotal += bench(updateComputations1to1, COUNT * 4, 1);
  updateTotal += bench(updateComputations2to1, COUNT * 2, 2);
  updateTotal += bench(updateComputations4to1, COUNT, 4);
  updateTotal += bench(updateComputations1000to1, COUNT / 100, 1000);
  updateTotal += bench(updateComputations1to2, COUNT * 4, 1);
  updateTotal += bench(updateComputations1to4, COUNT * 4, 1);
  updateTotal += bench(updateComputations1to1000, COUNT * 4, 1);
  console.log(`update total: ${updateTotal.toFixed(0)}`);
  console.log(`total: ${(createTotal + updateTotal).toFixed(0)}`);
}

function bench(fn, count, scount) {
  var time = run(fn, count, scount);
  console.log(`${fn.name}: ${time.toFixed(0)}`);
  return time;
}

function run(fn, n, scount) {
  // prep n * arity sources
  var start,
    end;

  createRoot(function () {
    // run 3 times to warm up
    var sources = createDataSignals(scount, []);
    fn(n / 100, sources);
    sources = createDataSignals(scount, []);
    fn(n / 100, sources);
    sources = createDataSignals(scount, []);
        % OptimizeFunctionOnNextCall(fn);
    fn(n / 100, sources);
    sources = createDataSignals(scount, []);
    for (var i = 0; i < scount; i++) {
      sources[i][0]();
      sources[i][0]();
      //%OptimizeFunctionOnNextCall(sources[i]);
      sources[i][0]();
    }

        // start GC clean
        % CollectGarbage(null);

    start = now();

    fn(n, sources);

    // end GC clean
    sources = null;
        % CollectGarbage(null);

    end = now();
  });

  return end - start;
}

function createDataSignals(n, sources) {
  for (var i = 0; i < n; i++) {
    sources[i] = createSignal(i);
  }
  return sources;
}

function createComputations0to1(n, sources) {
  for (var i = 0; i < n; i++) {
    createComputation0(i);
  }
}

function createComputations1to1000(n, sources) {
  for (var i = 0; i < n / 1000; i++) {
    const [get] = sources[i];
    for (var j = 0; j < 1000; j++) {
      createComputation1(get);
    }
    //sources[i] = null;
  }
}

function createComputations1to8(n, sources) {
  for (var i = 0; i < n / 8; i++) {
    const [get] = sources[i];
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    //sources[i] = null;
  }
}

function createComputations1to4(n, sources) {
  for (var i = 0; i < n / 4; i++) {
    const [get] = sources[i];
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    createComputation1(get);
    //sources[i] = null;
  }
}

function createComputations1to2(n, sources) {
  for (var i = 0; i < n / 2; i++) {
    const [get] = sources[i];
    createComputation1(get);
    createComputation1(get);
    //sources[i] = null;
  }
}

function createComputations1to1(n, sources) {
  for (var i = 0; i < n; i++) {
    const [get] = sources[i]
    createComputation1(get);
    //sources[i] = null;
  }
}

function createComputations2to1(n, sources) {
  for (var i = 0; i < n; i++) {
    createComputation2(
      sources[i * 2][0],
      sources[i * 2 + 1][0]
    );
    //sources[i * 2] = null;
    //sources[i * 2 + 1] = null;
  }
}

function createComputations4to1(n, sources) {
  for (var i = 0; i < n; i++) {
    createComputation4(
      sources[i * 4][0],
      sources[i * 4 + 1][0],
      sources[i * 4 + 2][0],
      sources[i * 4 + 3][0]
    );
    //sources[i * 4] = null;
    //sources[i * 4 + 1] = null;
    //sources[i * 4 + 2] = null;
    //sources[i * 4 + 3] = null;
  }
}

function createComputations8(n, sources) {
  for (var i = 0; i < n; i++) {
    createComputation8(
      sources[i * 8][0],
      sources[i * 8 + 1][0],
      sources[i * 8 + 2][0],
      sources[i * 8 + 3][0],
      sources[i * 8 + 4][0],
      sources[i * 8 + 5][0],
      sources[i * 8 + 6][0],
      sources[i * 8 + 7][0]
    );
    sources[i * 8] = null;
    sources[i * 8 + 1] = null;
    sources[i * 8 + 2] = null;
    sources[i * 8 + 3] = null;
    sources[i * 8 + 4] = null;
    sources[i * 8 + 5] = null;
    sources[i * 8 + 6] = null;
    sources[i * 8 + 7] = null;
  }
}

// only create n / 100 computations, as otherwise takes too long
function createComputations1000to1(n, sources) {
  for (var i = 0; i < n; i++) {
    createComputation1000(sources, i * 1000);
  }
}

function createComputation0(i) {
  createComputed(function () { return i; });
}

function createComputation1(s1) {
  createComputed(function () { return s1(); });
}

function createComputation2(s1, s2) {
  createComputed(function () { return s1() + s2(); });
}

function createComputation4(s1, s2, s3, s4) {
  createComputed(function () { return s1() + s2() + s3() + s4(); });
}

function createComputation8(s1, s2, s3, s4, s5, s6, s7, s8) {
  createComputed(function () { return s1() + s2() + s3() + s4() + s5() + s6() + s7() + s8(); });
}

function createComputation1000(ss, offset) {
  createComputed(function () {
    var sum = 0;
    for (var i = 0; i < 1000; i++) {
      sum += ss[offset + i][0]();
    }
    return sum;
  });
}

function updateComputations1to1(n, sources) {
  var [get1, set1] = sources[0];
  createComputed(function () { return get1(); });
  for (var i = 0; i < n; i++) {
    set1(i);
  }
}

function updateComputations2to1(n, sources) {
  var [get1, set1] = sources[0],
    [get2] = sources[1];
  createComputed(function () { return get1() + get2(); });
  for (var i = 0; i < n; i++) {
    set1(i);
  }
}

function updateComputations4to1(n, sources) {
  var [get1, set1] = sources[0],
    [get2] = sources[1],
    [get3] = sources[2],
    [get4] = sources[3];
  createComputed(function () { return get1() + get2() + get3() + get4(); });
  for (var i = 0; i < n; i++) {
    set1(i);
  }
}

function updateComputations1000to1(n, sources) {
  var [get1, set1] = sources[0];
  createComputed(function () {
    var sum = 0;
    for (var i = 0; i < 1000; i++) {
      sum += sources[i][0]();
    }
    return sum;
  });
  for (var i = 0; i < n; i++) {
    set1(i);
  }
}

function updateComputations1to2(n, sources) {
  var [get1, set1] = sources[0];
  createComputed(function () { return get1(); });
  createComputed(function () { return get1(); });
  for (var i = 0; i < n / 2; i++) {
    set1(i);
  }
}

function updateComputations1to4(n, sources) {
  var [get1, set1] = sources[0];
  createComputed(function () { return get1(); });
  createComputed(function () { return get1(); });
  createComputed(function () { return get1(); });
  createComputed(function () { return get1(); });
  for (var i = 0; i < n / 4; i++) {
    set1(i);
  }
}

function updateComputations1to1000(n, sources) {
  var [get1, set1] = sources[0];
  for (var i = 0; i < 1000; i++) {
    createComputed(function () { return get1(); });
  }
  for (var i = 0; i < n / 1000; i++) {
    set1(i);
  }
}

function browserNow() {
  return performance.now();
}

function nodeNow() {
  var hrt = process.hrtime();
  return hrt[0] * 1000 + hrt[1] / 1e6;
}


================================================
FILE: packages/solid/bench/libraries/kairo.cjs
================================================
let currentCollecting = null;
function setData(data, value) {
  if (!inTransaction) {
    return runInTransaction(() => setData(data, value));
  }
  if (data.value !== value) {
    data.value = value;
    data.flags |= 1024 /* Changed */;
    dirtyDataQueue.push(data); // TODO: redunant?
    markObserversMaybeStale(data);
  }
}
const dirtyDataQueue = [];
const effects = [];
function markObserversMaybeStale(computation) {
  if (computation.flags & 64 /* SingleObserver */) {
    const observer = computation.observer;
    if (observer !== null) {
      if ((observer.flags & 2048) /* Zombie */ === 0) {
        observer.depsReadyBits |= 1 << computation.observerSlot; // maximum 52 dependencies
      }
      if (observer.flags & 8 /* MaybeStale */) {
        return;
      }
      observer.flags |= 8 /* MaybeStale */;
      markObserversMaybeStale(observer);
    }
  } else {
    for (let i = 0; i < computation.observers.length; i++) {
      const observer = computation.observers[i];
      if ((observer.flags & 2048) /* Zombie */ === 0) {
        observer.depsReadyBits |= 1 << computation.observerSlots[i];
      }
      if (observer.flags & 8 /* MaybeStale */) {
        continue;
      }
      observer.flags |= 8 /* MaybeStale */;
      markObserversMaybeStale(observer);
    }
  }
}
function accessData(data) {
  if (currentCollecting !== null) {
    if (currentCollecting.flags & 256 /* Dynamic */) {
      insertNewSource(currentCollecting, data);
    } else if (currentCollecting.flags & 512 /* MaybeStable */) {
      logUnstable(currentCollecting, data);
    }
    if (data.flags & 2048 /* Zombie */) {
      if ((currentCollecting.flags & 2048) /* Zombie */ === 0) {
        data.flags -= 2048 /* Zombie */; // dezombie naturally
      }
    }
  }
  return data.value;
}
function accessComputation(data) {
  if (data.flags & 32 /* Computing */) {
    throw new Error("Circular dependency");
  }
  if (currentCollecting !== null) {
    if (currentCollecting.flags & 256 /* Dynamic */) {
      insertNewSource(currentCollecting, data);
    } else if (currentCollecting.flags & 512 /* MaybeStable */) {
      logUnstable(currentCollecting, data);
    }
    if (data.flags & 2048 /* Zombie */) {
      if ((currentCollecting.flags & 2048) /* Zombie */ === 0) {
        data.flags -= 2048 /* Zombie */; // dezombie naturally
      }
    }
  }
  if (data.flags & 8 /* MaybeStale */) {
    updateComputation(data);
    data.flags -= 8 /* MaybeStale */;
  }
  return data.value;
}
function logUnstable(accessor, data) {
  if (accessor.flags & 128 /* SingleSource */) {
    if (accessor.source !== data) {
      // currentCollecting.source is definitely not null? why?
      // deps changed
      accessor.flags -= 512 /* MaybeStable */;
      accessor.flags |= 256 /* Dynamic */;
      // clean observers from here
      if (accessor.checkIndex === 0) {
        // checkIndex == 0 means this is the first source
        // first source doesn't match?
        cleanupComputationOfSingleSource(accessor);
        // otherwise it changes from single source to multi source.
      }
      insertNewSource(accessor, data); // still need to log.
    } else {
      accessor.checkIndex++;
    }
  } else {
    const checkIndex = accessor.checkIndex;
    if (checkIndex >= accessor.sources.length || data !== accessor.sources[checkIndex]) {
      // deps changed.
      accessor.flags -= 512 /* MaybeStable */;
      accessor.flags |= 256 /* Dynamic */;
      // clean observers from here
      cleanupComputation(accessor, checkIndex);
      insertNewSource(accessor, data);
    } else {
      accessor.checkIndex++;
    }
  }
}
function collectSourceAndRecomputeComputation(computation) {
  const stored = currentCollecting;
  currentCollecting = computation;
  computation.flags |= 32 /* Computing */;
  const currentValue = computation.collect();
  computation.flags -= 32 /* Computing */;
  if (computation.flags & 512 /* MaybeStable */) {
    // check the real used deps is lesser than assumed.
    if (computation.flags & 128 /* SingleSource */) {
      if (computation.checkIndex === 0 && computation.source !== null) {
        computation.flags -= 512 /* MaybeStable */;
        computation.flags |= 256 /* Dynamic */;
        cleanupComputationOfSingleSource(computation);
      }
    } else if (computation.checkIndex != computation.sources.length) {
      computation.flags -= 512 /* MaybeStable */;
      computation.flags |= 256 /* Dynamic */;
      cleanupComputation(computation, computation.checkIndex);
    }
    currentCollecting.checkIndex = 0;
  }
  currentCollecting = stored;
  return currentValue;
}
function untrack(fn, ...args) {
  const stored = currentCollecting;
  currentCollecting = null;
  const ret = fn(...args);
  currentCollecting = stored;
  return ret;
}
function updateComputation(computation) {
  if (computation.flags & 256 /* Dynamic */) {
    cleanupComputation(computation, 0);
  }
  const currentValue = collectSourceAndRecomputeComputation(computation);
  if (computation.flags & 4096 /* NotReady */) {
    computation.flags -= 4096 /* NotReady */ | 256 /* Dynamic */;
    if (computation.flags & 16384 /* Stable */) {
      computation.flags |= 16384 /* Stable */;
    } else {
      computation.flags |= 512 /* MaybeStable */;
    }
  }
  // compare value , if changed, mark as changed
  if (currentValue !== computation.value) {
    computation.value = currentValue;
    computation.flags |= 1024 /* Changed */; // maybe problematic?
  }
}
function cleanupComputationOfSingleSource(cell) {
  if (cell.source === null) {
    return;
  }
  let theSource = cell.source;
  let observerSlotOfLastSourceOfComputation = cell.sourceSlot;
  cell.source = null;
  cell.sourceSlot = -1;
  if (theSource.flags & 64 /* SingleObserver */ && theSource.observer !== null) {
    theSource.observer = null;
    theSource.observerSlot = -1;
  } else {
    // here observers is definitely not empty:
    let lastObserverOfSource = theSource.observers.pop();
    let sourceSlotOfLastObserverOfSource = theSource.observerSlots.pop(); //我原来在哪儿,要找回去。
    if (observerSlotOfLastSourceOfComputation == theSource.observers.length) {
      // lucky, you are just the last observer
      return;
    }
    // replace you with last observer
    theSource.observers[observerSlotOfLastSourceOfComputation] = lastObserverOfSource;
    theSource.observerSlots[
      observerSlotOfLastSourceOfComputation
    ] = sourceSlotOfLastObserverOfSource;
    // notify the change of position
    if (lastObserverOfSource.flags & 128 /* SingleSource */) {
      lastObserverOfSource.sourceSlot = observerSlotOfLastSourceOfComputation;
    } else {
      lastObserverOfSource.sourceSlots[
        sourceSlotOfLastObserverOfSource
      ] = observerSlotOfLastSourceOfComputation;
    }
  }
}
function cleanupComputation(cell, remain) {
  if (cell.flags & 128 /* SingleSource */) {
    return cleanupComputationOfSingleSource(cell);
  }
  while (cell.sources.length > remain) {
    let theSource = cell.sources.pop();
    let observerSlotOfLastSourceOfComputation = cell.sourceSlots.pop();
    if (theSource.flags & 64 /* SingleObserver */ && theSource.observer !== null) {
      theSource.observer = null;
      theSource.observerSlot = -1;
    } else {
      let lastObserverOfSource = theSource.observers.pop();
      let sourceSlotOfLastObserverOfSource = theSource.observerSlots.pop();
      if (observerSlotOfLastSourceOfComputation == theSource.observers.length) {
        continue;
      }
      theSource.observers[observerSlotOfLastSourceOfComputation] = lastObserverOfSource;
      theSource.observerSlots[
        observerSlotOfLastSourceOfComputation
      ] = sourceSlotOfLastObserverOfSource;
      if (lastObserverOfSource.flags & 128 /* SingleSource */) {
        lastObserverOfSource.sourceSlot = observerSlotOfLastSourceOfComputation;
      } else {
        lastObserverOfSource.sourceSlots[
          sourceSlotOfLastObserverOfSource
        ] = observerSlotOfLastSourceOfComputation;
      }
    }
  }
}
function propagate(computation) {
  let notZombie = false;
  // if maybe stale
  if (computation.flags & 8 /* MaybeStale */) {
    if (computation.depsReadyBits !== 0) {
      throw "this should never happen.";
    }
    if (computation.flags & 4 /* Stale */) {
      updateComputation(computation);
      computation.flags -= 4 /* Stale */;
    }
    computation.flags -= 8 /* MaybeStale */;
    // now it is definitely not stale!
  }
  // if changed
  if (computation.flags & 1024 /* Changed */) {
    let hasObserver = false;
    if (computation.flags & 64 /* SingleObserver */) {
      const observer = computation.observer;
      if (observer !== null) {
        if ((observer.flags & 2048) /* Zombie */ === 0) {
          observer.flags |= 4 /* Stale */;
          observer.depsReadyBits -= 1 << computation.observerSlot;
          if (observer.depsReadyBits === 0 && propagate(observer)) {
            notZombie = true;
          }
          hasObserver = true;
        }
      }
    } else {
      for (let i = 0; i < computation.observers.length; ) {
        let current = computation.observers[i];
        if (current.flags & 2048 /* Zombie */) {
          i++;
          continue;
        }
        if ((current.flags & 8) /* MaybeStale */ === 0) {
          i++;
          hasObserver = true; // ???
          continue;
        }
        current.flags |= 4 /* Stale */;
        current.depsReadyBits -= 1 << computation.observerSlots[i];
        if (current.depsReadyBits === 0 && propagate(current)) {
          notZombie = true;
        }
        if (current === computation.observers[i]) {
          i++;
        }
        hasObserver = true;
      }
    }
    // now remove changed mark.
    computation.flags -= 1024 /* Changed */;
    if (computation.last_effect) {
      let wnode = computation.last_effect;
      while (wnode !== null) {
        effects.push(wnode.fn);
        wnode = wnode.prev;
      }
    } else if (!hasObserver) {
      computation.flags |= 2048 /* Zombie */;
    }
  } else {
    if (computation.flags & 64 /* SingleObserver */) {
      if (computation.observer !== null) {
        // TODO: make inline cache?
        if (!((computation.observer.flags & 2048) /* Zombie */)) {
          computation.observer.depsReadyBits -= 1 << computation.observerSlot;
          if (computation.observer.depsReadyBits === 0 && propagate(computation.observer)) {
            notZombie = true;
          }
        }
      }
    } else {
      for (let i = 0; i < computation.observers.length; i++) {
        let current = computation.observers[i];
        if (current.flags & 2048 /* Zombie */) {
          continue;
        }
        current.depsReadyBits -= 1 << computation.observerSlots[i];
        if (current.depsReadyBits === 0 && propagate(current)) {
          notZombie = true;
        }
      }
    }
  }
  return notZombie;
}
function watch(data, sideEffect) {
  if (data.flags & 2048 /* Zombie */) {
    data.flags -= 2048 /* Zombie */;
  }
  if (data.flags & 1 /* Data */) {
    accessData(data); // TODO: is it necessary?
  } else {
    accessComputation(data); // because it maybe stale?
  }
  const node = {
    fn: sideEffect,
    prev: data.last_effect,
    next: null,
    disposed: false,
    data: data
  };
  if (data.last_effect) {
    data.last_effect.next = node;
  }
  data.last_effect = node;
  return node;
}
function disposeWatcher(watcher) {
  if (watcher.disposed) {
    return;
  }
  watcher.disposed = true;
  if (watcher.next === null) {
    // it is the last.
    watcher.data.last_effect = watcher.prev;
  } else {
    watcher.next.prev = watcher.prev;
  }
  if (watcher.prev) {
    watcher.prev.next = watcher.next;
  }
}
let inTransaction = false;
function runInTransaction(fn) {
  if (inTransaction) {
    // already inside a transaction
    return fn();
  }
  inTransaction = true;
  const retValue = fn();
  inTransaction = false;
  while (dirtyDataQueue.length) {
    const data = dirtyDataQueue.pop();
    propagate(data);
  }
  while (effects.length) {
    effects.pop()();
  }
  return retValue;
}
function insertNewSource(accessing, source) {
  if (accessing.flags & 128 /* SingleSource */) {
    if (accessing.source === null) {
      accessing.source = source;
      accessing.sourceSlot = insertNewObserver(source, accessing, -1);
    } else {
      accessing.flags -= 128 /* SingleSource */;
      // notify relocation
      if (accessing.source.flags & 64 /* SingleObserver */) {
        accessing.source.observerSlot = 0;
      } else {
        accessing.source.observerSlots[accessing.sourceSlot] = 0;
      }
      accessing.sources = [accessing.source];
      accessing.sourceSlots = [accessing.sourceSlot];
      accessing.source = null;
      accessing.sourceSlot = -1;
      return insertNewSource(accessing, source);
    }
  } else {
    accessing.sources.push(source);
    accessing.sourceSlots.push(insertNewObserver(source, accessing, accessing.sourceSlots.length));
  }
}
function insertNewObserver(accesed, observer, atWhichSlotOfObserver) {
  if (accesed.flags & 64 /* SingleObserver */) {
    if (accesed.observer === null) {
      accesed.observer = observer;
      accesed.observerSlot = atWhichSlotOfObserver;
      return -1;
    } else {
      accesed.flags -= 64 /* SingleObserver */;
      if (accesed.observer.flags & 128 /* SingleSource */) {
        accesed.observer.sourceSlot = 0;
      } else {
        accesed.observer.sourceSlots[accesed.observerSlot] = 0;
      }
      accesed.observers = [accesed.observer];
      accesed.observerSlots = [accesed.observerSlot];
      accesed.observer = null;
      accesed.observerSlot = -1;
      return insertNewObserver(accesed, observer, atWhichSlotOfObserver);
    }
  } else {
    accesed.observers.push(observer);
    accesed.observerSlots.push(atWhichSlotOfObserver);
    return accesed.observerSlots.length - 1;
  }
}
function createData(value) {
  return {
    flags: 1 /* Data */ | 64 /* SingleObserver */ | 2048 /* Zombie */,
    last_effect: null,
    observer: null,
    observerSlot: -1,
    observers: null,
    observerSlots: null,
    value
  };
}
function createComputation(fn, options) {
  const ret = {
    flags:
      2 /* Computation */ |
      128 /* SingleSource */ |
      64 /* SingleObserver */ |
      2048 /* Zombie */ |
      8 /* MaybeStale */ |
      256 /* Dynamic */ |
      4096 /* NotReady */,
    last_effect: null,
    observer: null,
    observerSlot: -1,
    observers: null,
    observerSlots: null,
    value: null,
    source: null,
    sourceSlot: -1,
    sources: null,
    sourceSlots: null,
    collect: fn,
    depsReadyBits: 0,
    checkIndex: 0
  };
  // ret.value = collectSourceAndRecomputeComputation(ret);
  if (options === null || options === void 0 ? void 0 : options.static) {
    // if source is ready: give it ready.
    ret.flags |= 16384 /* Stable */;
  }
  return ret;
}

module.exports = {
  createRoot: fn => fn(),
  createSignal: value => {
    const node = createData(value);
    return [() => accessData(node), v => setData(node, v)];
  },
  createComputed: fn => {
    const g = createComputation(fn);
    watch(g, () => {});
  }
};


================================================
FILE: packages/solid/bench/libraries/preact.cjs
================================================
// preact signals 1.1.0 (c) 2018 Jason Miller
// https://github.com/preactjs/signals

function cycleDetected() {
	throw new Error("Cycle detected");
}

// Flags for Computed and Effect.
const RUNNING = 1 << 0;
const NOTIFIED = 1 << 1;
const OUTDATED = 1 << 2;
const DISPOSED = 1 << 3;
const HAS_ERROR = 1 << 4;
const TRACKING = 1 << 5;

// Flags for Nodes.
const NODE_FREE = 1 << 0;
const NODE_SUBSCRIBED = 1 << 1;

function startBatch() {
	batchDepth++;
}

function endBatch() {
	if (batchDepth > 1) {
		batchDepth--;
		return;
	}

	let error;
	let hasError = false;

	while (batchedEffect !== undefined) {
		let effect = batchedEffect;
		batchedEffect = undefined;

		batchIteration++;

		while (effect !== undefined) {
			const next = effect._nextBatchedEffect;
			effect._nextBatchedEffect = undefined;
			effect._flags &= ~NOTIFIED;

			if (!(effect._flags & DISPOSED) && effect._flags & OUTDATED) {
				try {
					effect._callback();
				} catch (err) {
					if (!hasError) {
						error = err;
						hasError = true;
					}
				}
			}
			effect = next;
		}
	}
	batchIteration = 0;
	batchDepth--;

	if (hasError) {
		throw error;
	}
}

function batch(callback) {
	if (batchDepth > 0) {
		return callback();
	}
	/*@__INLINE__**/ startBatch();
	try {
		return callback();
	} finally {
		endBatch();
	}
}

// Currently evaluated computed or effect.
let evalContext = undefined;

// Effects collected into a batch.
let batchedEffect = undefined;
let batchDepth = 0;
let batchIteration = 0;

// A global version number for signals, used for fast-pathing repeated
// computed.peek()/computed.value calls when nothing has changed globally.
let globalVersion = 0;

function addDependency(signal) {
	if (evalContext === undefined) {
		return undefined;
	}

	let node = signal._node;
	if (node === undefined || node._target !== evalContext) {
		// `signal` is a new dependency. Create a new node dependency node, move it
		//  to the front of the current context's dependency list.
		node = {
			_flags: 0,
			_version: 0,
			_source: signal,
			_prevSource: undefined,
			_nextSource: evalContext._sources,
			_target: evalContext,
			_prevTarget: undefined,
			_nextTarget: undefined,
			_rollbackNode: node,
		};
		evalContext._sources = node;
		signal._node = node;

		// Subscribe to change notifications from this dependency if we're in an effect
		// OR evaluating a computed signal that in turn has subscribers.
		if (evalContext._flags & TRACKING) {
			signal._subscribe(node);
		}
		return node;
	} else if (node._flags & NODE_FREE) {
		// `signal` is an existing dependency from a previous evaluation. Reuse the dependency
		// node and move it to the front of the evaluation context's dependency list.
		node._flags &= ~NODE_FREE;

		const head = evalContext._sources;
		if (node !== head) {
			const prev = node._prevSource;
			const next = node._nextSource;
			if (prev !== undefined) {
				prev._nextSource = next;
			}
			if (next !== undefined) {
				next._prevSource = prev;
			}
			if (head !== undefined) {
				head._prevSource = node;
			}
			node._prevSource = undefined;
			node._nextSource = head;
			evalContext._sources = node;
		}

		// We can assume that the currently evaluated effect / computed signal is already
		// subscribed to change notifications from `signal` if needed.
		return node;
	}
	return undefined;
}

/** @internal */
function Signal(value) {
	this._value = value;
	this._version = 0;
	this._node = undefined;
	this._targets = undefined;
}

Signal.prototype._refresh = function () {
	return true;
};

Signal.prototype._subscribe = function (node) {
	if (!(node._flags & NODE_SUBSCRIBED)) {
		node._flags |= NODE_SUBSCRIBED;
		node._nextTarget = this._targets;

		if (this._targets !== undefined) {
			this._targets._prevTarget = node;
		}
		this._targets = node;
	}
};

Signal.prototype._unsubscribe = function (node) {
	if (node._flags & NODE_SUBSCRIBED) {
		node._flags &= ~NODE_SUBSCRIBED;

		const prev = node._prevTarget;
		const next = node._nextTarget;
		if (prev !== undefined) {
			prev._nextTarget = next;
			node._prevTarget = undefined;
		}
		if (next !== undefined) {
			next._prevTarget = prev;
			node._nextTarget = undefined;
		}
		if (node === this._targets) {
			this._targets = next;
		}
	}
};

Signal.prototype.subscribe = function (fn) {
	const signal = this;
	return effect(function () {
		const value = signal.value;
		const flag = this._flags & TRACKING;
		this._flags &= ~TRACKING;
		try {
			fn(value);
		} finally {
			this._flags |= flag;
		}
	});
};

Signal.prototype.valueOf = function () {
	return this.value;
};

Signal.prototype.toString = function () {
	return this.value + "";
};

Signal.prototype.peek = function () {
	return this._value;
};

Object.defineProperty(Signal.prototype, "value", {
	get() {
		const node = addDependency(this);
		if (node !== undefined) {
			node._version = this._version;
		}
		return this._value;
	},
	set(value) {
		if (value !== this._value) {
			if (batchIteration > 100) {
				cycleDetected();
			}

			this._value = value;
			this._version++;
			globalVersion++;

			/**@__INLINE__*/ startBatch();
			try {
				for (
					let node = this._targets;
					node !== undefined;
					node = node._nextTarget
				) {
					node._target._notify();
				}
			} finally {
				endBatch();
			}
		}
	},
});

function signal(value) {
	return new Signal(value);
}

function prepareSources(target) {
	for (
		let node = target._sources;
		node !== undefined;
		node = node._nextSource
	) {
		const rollbackNode = node._source._node;
		if (rollbackNode !== undefined) {
			node._rollbackNode = rollbackNode;
		}
		node._source._node = node;
		node._flags |= NODE_FREE;
	}
}

function cleanupSources(target) {
	// At this point target._sources is a mishmash of current & former dependencies.
	// The current dependencies are also in a reverse order of use.
	// Therefore build a new, reverted list of dependencies containing only the current
	// dependencies in a proper order of use.
	// Drop former dependencies from the list and unsubscribe from their change notifications.

	let node = target._sources;
	let sources = undefined;
	while (node !== undefined) {
		const next = node._nextSource;
		if (node._flags & NODE_FREE) {
			node._source._unsubscribe(node);
			node._nextSource = undefined;
		} else {
			if (sources !== undefined) {
				sources._prevSource = node;
			}
			node._prevSource = undefined;
			node._nextSource = sources;
			sources = node;
		}

		node._source._node = node._rollbackNode;
		if (node._rollbackNode !== undefined) {
			node._rollbackNode = undefined;
		}
		node = next;
	}
	target._sources = sources;
}


function Computed(compute) {
	Signal.call(this, undefined);

	this._compute = compute;
	this._sources = undefined;
	this._globalVersion = globalVersion - 1;
	this._flags = OUTDATED;
}

Computed.prototype = new Signal();

Computed.prototype._refresh = function () {
	this._flags &= ~NOTIFIED;

	if (this._flags & RUNNING) {
		return false;
	}

	// If this computed signal has subscribed to updates from its dependencies
	// (TRACKING flag set) and none of them have notified about changes (OUTDATED
	// flag not set), then the computed value can't have changed.
	if ((this._flags & (OUTDATED | TRACKING)) === TRACKING) {
		return true;
	}
	this._flags &= ~OUTDATED;

	if (this._globalVersion === globalVersion) {
		return true;
	}
	this._globalVersion = globalVersion;

	// Mark this computed signal running before checking the dependencies for value
	// changes, so that the RUNNIN flag can be used to notice cyclical dependencies.
	this._flags |= RUNNING;
	if (this._version > 0) {
		// Check the dependencies for changed values. The dependency list is already
		// in order of use. Therefore if multiple dependencies have changed values, only
		// the first used dependency is re-evaluated at this point.
		let node = this._sources;
		while (node !== undefined) {
			// If a dependency has something blocking it from refreshing (e.g. a dependency
			// cycle) or there's a new version of the dependency, then we need to recompute.
			if (!node._source._refresh() || node._source._version !== node._version) {
				break;
			}
			node = node._nextSource;
		}
		// If none of the dependencies have changed values since last recompute then the
		// computed value can't have changed.
		if (node === undefined) {
			this._flags &= ~RUNNING;
			return true;
		}
	}

	const prevContext = evalContext;
	try {
		prepareSources(this);
		evalContext = this;
		const value = this._compute();
		if (
			this._flags & HAS_ERROR ||
			this._value !== value ||
			this._version === 0
		) {
			this._value = value;
			this._flags &= ~HAS_ERROR;
			this._version++;
		}
	} catch (err) {
		this._value = err;
		this._flags |= HAS_ERROR;
		this._version++;
	}
	evalContext = prevContext;
	cleanupSources(this);
	this._flags &= ~RUNNING;
	return true;
};

Computed.prototype._subscribe = function (node) {
	if (this._targets === undefined) {
		this._flags |= OUTDATED | TRACKING;

		// A computed signal subscribes lazily to its dependencies when the it
		// gets its first subscriber.
		for (
			let node = this._sources;
			node !== undefined;
			node = node._nextSource
		) {
			node._source._subscribe(node);
		}
	}
	Signal.prototype._subscribe.call(this, node);
};

Computed.prototype._unsubscribe = function (node) {
	Signal.prototype._unsubscribe.call(this, node);

	// Computed signal unsubscribes from its dependencies from it loses its last subscriber.
	if (this._targets === undefined) {
		this._flags &= ~TRACKING;

		for (
			let node = this._sources;
			node !== undefined;
			node = node._nextSource
		) {
			node._source._unsubscribe(node);
		}
	}
};

Computed.prototype._notify = function () {
	if (!(this._flags & NOTIFIED)) {
		this._flags |= OUTDATED | NOTIFIED;

		for (
			let node = this._targets;
			node !== undefined;
			node = node._nextTarget
		) {
			node._target._notify();
		}
	}
};

Computed.prototype.peek = function () {
	if (!this._refresh()) {
		cycleDetected();
	}
	if (this._flags & HAS_ERROR) {
		throw this._value;
	}
	return this._value;
};

Object.defineProperty(Computed.prototype, "value", {
	get() {
		if (this._flags & RUNNING) {
			cycleDetected();
		}
		const node = addDependency(this);
		this._refresh();
		if (node !== undefined) {
			node._version = this._version;
		}
		if (this._flags & HAS_ERROR) {
			throw this._value;
		}
		return this._value;
	},
});

function computed(compute) {
	return new Computed(compute);
}

function cleanupEffect(effect) {
	const cleanup = effect._cleanup;
	effect._cleanup = undefined;

	if (typeof cleanup === "function") {
		/*@__INLINE__**/ startBatch();

		// Run cleanup functions always outside of any context.
		const prevContext = evalContext;
		evalContext = undefined;
		try {
			cleanup();
		} catch (err) {
			effect._flags &= ~RUNNING;
			throw err;
		} finally {
			evalContext = prevContext;
			endBatch();
		}
	}
}

function disposeEffect(effect) {
	for (
		let node = effect._sources;
		node !== undefined;
		node = node._nextSource
	) {
		node._source._unsubscribe(node);
	}
	effect._sources = undefined;

	cleanupEffect(effect);
}

function endEffect(prevContext) {
	if (evalContext !== this) {
		throw new Error("Out-of-order effect");
	}
	cleanupSources(this);
	evalContext = prevContext;

	this._flags &= ~RUNNING;
	if (this._flags & DISPOSED) {
		disposeEffect(this);
	}
	endBatch();
}

function Effect(compute) {
	this._compute = compute;
	this._cleanup = undefined;
	this._sources = undefined;
	this._nextBatchedEffect = undefined;
	this._flags = OUTDATED | TRACKING;
}

Effect.prototype._callback = function () {
	const finish = this._start();
	try {
		if (!(this._flags & DISPOSED)) {
			this._cleanup = this._compute();
		}
	} finally {
		finish();
	}
};

Effect.prototype._start = function () {
	if (this._flags & RUNNING) {
		cycleDetected();
	}
	this._flags |= RUNNING;
	this._flags &= ~DISPOSED;
	prepareSources(this);
	cleanupEffect(this);

	/*@__INLINE__**/ startBatch();
	this._flags &= ~OUTDATED;
	const prevContext = evalContext;
	evalContext = this;
	return endEffect.bind(this, prevContext);
};

Effect.prototype._notify = function () {
	if (!(this._flags & NOTIFIED)) {
		this._flags |= NOTIFIED | OUTDATED;
		this._nextBatchedEffect = batchedEffect;
		batchedEffect = this;
	}
};

Effect.prototype._dispose = function () {
	this._flags |= DISPOSED;

	if (!(this._flags & RUNNING)) {
		disposeEffect(this);
	}
};

function effect(compute) {
	const effect = new Effect(compute);
	effect._callback();
	// Return a bound function instead of a wrapper like `() => effect._dispose()`,
	// because bound functions seem to be just as fast and take up a lot less memory.
	return effect._dispose.bind(effect);
}

function createRoot(fn) { return fn(); }
function createSignal(value) {
  const r = new Signal(value);
  return [() => r.value, v => r.value = v];
}

module.exports = {
  createSignal,
  createRoot,
  createComputed: effect
};

================================================
FILE: packages/solid/bench/libraries/rval-mod.cjs
================================================
const NOT_TRACKING = 0;
const STALE = 1;
const UP_TO_DATE = 2;

const context = {
  isUpdating: false,
  pending: [],
  currentlyComputingStack: [],
  get currentlyComputing() {
    return this.currentlyComputingStack[this.currentlyComputingStack.length - 1];
  },
  isRunningReactions: false,
  runPendingObservers
};

function batch(fn) {
  if (context.isUpdating) return fn();
  try {
    context.isUpdating = true;
    return fn();
  } finally {
    context.isUpdating = false;
    runPendingObservers();
  }
}
function runPendingObservers() {
  if (!context.isUpdating && !context.isRunningReactions) {
    context.isRunningReactions = true;
    while (context.pending.length) {
      // N.B. errors here cause other pending subscriptions to be aborted!
      const fns = context.pending.splice(0);
      for (let i = 0, len = fns.length; i < len; i += 1) fns[i]();
    }
    context.isRunningReactions = false;
  }
}

class Signal {
  constructor(state) {
    this.listeners = new Set();
    this.value = state;
  }
  addListener(listener) {
    this.listeners.add(listener);
  }
  removeListener(listener) {
    this.listeners.delete(listener);
  }
  get() {
    return registerRead(this);
  }
  set(newValue) {
    if (newValue !== this.value) {
      this.value = newValue;
      batch(() => runAll(this.listeners));
    }
  }
}
class Computed {
  constructor(derivation) {
    this.derivation = derivation;
    this.listeners = new Set();
    this.inputValues = undefined;
    this.observing = new Set();
    this.state = NOT_TRACKING;
    this.dirtyCount = 0;
    this.value = undefined;
    this.markDirty = () => {
      if (++this.dirtyCount === 1) {
        this.state = STALE;
        runAll(this.listeners);
      }
    };
  }
  addListener(observer) {
    this.listeners.add(observer);
  }
  removeListener(observer) {
    this.listeners.delete(observer)
  }
  registerDependency(sub) {
    this.observing.add(sub);
  }
  someDependencyHasChanged() {
    switch (this.state) {
      case NOT_TRACKING:
        return true;
      case UP_TO_DATE:
        return false;
      case STALE:
        if (!inputSetHasChanged(this.observing, this.inputValues)) {
          this.dirtyCount = 0;
          this.state = UP_TO_DATE;
          return false;
        }
    }
    return true;
  }
  track() {
    if (!this.someDependencyHasChanged()) return;
    const oldObserving = this.observing;
    const [newValue, newObserving] = track(this.derivation);
    this.value = newValue;
    this.observing = newObserving;
    registerDependencies(this.markDirty, oldObserving, ne
Download .txt
gitextract_kiwcvw3q/

├── .changeset/
│   ├── README.md
│   └── config.json
├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── main-ci.yml
├── .gitignore
├── .gitpod.yml
├── .nvmrc
├── .prettierrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── documentation/
│   └── resources/
│       └── examples.md
├── package.json
├── packages/
│   ├── babel-preset-solid/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── index.js
│   │   ├── package.json
│   │   └── test.js
│   ├── solid/
│   │   ├── .npmignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── babel.config.cjs
│   │   ├── bench/
│   │   │   ├── bench.cjs
│   │   │   ├── libraries/
│   │   │   │   ├── kairo.cjs
│   │   │   │   ├── preact.cjs
│   │   │   │   ├── rval-mod.cjs
│   │   │   │   ├── s-mod.cjs
│   │   │   │   ├── s.cjs
│   │   │   │   ├── sinuous-mod.cjs
│   │   │   │   ├── sinuous.cjs
│   │   │   │   ├── usignal.cjs
│   │   │   │   └── vuerx.cjs
│   │   │   ├── prototypes/
│   │   │   │   ├── message-noarray.cjs
│   │   │   │   ├── message.cjs
│   │   │   │   ├── queue-noarray.cjs
│   │   │   │   └── queue.cjs
│   │   │   └── results.md
│   │   ├── h/
│   │   │   ├── README.md
│   │   │   ├── jsx-dev-runtime/
│   │   │   │   └── package.json
│   │   │   ├── jsx-runtime/
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   └── index.ts
│   │   │   │   └── tsconfig.json
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── hyperscript.ts
│   │   │   │   └── index.ts
│   │   │   └── tsconfig.json
│   │   ├── html/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   └── lit.ts
│   │   │   └── tsconfig.json
│   │   ├── jsx-runtime.d.ts
│   │   ├── package.json
│   │   ├── rollup.config.js
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   ├── reactive/
│   │   │   │   ├── array.ts
│   │   │   │   ├── observable.ts
│   │   │   │   ├── scheduler.ts
│   │   │   │   └── signal.ts
│   │   │   ├── render/
│   │   │   │   ├── Suspense.ts
│   │   │   │   ├── component.ts
│   │   │   │   ├── flow.ts
│   │   │   │   ├── hydration.ts
│   │   │   │   └── index.ts
│   │   │   └── server/
│   │   │       ├── index.ts
│   │   │       ├── reactive.ts
│   │   │       └── rendering.ts
│   │   ├── store/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   ├── modifiers.ts
│   │   │   │   ├── mutable.ts
│   │   │   │   ├── server.ts
│   │   │   │   └── store.ts
│   │   │   ├── test/
│   │   │   │   ├── modifiers.spec.ts
│   │   │   │   ├── mutable.spec.ts
│   │   │   │   ├── mutableWithClass.spec.tsx
│   │   │   │   └── store.spec.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── test/
│   │   │   ├── MessageChannel.ts
│   │   │   ├── array.spec.ts
│   │   │   ├── component.bench.ts
│   │   │   ├── component.spec.ts
│   │   │   ├── component.type-tests.ts
│   │   │   ├── dev.spec.ts
│   │   │   ├── external-source.spec.ts
│   │   │   ├── observable.spec.ts
│   │   │   ├── rendering.spec.ts
│   │   │   ├── resource.spec.ts
│   │   │   ├── resource.type-tests.ts
│   │   │   ├── scheduler.spec.ts
│   │   │   ├── signals.memo.spec.ts
│   │   │   ├── signals.spec.ts
│   │   │   └── signals.type-tests.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   ├── universal/
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   └── universal.ts
│   │   │   └── tsconfig.json
│   │   ├── vite.config.mjs
│   │   └── web/
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── server/
│   │       │   ├── index.ts
│   │       │   └── server.ts
│   │       ├── src/
│   │       │   ├── client.ts
│   │       │   ├── core.ts
│   │       │   ├── index.ts
│   │       │   ├── jsx.ts
│   │       │   └── server-mock.ts
│   │       ├── storage/
│   │       │   ├── package.json
│   │       │   ├── src/
│   │       │   │   └── index.ts
│   │       │   ├── tsconfig.build.json
│   │       │   └── tsconfig.json
│   │       ├── test/
│   │       │   ├── context.spec.tsx
│   │       │   ├── dynamic.spec.tsx
│   │       │   ├── element.spec.tsx
│   │       │   ├── errorboundary.spec.tsx
│   │       │   ├── for.spec.tsx
│   │       │   ├── index.spec.tsx
│   │       │   ├── portal.spec.tsx
│   │       │   ├── server-mock.spec.tsx
│   │       │   ├── show.spec.tsx
│   │       │   ├── suspense.spec.tsx
│   │       │   └── switch.spec.tsx
│   │       ├── tsconfig.build.json
│   │       └── tsconfig.json
│   ├── solid-element/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── sample.jsx
│   │   ├── src/
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── solid-ssr/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── examples/
│   │   │   ├── .gitignore
│   │   │   ├── async/
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   ├── shared/
│   │   │   │   ├── src/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── App.js
│   │   │   │   │   │   ├── Home.js
│   │   │   │   │   │   ├── Profile/
│   │   │   │   │   │   │   ├── Profile.js
│   │   │   │   │   │   │   └── index.js
│   │   │   │   │   │   └── Settings.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── router.js
│   │   │   │   └── static/
│   │   │   │       └── styles.css
│   │   │   ├── ssg/
│   │   │   │   ├── export.js
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   ├── ssr/
│   │   │   │   ├── index.js
│   │   │   │   └── rollup.config.js
│   │   │   └── stream/
│   │   │       ├── index.js
│   │   │       └── rollup.config.js
│   │   ├── package.json
│   │   └── static/
│   │       ├── index.cjs
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       ├── writeToDisk.cjs
│   │       └── writeToDisk.js
│   └── test-integration/
│       ├── CHANGELOG.md
│       ├── babel.config.cjs
│       ├── package.json
│       ├── test-imports.mjs
│       ├── tests/
│       │   └── downloaded.spec.ts
│       └── tsconfig.json
├── pnpm-workspace.yaml
├── tsconfig.json
├── tsconfig.test.json
└── turbo.json
Download .txt
SYMBOL INDEX (924 symbols across 65 files)

FILE: packages/solid-element/src/index.ts
  type ComponentType (line 10) | type ComponentType<T> = mComponentType<T>;
  function createProps (line 14) | function createProps<T extends object>(raw: T) {
  function lookupContext (line 29) | function lookupContext(el: ICustomElement & { _$owner?: any }) {
  function withSolid (line 43) | function withSolid<T extends object>(ComponentType: ComponentType<T>): C...
  function customElement (line 72) | function customElement<T extends object>(

FILE: packages/solid-ssr/examples/shared/src/router.js
  function RouteHOC (line 6) | function RouteHOC(Comp) {

FILE: packages/solid-ssr/examples/ssg/export.js
  constant PAGES (line 5) | const PAGES = ["index", "profile", "settings"];

FILE: packages/solid-ssr/static/index.cjs
  function run (line 6) | async function run({ entry, output, url }) {

FILE: packages/solid-ssr/static/index.d.ts
  type StaticConfig (line 1) | type StaticConfig = { entry: string; output: string; url: string };

FILE: packages/solid-ssr/static/index.js
  function run (line 10) | async function run({ entry, output, url }) {
  function renderStatic (line 22) | async function renderStatic(config) {

FILE: packages/solid-ssr/static/writeToDisk.cjs
  function write (line 5) | async function write() {

FILE: packages/solid-ssr/static/writeToDisk.js
  function write (line 4) | async function write() {

FILE: packages/solid/bench/bench.cjs
  function main (line 9) | function main() {
  function bench (line 36) | function bench(fn, count, scount) {
  function run (line 42) | function run(fn, n, scount) {
  function createDataSignals (line 81) | function createDataSignals(n, sources) {
  function createComputations0to1 (line 88) | function createComputations0to1(n, sources) {
  function createComputations1to1000 (line 94) | function createComputations1to1000(n, sources) {
  function createComputations1to8 (line 104) | function createComputations1to8(n, sources) {
  function createComputations1to4 (line 119) | function createComputations1to4(n, sources) {
  function createComputations1to2 (line 130) | function createComputations1to2(n, sources) {
  function createComputations1to1 (line 139) | function createComputations1to1(n, sources) {
  function createComputations2to1 (line 147) | function createComputations2to1(n, sources) {
  function createComputations4to1 (line 158) | function createComputations4to1(n, sources) {
  function createComputations8 (line 173) | function createComputations8(n, sources) {
  function createComputations1000to1 (line 197) | function createComputations1000to1(n, sources) {
  function createComputation0 (line 203) | function createComputation0(i) {
  function createComputation1 (line 207) | function createComputation1(s1) {
  function createComputation2 (line 211) | function createComputation2(s1, s2) {
  function createComputation4 (line 215) | function createComputation4(s1, s2, s3, s4) {
  function createComputation8 (line 219) | function createComputation8(s1, s2, s3, s4, s5, s6, s7, s8) {
  function createComputation1000 (line 223) | function createComputation1000(ss, offset) {
  function updateComputations1to1 (line 233) | function updateComputations1to1(n, sources) {
  function updateComputations2to1 (line 241) | function updateComputations2to1(n, sources) {
  function updateComputations4to1 (line 250) | function updateComputations4to1(n, sources) {
  function updateComputations1000to1 (line 261) | function updateComputations1000to1(n, sources) {
  function updateComputations1to2 (line 275) | function updateComputations1to2(n, sources) {
  function updateComputations1to4 (line 284) | function updateComputations1to4(n, sources) {
  function updateComputations1to1000 (line 295) | function updateComputations1to1000(n, sources) {
  function browserNow (line 305) | function browserNow() {
  function nodeNow (line 309) | function nodeNow() {

FILE: packages/solid/bench/libraries/kairo.cjs
  function setData (line 2) | function setData(data, value) {
  function markObserversMaybeStale (line 15) | function markObserversMaybeStale(computation) {
  function accessData (line 42) | function accessData(data) {
  function accessComputation (line 57) | function accessComputation(data) {
  function logUnstable (line 79) | function logUnstable(accessor, data) {
  function collectSourceAndRecomputeComputation (line 111) | function collectSourceAndRecomputeComputation(computation) {
  function untrack (line 135) | function untrack(fn, ...args) {
  function updateComputation (line 142) | function updateComputation(computation) {
  function cleanupComputationOfSingleSource (line 161) | function cleanupComputationOfSingleSource(cell) {
  function cleanupComputation (line 195) | function cleanupComputation(cell, remain) {
  function propagate (line 225) | function propagate(computation) {
  function watch (line 314) | function watch(data, sideEffect) {
  function disposeWatcher (line 336) | function disposeWatcher(watcher) {
  function runInTransaction (line 352) | function runInTransaction(fn) {
  function insertNewSource (line 369) | function insertNewSource(accessing, source) {
  function insertNewObserver (line 393) | function insertNewObserver(accesed, observer, atWhichSlotOfObserver) {
  function createData (line 418) | function createData(value) {
  function createComputation (line 429) | function createComputation(fn, options) {

FILE: packages/solid/bench/libraries/preact.cjs
  function cycleDetected (line 4) | function cycleDetected() {
  constant RUNNING (line 9) | const RUNNING = 1 << 0;
  constant NOTIFIED (line 10) | const NOTIFIED = 1 << 1;
  constant OUTDATED (line 11) | const OUTDATED = 1 << 2;
  constant DISPOSED (line 12) | const DISPOSED = 1 << 3;
  constant HAS_ERROR (line 13) | const HAS_ERROR = 1 << 4;
  constant TRACKING (line 14) | const TRACKING = 1 << 5;
  constant NODE_FREE (line 17) | const NODE_FREE = 1 << 0;
  constant NODE_SUBSCRIBED (line 18) | const NODE_SUBSCRIBED = 1 << 1;
  function startBatch (line 20) | function startBatch() {
  function endBatch (line 24) | function endBatch() {
  function batch (line 65) | function batch(callback) {
  function addDependency (line 89) | function addDependency(signal) {
  function Signal (line 149) | function Signal(value) {
  method get (line 219) | get() {
  method set (line 226) | set(value) {
  function signal (line 252) | function signal(value) {
  function prepareSources (line 256) | function prepareSources(target) {
  function cleanupSources (line 271) | function cleanupSources(target) {
  function Computed (line 304) | function Computed(compute) {
  method get (line 443) | get() {
  function computed (line 459) | function computed(compute) {
  function cleanupEffect (line 463) | function cleanupEffect(effect) {
  function disposeEffect (line 485) | function disposeEffect(effect) {
  function endEffect (line 498) | function endEffect(prevContext) {
  function Effect (line 512) | function Effect(compute) {
  function effect (line 563) | function effect(compute) {
  function createRoot (line 571) | function createRoot(fn) { return fn(); }
  function createSignal (line 572) | function createSignal(value) {

FILE: packages/solid/bench/libraries/rval-mod.cjs
  constant NOT_TRACKING (line 1) | const NOT_TRACKING = 0;
  constant STALE (line 2) | const STALE = 1;
  constant UP_TO_DATE (line 3) | const UP_TO_DATE = 2;
  method currentlyComputing (line 9) | get currentlyComputing() {
  function batch (line 16) | function batch(fn) {
  function runPendingObservers (line 26) | function runPendingObservers() {
  class Signal (line 38) | class Signal {
    method constructor (line 39) | constructor(state) {
    method addListener (line 43) | addListener(listener) {
    method removeListener (line 46) | removeListener(listener) {
    method get (line 49) | get() {
    method set (line 52) | set(newValue) {
  class Computed (line 59) | class Computed {
    method constructor (line 60) | constructor(derivation) {
    method addListener (line 75) | addListener(observer) {
    method removeListener (line 78) | removeListener(observer) {
    method registerDependency (line 81) | registerDependency(sub) {
    method someDependencyHasChanged (line 84) | someDependencyHasChanged() {
    method track (line 99) | track() {
    method get (line 110) | get() {
  function track (line 127) | function track(fn) {
  function registerDependencies (line 134) | function registerDependencies(listener, oldDeps, newDeps) {
  function registerRead (line 147) | function registerRead(observable) {
  function recordInputSet (line 151) | function recordInputSet(deps) {
  function inputSetHasChanged (line 155) | function inputSetHasChanged(deps, inputs) {
  function currentValue (line 158) | function currentValue(dep) {
  function runAll (line 163) | function runAll(fns) {
  function createSignal (line 167) | function createSignal(value) {
  function createMemo (line 172) | function createMemo(derivation) {
  function createRoot (line 177) | function createRoot(fn) {
  function createEffect (line 181) | function createEffect(fn) {

FILE: packages/solid/bench/libraries/s-mod.cjs
  constant ERROR (line 4) | const ERROR = Symbol("error");
  function createRoot (line 6) | function createRoot(fn, detachedOwner) {
  function createSignal (line 34) | function createSignal(value, areEqual) {
  function createEffect (line 53) | function createEffect(fn, value) {
  function createDependentEffect (line 56) | function createDependentEffect(fn, deps, defer) {
  function createMemo (line 71) | function createMemo(fn, value, areEqual) {
  function batch (line 91) | function batch(fn) {
  function sample (line 106) | function sample(fn) {
  function afterEffects (line 114) | function afterEffects(fn) {
  function onCleanup (line 118) | function onCleanup(fn) {
  function onError (line 124) | function onError(fn) {
  function isListening (line 131) | function isListening() {
  function createContext (line 134) | function createContext(defaultValue) {
  function useContext (line 138) | function useContext(context) {
  function getOwner (line 141) | function getOwner() {
  class DataNode (line 146) | class DataNode {
    method constructor (line 147) | constructor(value) {
    method current (line 152) | current() {
    method next (line 159) | next(value) {
  function createComputationNode (line 184) | function createComputationNode(fn, value) {
  function createClock (line 221) | function createClock() {
  function createLog (line 230) | function createLog() {
  class Queue (line 238) | class Queue {
    method constructor (line 239) | constructor() {
    method reset (line 243) | reset() {
    method add (line 246) | add(item) {
    method run (line 249) | run(fn) {
  constant NOTPENDING (line 272) | let NOTPENDING = {},
  constant UNOWNED (line 272) | let NOTPENDING = {},
  function callAll (line 277) | function callAll(ss) {
  function lookup (line 282) | function lookup(owner, key) {
  function resolveChildren (line 287) | function resolveChildren(children) {
  function createProvider (line 299) | function createProvider(id) {
  function logRead (line 309) | function logRead(from) {
  function liftComputation (line 339) | function liftComputation(node) {
  function event (line 348) | function event() {
  function toplevelComputation (line 360) | function toplevelComputation(node) {
  function run (line 378) | function run(clock) {
  function applyDataChange (line 399) | function applyDataChange(data) {
  function updateNode (line 404) | function updateNode(node) {
  function updateComputation (line 427) | function updateComputation(node) {
  function stateStale (line 440) | function stateStale(node) {
  function statePending (line 448) | function statePending(node) {
  function pendingStateStale (line 457) | function pendingStateStale(node) {
  function setDownstreamState (line 469) | function setDownstreamState(node, pending) {
  function markDownstreamComputations (line 480) | function markDownstreamComputations(node, onchange, dirty) {
  function setComputationState (line 491) | function setComputationState(log, stateFn) {
  function markForDisposal (line 501) | function markForDisposal(children, pending, time) {
  function applyUpstreamUpdates (line 518) | function applyUpstreamUpdates(node) {
  function cleanupNode (line 534) | function cleanupNode(node, final) {
  function cleanupSource (line 565) | function cleanupSource(source, slot) {
  function resetComputation (line 586) | function resetComputation(node, flags) {
  function dispose (line 591) | function dispose(node) {

FILE: packages/solid/bench/libraries/s.cjs
  function on (line 52) | function on(value) {
  function callAll (line 64) | function callAll(ss) {
  function Clock (line 152) | function Clock() {
  function DataNode (line 166) | function DataNode(value) {
  function ComputationNode (line 207) | function ComputationNode() {
  function Log (line 236) | function Log() {
  function Queue (line 245) | function Queue() {
  function makeComputationNode (line 279) | function makeComputationNode(fn, value, orphan, sample) {
  function execToplevelComputation (line 299) | function execToplevelComputation(fn, value) {
  function finishToplevelComputation (line 309) | function finishToplevelComputation(owner, listener) {
  function getCandidateNode (line 321) | function getCandidateNode() {
  function recycleOrClaimNode (line 327) | function recycleOrClaimNode(node, fn, value, orphan) {
  function logRead (line 363) | function logRead(from) {
  function logDataRead (line 391) | function logDataRead(data) {
  function logComputationRead (line 395) | function logComputationRead(node) {
  function event (line 399) | function event() {
  function run (line 411) | function run(clock) {
  function applyDataChange (line 431) | function applyDataChange(data) {
  function markComputationsStale (line 436) | function markComputationsStale(log) {
  function markNodeStale (line 447) | function markNodeStale(node) {
  function markOwnedNodesForDisposal (line 457) | function markOwnedNodesForDisposal(owned) {
  function updateNode (line 465) | function updateNode(node) {
  function cleanup (line 478) | function cleanup(node, final) {
  function cleanupSource (line 508) | function cleanupSource(source, slot) {
  function dispose (line 529) | function dispose(node) {
  method createSignal (line 536) | createSignal(init) {

FILE: packages/solid/bench/libraries/sinuous-mod.cjs
  function getChildrenDeep (line 1) | function getChildrenDeep(children, res) {
  constant EMPTY_ARR (line 8) | const EMPTY_ARR = [];
  function isListening (line 16) | function isListening() {
  function createRoot (line 28) | function createRoot(fn) {
  function sample (line 40) | function sample(fn) {
  function batch (line 48) | function batch(fn) {
  class DataNode (line 65) | class DataNode {
    method constructor (line 66) | constructor(value) {
    method current (line 72) | current() {
    method next (line 79) | next(nextValue) {
  function createComputationNode (line 105) | function createComputationNode(observer, value) {
  function removeFreshChildren (line 118) | function removeFreshChildren(u) {
  function onCleanup (line 127) | function onCleanup(fn) {
  function _unsubscribe (line 134) | function _unsubscribe(node) {
  function updateComputation (line 146) | function updateComputation(node) {
  function currentValue (line 179) | function currentValue() {
  function resetUpdate (line 188) | function resetUpdate(node) {

FILE: packages/solid/bench/libraries/sinuous.cjs
  function getChildrenDeep (line 1) | function getChildrenDeep(children) {
  constant EMPTY_ARR (line 8) | const EMPTY_ARR = [];
  function isListening (line 16) | function isListening() {
  function root (line 28) | function root(fn) {
  function sample (line 50) | function sample(fn) {
  function transaction (line 64) | function transaction(fn) {
  function observable (line 88) | function observable(value) {
  function computed (line 145) | function computed(observer, value) {
  function removeFreshChildren (line 196) | function removeFreshChildren(u) {
  function cleanup (line 212) | function cleanup(fn) {
  function _unsubscribe (line 219) | function _unsubscribe(update) {
  function resetUpdate (line 231) | function resetUpdate(update) {

FILE: packages/solid/bench/libraries/usignal.cjs
  class Signal (line 32) | class Signal {
    method constructor (line 34) | constructor(value) {
    method then (line 39) | then() { return this.value }
    method toJSON (line 42) | toJSON() { return this.value }
    method toString (line 45) | toString() { return this.value }
    method valueOf (line 48) | valueOf() { return this.value }
  class Computed (line 52) | class Computed extends Signal {
    method constructor (line 53) | constructor(_, v, o, f) {
    method value (line 61) | get value() {
  class Effect (line 88) | class Effect extends Computed {
    method constructor (line 89) | constructor(_, v, o) {
    method value (line 97) | get value() {
    method async (line 100) | async() {
    method sync (line 109) | sync() {
    method stop (line 125) | stop() {
  class Reactive (line 162) | class Reactive extends Signal {
    method constructor (line 163) | constructor(_, {equals}) {
    method peek (line 168) | peek() { return this._ }
    method value (line 169) | get value() {
    method value (line 176) | set value(_) {
  function createRoot (line 218) | function createRoot(fn) { return fn(); }
  function createSignal (line 219) | function createSignal(value) {

FILE: packages/solid/bench/libraries/vuerx.cjs
  function makeMap (line 7) | function makeMap(str, expectsLowerCase) {
  constant EMPTY_OBJ (line 17) | const EMPTY_OBJ =  Object.freeze({});
  constant ITERATE_KEY (line 53) | const ITERATE_KEY = Symbol( 'iterate' );
  constant MAP_KEY_ITERATE_KEY (line 54) | const MAP_KEY_ITERATE_KEY = Symbol( 'Map key iterate' );
  function isEffect (line 55) | function isEffect(fn) {
  function effect (line 58) | function effect(fn, options = EMPTY_OBJ) {
  function stop (line 68) | function stop(effect) {
  function createReactiveEffect (line 78) | function createReactiveEffect(fn, options) {
  function cleanup (line 106) | function cleanup(effect) {
  function pauseTracking (line 117) | function pauseTracking() {
  function enableTracking (line 121) | function enableTracking() {
  function resetTracking (line 125) | function resetTracking() {
  function track (line 129) | function track(target, type, key) {
  function trigger (line 154) | function trigger(target, type, key, newValue, oldValue, oldTarget) {
  function createGetter (line 254) | function createGetter(isReadonly = false, shallow = false) {
  function createSetter (line 299) | function createSetter(shallow = false) {
  function deleteProperty (line 323) | function deleteProperty(target, key) {
  function has (line 332) | function has(target, key) {
  function ownKeys (line 337) | function ownKeys(target) {
  method set (line 352) | set(target, key) {
  method deleteProperty (line 358) | deleteProperty(target, key) {
  function get$1 (line 381) | function get$1(target, key, wrap) {
  function has$1 (line 396) | function has$1(key) {
  function size (line 406) | function size(target) {
  function add (line 411) | function add(value) {
  function set$1 (line 422) | function set$1(key, value) {
  function deleteEntry (line 444) | function deleteEntry(key) {
  function clear (line 463) | function clear() {
  function createForEach (line 477) | function createForEach(isReadonly) {
  function createIterableMethod (line 492) | function createIterableMethod(method, isReadonly) {
  function createReadonlyMethod (line 522) | function createReadonlyMethod(type) {
  method get (line 532) | get(key) {
  method size (line 535) | get size() {
  method get (line 546) | get(key) {
  method size (line 549) | get size() {
  function createInstrumentationGetter (line 564) | function createInstrumentationGetter(isReadonly) {
  function checkIdentityKeys (line 589) | function checkIdentityKeys(target, has, key) {
  function reactive (line 608) | function reactive(target) {
  function shallowReactive (line 618) | function shallowReactive(target) {
  function readonly (line 621) | function readonly(target) {
  function shallowReadonly (line 628) | function shallowReadonly(target) {
  function createReactiveObject (line 631) | function createReactiveObject(target, isReadonly, baseHandlers, collecti...
  function isReactive (line 655) | function isReactive(value) {
  function isReadonly (line 661) | function isReadonly(value) {
  function isProxy (line 664) | function isProxy(value) {
  function toRaw (line 667) | function toRaw(observed) {
  function markRaw (line 670) | function markRaw(value) {
  function isRef (line 676) | function isRef(r) {
  function ref (line 679) | function ref(value) {
  function shallowRef (line 682) | function shallowRef(value) {
  function createRef (line 685) | function createRef(rawValue, shallow = false) {
  function triggerRef (line 706) | function triggerRef(ref) {
  function unref (line 709) | function unref(ref) {
  function customRef (line 712) | function customRef(factory) {
  function toRefs (line 725) | function toRefs(object) {
  function toRef (line 735) | function toRef(object, key) {
  function computed (line 747) | function computed(getterOrOptions) {
  function createSignal (line 794) | function createSignal(value) {
  function createRoot (line 799) | function createRoot(fn) { return fn(); }

FILE: packages/solid/bench/prototypes/message-noarray.cjs
  constant UNOWNED (line 6) | const UNOWNED = {
  function createRoot (line 16) | function createRoot(fn, detachedOwner) {
  function createSignal (line 40) | function createSignal(value, options) {
  function createComputed (line 67) | function createComputed(fn, value) {
  function createMemo (line 70) | function createMemo(fn, value, options) {
  function batch (line 86) | function batch(fn) {
  function untrack (line 89) | function untrack(fn) {
  function logRead (line 97) | function logRead(node) {
  function writeSignal (line 126) | function writeSignal(node, value) {
  function updateComputation (line 131) | function updateComputation(node, init) {
  function runComputation (line 142) | function runComputation(node, value, time) {
  function createComputation (line 153) | function createComputation(fn, init, pure, options) {
  function runTop (line 177) | function runTop(node) {
  function runUpdates (line 190) | function runUpdates(fn) {
  function completeUpdates (line 203) | function completeUpdates(wait) {
  function runQueue (line 209) | function runQueue(queue) {
  function lookUpstream (line 212) | function lookUpstream(node) {
  function lookUpstreamNode (line 222) | function lookUpstreamNode(node) {
  function markDownstream (line 228) | function markDownstream(node, decrease, stale, top) {
  function markDownstreamNode (line 238) | function markDownstreamNode(o, decrease, stale, top) {
  function runImmediate (line 245) | function runImmediate(node) {
  function runNode (line 255) | function runNode(node) {
  function updateNode (line 266) | function updateNode(node) {
  function cleanNode (line 273) | function cleanNode(node) {
  function cleanupSource (line 296) | function cleanupSource(source, slot) {

FILE: packages/solid/bench/prototypes/message.cjs
  constant UNOWNED (line 6) | const UNOWNED = {
  function createRoot (line 16) | function createRoot(fn, detachedOwner) {
  function createSignal (line 40) | function createSignal(value, options) {
  function createComputed (line 64) | function createComputed(fn, value) {
  function createMemo (line 67) | function createMemo(fn, value, options) {
  function batch (line 77) | function batch(fn) {
  function untrack (line 80) | function untrack(fn) {
  function readSignal (line 88) | function readSignal() {
  function writeSignal (line 109) | function writeSignal(node, value) {
  function updateComputation (line 114) | function updateComputation(node) {
  function runComputation (line 125) | function runComputation(node, value, time) {
  function createComputation (line 136) | function createComputation(fn, init, pure, options) {
  function runTop (line 158) | function runTop(node) {
  function runUpdates (line 171) | function runUpdates(fn) {
  function completeUpdates (line 184) | function completeUpdates(wait) {
  function runQueue (line 190) | function runQueue(queue) {
  function lookUpstream (line 193) | function lookUpstream(node) {
  function markDownstream (line 202) | function markDownstream(node, decrease, stale, top) {
  function runImmediate (line 212) | function runImmediate(node) {
  function runNode (line 221) | function runNode(node) {
  function updateNode (line 232) | function updateNode(node) {
  function cleanNode (line 239) | function cleanNode(node) {

FILE: packages/solid/bench/prototypes/queue-noarray.cjs
  constant ERROR (line 5) | let ERROR = null;
  constant STALE (line 7) | const STALE = 1;
  constant PENDING (line 8) | const PENDING = 2;
  constant UNOWNED (line 9) | const UNOWNED = {
  function createRoot (line 20) | function createRoot(fn, detachedOwner) {
  function createSignal (line 44) | function createSignal(value, options) {
  function createComputed (line 67) | function createComputed(fn, value) {
  function createMemo (line 70) | function createMemo(fn, value, options) {
  function batch (line 91) | function batch(fn) {
  function untrack (line 94) | function untrack(fn) {
  function logRead (line 103) | function logRead(node) {
  function writeSignal (line 132) | function writeSignal(node, value) {
  function queueUpdates (line 151) | function queueUpdates(o) {
  function updateComputation (line 160) | function updateComputation(node) {
  function runComputation (line 171) | function runComputation(node, value, time) {
  function createComputation (line 181) | function createComputation(fn, init, pure, state = STALE, options) {
  function runTop (line 204) | function runTop(node) {
  function runUpdates (line 223) | function runUpdates(fn, init) {
  function completeUpdates (line 239) | function completeUpdates(wait) {
  function runQueue (line 249) | function runQueue(queue) {
  function lookUpstream (line 252) | function lookUpstream(node) {
  function lookUpstreamNode (line 261) | function lookUpstreamNode(source) {
  function markDownstream (line 267) | function markDownstream(node) {
  function markDownstreamNode (line 273) | function markDownstreamNode(o) {
  function cleanNode (line 281) | function cleanNode(node) {
  function cleanupSource (line 303) | function cleanupSource(source, slot) {

FILE: packages/solid/bench/prototypes/queue.cjs
  constant ERROR (line 5) | let ERROR = null;
  constant STALE (line 7) | const STALE = 1;
  constant PENDING (line 8) | const PENDING = 2;
  constant UNOWNED (line 9) | const UNOWNED = {
  function createRoot (line 20) | function createRoot(fn, detachedOwner) {
  function createSignal (line 44) | function createSignal(value, options) {
  function createComputed (line 62) | function createComputed(fn, value) {
  function createMemo (line 65) | function createMemo(fn, value, options) {
  function batch (line 75) | function batch(fn) {
  function untrack (line 78) | function untrack(fn) {
  function readSignal (line 87) | function readSignal() {
  function writeSignal (line 113) | function writeSignal(node, value, isComp) {
  function updateComputation (line 137) | function updateComputation(node) {
  function runComputation (line 148) | function runComputation(node, value, time) {
  function createComputation (line 158) | function createComputation(fn, init, pure, state = STALE, options) {
  function runTop (line 179) | function runTop(node) {
  function runUpdates (line 198) | function runUpdates(fn, init) {
  function completeUpdates (line 214) | function completeUpdates(wait) {
  function runQueue (line 224) | function runQueue(queue) {
  function lookUpstream (line 227) | function lookUpstream(node) {
  function markDownstream (line 237) | function markDownstream(node) {
  function cleanNode (line 248) | function cleanNode(node) {

FILE: packages/solid/h/jsx-runtime/src/index.ts
  function Fragment (line 5) | function Fragment(props: { children: JSX.Element }) {
  function jsx (line 9) | function jsx(type: any, props: any) {

FILE: packages/solid/src/index.ts
  type JSXElement (line 72) | type JSXElement = JSX.Element;
  constant DEV (line 77) | const DEV = IS_DEV ? ({ hooks: DevHooks, writeSignal, registerGraph } as...

FILE: packages/solid/src/reactive/array.ts
  constant FALLBACK (line 12) | const FALLBACK = Symbol("fallback");
  function dispose (line 13) | function dispose(d: (() => void)[]) {
  function mapArray (line 49) | function mapArray<T, U>(
  function indexArray (line 186) | function indexArray<T, U>(

FILE: packages/solid/src/reactive/observable.ts
  type SymbolConstructor (line 17) | interface SymbolConstructor {
  type Observable (line 22) | interface Observable<T> {
  type ObservableObserver (line 29) | type ObservableObserver<T> =
  function observable (line 46) | function observable<T>(input: Accessor<T>): Observable<T> {
  type Producer (line 87) | type Producer<T> =
  function from (line 93) | function from<T>(

FILE: packages/solid/src/reactive/scheduler.ts
  type Task (line 2) | interface Task {
  type NavigatorScheduling (line 10) | type NavigatorScheduling = Navigator & {
  function setupScheduler (line 29) | function setupScheduler() {
  function enqueue (line 87) | function enqueue(taskQueue: Task[], task: Task) {
  function requestCallback (line 104) | function requestCallback(fn: () => void, options?: { timeout: number }):...
  function cancelCallback (line 128) | function cancelCallback(task: Task) {
  function flushWork (line 132) | function flushWork(initialTime: number) {
  function workLoop (line 144) | function workLoop(initialTime: number) {

FILE: packages/solid/src/reactive/signal.ts
  constant IS_DEV (line 32) | const IS_DEV = "_SOLID_DEV_" as string | boolean;
  constant SUPPORTS_PROXY (line 36) | const SUPPORTS_PROXY = typeof Proxy === "function";
  constant ERROR (line 40) | let ERROR: symbol | null = null;
  constant STALE (line 42) | const STALE = 1;
  constant PENDING (line 43) | const PENDING = 2;
  constant UNOWNED (line 44) | const UNOWNED: Owner = {
  constant NO_INIT (line 50) | const NO_INIT = {};
  type ComputationState (line 77) | type ComputationState = 0 | 1 | 2;
  type SourceMapValue (line 79) | interface SourceMapValue {
  type SignalState (line 85) | interface SignalState<T> extends SourceMapValue {
  type Owner (line 95) | interface Owner {
  type Computation (line 104) | interface Computation<Init, Next extends Init = Init> extends Owner {
  type TransitionState (line 117) | interface TransitionState {
  type ExternalSourceFactory (line 129) | type ExternalSourceFactory = <Prev, Next extends Prev = Prev>(
  type ExternalSource (line 134) | interface ExternalSource {
  type RootFunction (line 139) | type RootFunction<T> = (dispose: () => void) => T;
  function createRoot (line 150) | function createRoot<T>(fn: RootFunction<T>, detachedOwner?: typeof Owner...
  type Accessor (line 187) | type Accessor<T> = () => T;
  type Setter (line 189) | type Setter<in out T> = {
  type Signal (line 198) | type Signal<T> = [get: Accessor<T>, set: Setter<T>];
  type SignalOptions (line 200) | interface SignalOptions<T> extends MemoOptions<T> {
  function createSignal (line 229) | function createSignal<T>(
  type BaseOptions (line 263) | interface BaseOptions {
  type NoInfer (line 270) | type NoInfer<T extends any> = [T][T extends any ? 0 : never];
  type EffectOptions (line 272) | interface EffectOptions extends BaseOptions {}
  type EffectFunction (line 275) | type EffectFunction<Prev, Next extends Prev = Prev> = (v: Prev) => Next;
  function createComputed (line 298) | function createComputed<Next, Init>(
  function createRenderEffect (line 329) | function createRenderEffect<Next, Init>(
  function createEffect (line 360) | function createEffect<Next, Init>(
  function createReaction (line 386) | function createReaction(onInvalidate: () => void, options?: EffectOption...
  type Memo (line 407) | interface Memo<Prev, Next = Prev> extends SignalState<Next>, Computation...
  type MemoOptions (line 412) | interface MemoOptions<T> extends EffectOptions {
  function createMemo (line 442) | function createMemo<Next extends Prev, Init, Prev>(
  type Unresolved (line 467) | interface Unresolved {
  type Pending (line 475) | interface Pending {
  type Ready (line 483) | interface Ready<T> {
  type Refreshing (line 491) | interface Refreshing<T> {
  type Errored (line 499) | interface Errored {
  type Resource (line 507) | type Resource<T> = Unresolved | Pending | Ready<T> | Refreshing<T> | Err...
  type InitializedResource (line 509) | type InitializedResource<T> = Ready<T> | Refreshing<T> | Errored;
  type ResourceActions (line 511) | type ResourceActions<T, R = unknown> = {
  type ResourceSource (line 516) | type ResourceSource<S> = S | false | null | undefined | (() => S | false...
  type ResourceFetcher (line 518) | type ResourceFetcher<S, T, R = unknown> = (
  type ResourceFetcherInfo (line 523) | type ResourceFetcherInfo<T, R = unknown> = {
  type ResourceOptions (line 528) | type ResourceOptions<T, S = unknown> = {
  type InitializedResourceOptions (line 537) | type InitializedResourceOptions<T, S = unknown> = ResourceOptions<T, S> & {
  type ResourceReturn (line 541) | type ResourceReturn<T, R = unknown> = [Resource<T>, ResourceActions<T | ...
  type InitializedResourceReturn (line 543) | type InitializedResourceReturn<T, R = unknown> = [
  function isPromise (line 548) | function isPromise(v: any): v is Promise<any> {
  function createResource (line 598) | function createResource<T, S, R>(
  type DeferredOptions (line 763) | interface DeferredOptions<T> {
  function createDeferred (line 782) | function createDeferred<T>(source: Accessor<T>, options?: DeferredOption...
  type EqualityCheckerFunction (line 808) | type EqualityCheckerFunction<T, U> = (a: U, b: T) => boolean;
  function createSelector (line 834) | function createSelector<T, U = T>(
  function batch (line 884) | function batch<T>(fn: Accessor<T>): T {
  function untrack (line 895) | function untrack<T>(fn: Accessor<T>): T {
  type ReturnTypes (line 909) | type ReturnTypes<T> = T extends readonly Accessor<unknown>[]
  type AccessorArray (line 916) | type AccessorArray<T> = [...Extract<{ [K in keyof T]: Accessor<T[K]> }, ...
  type OnEffectFunction (line 919) | type OnEffectFunction<S, Prev, Next extends Prev = Prev> = (
  type OnOptions (line 925) | interface OnOptions {
  function on (line 965) | function on<S, Next extends Prev, Prev = Next>(
  function onMount (line 995) | function onMount(fn: () => void) {
  function onCleanup (line 1007) | function onCleanup<T extends () => any>(fn: T): T {
  function catchError (line 1024) | function catchError<T>(fn: () => T, handler: (err: Error) => void) {
  function getListener (line 1038) | function getListener() {
  function getOwner (line 1042) | function getOwner() {
  function runWithOwner (line 1046) | function runWithOwner<T>(o: typeof Owner, fn: () => T): T | undefined {
  function enableScheduling (line 1062) | function enableScheduling(scheduler = requestCallback) {
  function startTransition (line 1073) | function startTransition(fn: () => unknown): Promise<void> {
  type Transition (line 1107) | type Transition = [Accessor<boolean>, (fn: () => void) => Promise<void>];
  function useTransition (line 1120) | function useTransition(): Transition {
  function resumeEffects (line 1124) | function resumeEffects(e: Computation<any>[]) {
  type DevComponent (line 1129) | interface DevComponent<T> extends Memo<unknown> {
  function devComponent (line 1136) | function devComponent<P, V>(Comp: (props: P) => V, props: P): V {
  function registerGraph (line 1156) | function registerGraph(value: SourceMapValue): void {
  type ContextProviderComponent (line 1165) | type ContextProviderComponent<T> = FlowComponent<{ value: T }>;
  type Context (line 1168) | interface Context<T> {
  function createContext (line 1198) | function createContext<T>(
  function useContext (line 1214) | function useContext<T>(context: Context<T>): T {
  type ResolvedJSXElement (line 1221) | type ResolvedJSXElement = Exclude<JSX.Element, JSX.ArrayElement>;
  type ResolvedChildren (line 1222) | type ResolvedChildren = ResolvedJSXElement | ResolvedJSXElement[];
  type ChildrenReturn (line 1223) | type ChildrenReturn = Accessor<ResolvedChildren> & { toArray: () => Reso...
  function children (line 1233) | function children(fn: Accessor<JSX.Element>): ChildrenReturn {
  type SuspenseContextType (line 1246) | type SuspenseContextType = {
  type SuspenseContext (line 1254) | type SuspenseContext = Context<SuspenseContextType | undefined> & {
  function getSuspenseContext (line 1262) | function getSuspenseContext() {
  function enableExternalSource (line 1267) | function enableExternalSource(
  function readSignal (line 1293) | function readSignal(this: SignalState<any> | Memo<any>) {
  function writeSignal (line 1329) | function writeSignal(node: SignalState<any> | Memo<any>, value: any, isC...
  function updateComputation (line 1366) | function updateComputation(node: Computation<any>) {
  function runComputation (line 1390) | function runComputation(node: Computation<any>, value: any, time: number) {
  function createComputation (line 1427) | function createComputation<Next, Init = unknown>(
  function runTop (line 1488) | function runTop(node: Computation<any>) {
  function runUpdates (line 1521) | function runUpdates<T>(fn: () => T, init: boolean) {
  function completeUpdates (line 1539) | function completeUpdates(wait: boolean) {
  function runQueue (line 1589) | function runQueue(queue: Computation<any>[]) {
  function scheduleQueue (line 1593) | function scheduleQueue(queue: Computation<any>[]) {
  function runUserEffects (line 1611) | function runUserEffects(queue: Computation<any>[]) {
  function lookUpstream (line 1635) | function lookUpstream(node: Computation<any>, ignore?: Computation<any>) {
  function markDownstream (line 1651) | function markDownstream(node: Memo<any>) {
  function cleanNode (line 1665) | function cleanNode(node: Owner) {
  function reset (line 1705) | function reset(node: Computation<any>, top?: boolean) {
  function castError (line 1715) | function castError(err: unknown): Error {
  function runErrors (line 1720) | function runErrors(err: unknown, fns: ((err: any) => void)[], owner: Own...
  function handleError (line 1728) | function handleError(err: unknown, owner = Owner) {
  function resolveChildren (line 1743) | function resolveChildren(children: JSX.Element | Accessor<any>): Resolve...
  function createProvider (line 1756) | function createProvider(id: symbol, options?: EffectOptions) {
  type TODO (line 1772) | type TODO = any;
  function onError (line 1783) | function onError(fn: (err: Error) => void): void {
  function mutateContext (line 1795) | function mutateContext(o: Owner, key: symbol, value: any) {

FILE: packages/solid/src/render/Suspense.ts
  type SuspenseListContextType (line 17) | type SuspenseListContextType = {
  type SuspenseListRegisteredState (line 21) | type SuspenseListRegisteredState = { showContent: boolean; showFallback:...
  type SuspenseListState (line 22) | interface SuspenseListState extends Array<SuspenseListRegisteredState> {
  function SuspenseList (line 35) | function SuspenseList(props: {
  function Suspense (line 123) | function Suspense(props: { fallback?: JSX.Element; children: JSX.Element...

FILE: packages/solid/src/render/component.ts
  function enableHydration (line 17) | function enableHydration() {
  type Component (line 25) | type Component<P extends Record<string, any> = {}> = (props: P) => JSX.E...
  type VoidProps (line 32) | type VoidProps<P extends Record<string, any> = {}> = P & { children?: ne...
  type VoidComponent (line 38) | type VoidComponent<P extends Record<string, any> = {}> = Component<VoidP...
  type ParentProps (line 45) | type ParentProps<P extends Record<string, any> = {}> = P & { children?: ...
  type ParentComponent (line 51) | type ParentComponent<P extends Record<string, any> = {}> = Component<Par...
  type FlowProps (line 59) | type FlowProps<P extends Record<string, any> = {}, C = JSX.Element> = P ...
  type FlowComponent (line 66) | type FlowComponent<P extends Record<string, any> = {}, C = JSX.Element> ...
  type PropsWithChildren (line 71) | type PropsWithChildren<P extends Record<string, any> = {}> = ParentProps...
  type ValidComponent (line 73) | type ValidComponent = keyof JSX.IntrinsicElements | Component<any> | (st...
  type ComponentProps (line 82) | type ComponentProps<T extends ValidComponent> =
  type Ref (line 94) | type Ref<T> = T | ((val: T) => void);
  function createComponent (line 96) | function createComponent<T extends Record<string, any>>(
  function trueFn (line 115) | function trueFn() {
  method get (line 124) | get(_, property, receiver) {
  method has (line 128) | has(_, property) {
  method getOwnPropertyDescriptor (line 134) | getOwnPropertyDescriptor(_, property) {
  method ownKeys (line 145) | ownKeys(_) {
  type DistributeOverride (line 150) | type DistributeOverride<T, F> = T extends undefined ? F : T;
  type Override (line 151) | type Override<T, U> = T extends any
  type OverrideSpread (line 160) | type OverrideSpread<T, U> = T extends any
  type Simplify (line 171) | type Simplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;
  type _MergeProps (line 172) | type _MergeProps<T extends unknown[], Curr = {}> = T extends [
  type MergeProps (line 185) | type MergeProps<T extends unknown[]> = Simplify<_MergeProps<T>>;
  function resolveSource (line 187) | function resolveSource(s: any) {
  function resolveSources (line 191) | function resolveSources(this: (() => any)[]) {
  function mergeProps (line 198) | function mergeProps<T extends unknown[]>(...sources: T): MergeProps<T> {
  type SplitProps (line 278) | type SplitProps<T, K extends (readonly (keyof T)[])[]> = [
  function splitProps (line 287) | function splitProps<
  function lazy (line 356) | function lazy<T extends Component<any>>(
  function createUniqueId (line 398) | function createUniqueId(): string {

FILE: packages/solid/src/render/flow.ts
  function For (line 34) | function For<T extends readonly any[], U extends JSX.Element>(props: {
  function Index (line 64) | function Index<T extends readonly any[], U extends JSX.Element>(props: {
  type RequiredParameter (line 81) | type RequiredParameter<T> = T extends () => unknown ? never : T;
  function Show (line 101) | function Show<T>(props: {
  type EvalConditions (line 151) | type EvalConditions = readonly [number, Accessor<unknown>, MatchProps<un...
  function Switch (line 167) | function Switch(props: { fallback?: JSX.Element; children: JSX.Element }...
  type MatchProps (line 223) | type MatchProps<T> = {
  function Match (line 250) | function Match<T>(props: MatchProps<T>) {
  function resetErrorBoundaries (line 255) | function resetErrorBoundaries() {
  function ErrorBoundary (line 273) | function ErrorBoundary(props: {

FILE: packages/solid/src/render/hydration.ts
  type HydrationContext (line 3) | type HydrationContext = { id: string; count: number };
  type SharedConfig (line 5) | type SharedConfig = {
  method getContextId (line 24) | getContextId() {
  method getNextContextId (line 27) | getNextContextId() {
  function getContextId (line 32) | function getContextId(count: number) {
  function setHydrateContext (line 38) | function setHydrateContext(context?: HydrationContext): void {
  function nextHydrateContext (line 42) | function nextHydrateContext(): HydrationContext | undefined {

FILE: packages/solid/src/server/reactive.ts
  constant DEV (line 7) | const DEV = undefined;
  type Accessor (line 9) | type Accessor<T> = () => T;
  type Setter (line 10) | type Setter<T> = undefined extends T
  type Signal (line 13) | type Signal<T> = [get: Accessor<T>, set: Setter<T>];
  constant ERROR (line 15) | const ERROR = Symbol("error");
  function castError (line 16) | function castError(err: unknown): Error {
  function handleError (line 21) | function handleError(err: unknown, owner = Owner): void {
  constant UNOWNED (line 33) | const UNOWNED: Owner = { context: null, owner: null, owned: null, cleanu...
  type Owner (line 36) | interface Owner {
  function createOwner (line 43) | function createOwner(): Owner {
  function createRoot (line 52) | function createRoot<T>(fn: (dispose: () => void) => T, detachedOwner?: t...
  function createSignal (line 76) | function createSignal<T>(
  function createComputed (line 88) | function createComputed<T>(fn: (v?: T) => T, value?: T): void {
  function createEffect (line 101) | function createEffect<T>(fn: (v?: T) => T, value?: T): void {}
  function createReaction (line 103) | function createReaction(fn: () => void) {
  function createMemo (line 109) | function createMemo<T>(fn: (v?: T) => T, value?: T): () => T {
  function createDeferred (line 122) | function createDeferred<T>(source: () => T) {
  function createSelector (line 126) | function createSelector<T>(source: () => T, fn: (k: T, value: T) => bool...
  function batch (line 130) | function batch<T>(fn: () => T): T {
  function on (line 136) | function on<T, U>(
  function onMount (line 154) | function onMount(fn: () => void) {}
  function onCleanup (line 156) | function onCleanup(fn: () => void) {
  function cleanNode (line 164) | function cleanNode(node: Owner) {
  function catchError (line 175) | function catchError<T>(fn: () => T, handler: (err: Error) => void) {
  function getListener (line 188) | function getListener() {
  type Context (line 193) | interface Context<T> {
  function createContext (line 199) | function createContext<T>(defaultValue?: T): Context<T> {
  function useContext (line 204) | function useContext<T>(context: Context<T>): T {
  function getOwner (line 210) | function getOwner() {
  type ChildrenReturn (line 214) | type ChildrenReturn = Accessor<any> & { toArray: () => any[] };
  function children (line 215) | function children(fn: () => any): ChildrenReturn {
  function runWithOwner (line 224) | function runWithOwner<T>(o: typeof Owner, fn: () => T): T | undefined {
  function resolveChildren (line 236) | function resolveChildren(children: any): unknown {
  function createProvider (line 250) | function createProvider(id: symbol) {
  type Task (line 259) | interface Task {
  function requestCallback (line 265) | function requestCallback(fn: () => void, options?: { timeout: number }):...
  function cancelCallback (line 268) | function cancelCallback(task: Task) {}
  function mapArray (line 270) | function mapArray<T, U>(
  function indexArray (line 283) | function indexArray<T, U>(
  type ObservableObserver (line 296) | type ObservableObserver<T> =
  function observable (line 303) | function observable<T>(input: Accessor<T>) {
  function from (line 340) | function from<T>(
  function enableExternalSource (line 361) | function enableExternalSource(factory: any) {}
  function onError (line 366) | function onError(fn: (err: Error) => void): void {
  function mutateContext (line 376) | function mutateContext(o: Owner, key: symbol, value: any) {

FILE: packages/solid/src/server/rendering.ts
  type Component (line 17) | type Component<P = {}> = (props: P) => JSX.Element;
  type VoidProps (line 18) | type VoidProps<P = {}> = P & { children?: never };
  type VoidComponent (line 19) | type VoidComponent<P = {}> = Component<VoidProps<P>>;
  type ParentProps (line 20) | type ParentProps<P = {}> = P & { children?: JSX.Element };
  type ParentComponent (line 21) | type ParentComponent<P = {}> = Component<ParentProps<P>>;
  type FlowProps (line 22) | type FlowProps<P = {}, C = JSX.Element> = P & { children: C };
  type FlowComponent (line 23) | type FlowComponent<P = {}, C = JSX.Element> = Component<FlowProps<P, C>>;
  type Ref (line 24) | type Ref<T> = T | ((val: T) => void);
  type ValidComponent (line 25) | type ValidComponent = keyof JSX.IntrinsicElements | Component<any> | (st...
  type ComponentProps (line 26) | type ComponentProps<T extends ValidComponent> =
  function escape (line 35) | function escape(s: any, attr?: boolean) {
  function resolveSSRNode (line 88) | function resolveSSRNode(node: any): string {
  type SharedConfig (line 106) | type SharedConfig = {
  method getContextId (line 113) | getContextId() {
  method getNextContextId (line 117) | getNextContextId() {
  function getContextId (line 124) | function getContextId(count: number) {
  function setHydrateContext (line 130) | function setHydrateContext(context?: HydrationContext): void {
  function nextHydrateContext (line 134) | function nextHydrateContext(): HydrationContext | undefined {
  function createUniqueId (line 144) | function createUniqueId(): string {
  function createComponent (line 148) | function createComponent<T>(Comp: (props: T) => JSX.Element, props: T): ...
  function mergeProps (line 167) | function mergeProps(...sources: any): any {
  function splitProps (line 239) | function splitProps<T>(props: T, ...keys: [(keyof T)[]]) {
  function simpleMap (line 255) | function simpleMap(
  function For (line 270) | function For<T>(props: {
  function Index (line 279) | function Index<T>(props: {
  type RequiredParameter (line 287) | type RequiredParameter<T> = T extends () => unknown ? never : T;
  function Show (line 292) | function Show<T>(props: {
  function Switch (line 306) | function Switch(props: {
  type MatchProps (line 323) | type MatchProps<T> = {
  function Match (line 328) | function Match<T>(props: MatchProps<T>) {
  function resetErrorBoundaries (line 332) | function resetErrorBoundaries() {}
  function ErrorBoundary (line 333) | function ErrorBoundary(props: {
  type Resource (line 367) | interface Resource<T> {
  type SuspenseContextType (line 375) | type SuspenseContextType = {
  type ResourceActions (line 380) | type ResourceActions<T> = { mutate: Setter<T>; refetch: (info?: unknown)...
  type ResourceReturn (line 382) | type ResourceReturn<T> = [Resource<T>, ResourceActions<T>];
  type ResourceSource (line 384) | type ResourceSource<S> = S | false | null | undefined | (() => S | false...
  type ResourceFetcher (line 386) | type ResourceFetcher<S, T> = (k: S, info: ResourceFetcherInfo<T>) => T |...
  type ResourceFetcherInfo (line 388) | type ResourceFetcherInfo<T> = { value: T | undefined; refetching?: unkno...
  type ResourceOptions (line 390) | type ResourceOptions<T> = undefined extends T
  function createResource (line 428) | function createResource<T, S>(
  function lazy (line 548) | function lazy<T extends Component<any>>(
  function suspenseComplete (line 589) | function suspenseComplete(c: SuspenseContextType) {
  function notifySuspense (line 596) | function notifySuspense(contexts: Set<SuspenseContextType>) {
  function enableScheduling (line 606) | function enableScheduling() {}
  function enableHydration (line 608) | function enableHydration() {}
  function startTransition (line 610) | function startTransition(fn: () => any): void {
  function useTransition (line 614) | function useTransition(): [() => boolean, (fn: () => any) => void] {
  type HydrationContext (line 623) | type HydrationContext = {
  function SuspenseList (line 638) | function SuspenseList(props: {
  function Suspense (line 654) | function Suspense(props: { fallback?: string; children: string }) {

FILE: packages/solid/store/src/index.ts
  constant DEV (line 20) | const DEV = IS_DEV ? ({ $NODE, isWrappable, hooks: DevHooks } as const) ...

FILE: packages/solid/store/src/modifiers.ts
  type ReconcileOptions (line 5) | type ReconcileOptions = {
  function applyState (line 10) | function applyState(
  function reconcile (line 129) | function reconcile<T extends U, U>(
  method get (line 144) | get(target, property): any {
  method set (line 154) | set(target, property, value) {
  method deleteProperty (line 159) | deleteProperty(target, property) {
  function produce (line 166) | function produce<T>(fn: (state: T) => void): (state: T) => T {

FILE: packages/solid/store/src/mutable.ts
  function proxyDescriptor (line 17) | function proxyDescriptor(target: StoreNode, property: PropertyKey) {
  method get (line 38) | get(target, property, receiver) {
  method has (line 63) | has(target, property) {
  method set (line 77) | set(target, property, value) {
  method deleteProperty (line 82) | deleteProperty(target, property) {
  function wrap (line 92) | function wrap<T extends StoreNode>(value: T): T {
  function createMutable (line 139) | function createMutable<T extends StoreNode>(state: T, options?: { name?:...
  function modifyMutable (line 151) | function modifyMutable<T>(state: T, modifier: (state: T) => T) {

FILE: packages/solid/store/src/server.ts
  function isWrappable (line 19) | function isWrappable(obj: any) {
  function unwrap (line 27) | function unwrap<T>(item: T): T {
  function setProperty (line 31) | function setProperty(state: any, property: PropertyKey, value: any, forc...
  function mergeStoreNode (line 38) | function mergeStoreNode(state: any, value: any, force?: boolean) {
  function updateArray (line 46) | function updateArray(
  function updatePath (line 63) | function updatePath(current: any, path: any[], traversed: PropertyKey[] ...
  function createStore (line 108) | function createStore<T>(state: T | Store<T>): [Store<T>, SetStoreFunctio...
  function createMutable (line 116) | function createMutable<T>(state: T | Store<T>): T {
  function modifyMutable (line 120) | function modifyMutable<T>(state: T, modifier: (state: T) => T) {
  type ReconcileOptions (line 124) | type ReconcileOptions = {
  function reconcile (line 130) | function reconcile<T extends U, U extends object>(
  function produce (line 150) | function produce<T>(fn: (state: T) => void): (state: T) => T {
  constant DEV (line 157) | const DEV = undefined;

FILE: packages/solid/store/src/store.ts
  constant IS_DEV (line 4) | const IS_DEV = "_SOLID_DEV_" as string | boolean;
  type DataNode (line 16) | type DataNode = {
  type DataNodes (line 20) | type DataNodes = Record<PropertyKey, DataNode | undefined>;
  type OnStoreNodeUpdate (line 22) | type OnStoreNodeUpdate = (
  type StoreNode (line 29) | interface StoreNode {
  type Unwrappable (line 35) | interface Unwrappable {}
  type NotWrappable (line 37) | type NotWrappable =
  type Store (line 47) | type Store<T> = T;
  function wrap (line 49) | function wrap<T extends StoreNode>(value: T): T {
  function isWrappable (line 71) | function isWrappable(obj: any) {
  function unwrap (line 95) | function unwrap<T>(item: any, set = new Set()): T {
  function getNodes (line 122) | function getNodes(target: StoreNode, symbol: typeof $NODE | typeof $HAS)...
  function getNode (line 129) | function getNode(nodes: DataNodes, property: PropertyKey, value?: any) {
  function proxyDescriptor (line 139) | function proxyDescriptor(target: StoreNode, property: PropertyKey) {
  function trackSelf (line 149) | function trackSelf(target: StoreNode) {
  function ownKeys (line 153) | function ownKeys(target: StoreNode) {
  method get (line 159) | get(target, property, receiver) {
  method has (line 183) | has(target, property) {
  method set (line 197) | set() {
  method deleteProperty (line 202) | deleteProperty() {
  function setProperty (line 212) | function setProperty(
  function mergeStoreNode (line 243) | function mergeStoreNode(state: StoreNode, value: Partial<StoreNode>) {
  function updateArray (line 251) | function updateArray(
  function updatePath (line 269) | function updatePath(current: StoreNode, path: any[], traversed: Property...
  type DeepReadonly (line 316) | type DeepReadonly<T> = 0 extends 1 & T
  type DeepMutable (line 324) | type DeepMutable<T> = 0 extends 1 & T
  type CustomPartial (line 332) | type CustomPartial<T> = T extends readonly unknown[]
  type PickMutable (line 338) | type PickMutable<T> = {
  type StorePathRange (line 348) | type StorePathRange = { from?: number; to?: number; by?: number };
  type ArrayFilterFn (line 350) | type ArrayFilterFn<T> = (item: T, index: number) => boolean;
  type StoreSetter (line 352) | type StoreSetter<T, U extends PropertyKey[] = []> =
  type Part (line 357) | type Part<T, K extends KeyOf<T> = KeyOf<T>> =
  type W (line 363) | type W<T> = Exclude<T, NotWrappable>;
  type KeyOf (line 366) | type KeyOf<T> = number extends keyof T // have to check this otherwise t...
  type MutableKeyOf (line 377) | type MutableKeyOf<T> = KeyOf<T> & keyof PickMutable<T>;
  type Rest (line 380) | type Rest<T, U extends PropertyKey[], K extends KeyOf<T> = KeyOf<T>> = [...
  type RestContinue (line 388) | type RestContinue<T, U extends PropertyKey[]> = 0 extends 1 & T
  type RestSetterOrContinue (line 392) | type RestSetterOrContinue<T, U extends PropertyKey[]> = [StoreSetter<T, ...
  type SetStoreFunction (line 394) | interface SetStoreFunction<T> {
  function createStore (line 501) | function createStore<T extends object = {}>(

FILE: packages/solid/store/test/modifiers.spec.ts
  type DataState (line 171) | interface DataState {
  type TodoState (line 243) | interface TodoState {
  type TodoState (line 264) | type TodoState = Array<{

FILE: packages/solid/store/test/mutable.spec.ts
  method greeting (line 34) | get greeting(): string {
  method fullName (line 50) | get fullName(): string {
  method fullName (line 53) | set fullName(value) {
  method b (line 282) | get b() {

FILE: packages/solid/store/test/mutableWithClass.spec.tsx
  class D (line 7) | class D {
    method e (line 9) | get e() {
  class A (line 13) | class A {
    method b (line 15) | get b() {
    method getVal (line 60) | get getVal() {
  class A (line 58) | class A {
    method b (line 15) | get b() {
    method getVal (line 60) | get getVal() {
  class B (line 64) | class B extends A {}

FILE: packages/solid/store/test/store.spec.ts
  method greeting (line 46) | get greeting(): string {
  method greeting (line 62) | get greeting(): string {
  class CustomThing (line 697) | class CustomThing {
    method constructor (line 700) | constructor(value: number) {
    method constructor (line 729) | constructor(value: number) {
  class CustomThing (line 726) | class CustomThing {
    method constructor (line 700) | constructor(value: number) {
    method constructor (line 729) | constructor(value: number) {
  method b (line 758) | get b() {
  type Recursive (line 956) | type Recursive = { a: Recursive };
  type User (line 966) | type User = {
  type A (line 1014) | type A = { a: T; b: Record<string, string>; c: Record<T, string> };

FILE: packages/solid/test/component.bench.ts
  method get (line 13) | get() {
  type Test (line 39) | type Test = {
  function createTest (line 44) | function createTest<T extends (...args: any[]) => any, G extends (...arg...
  type SplitProps (line 80) | type SplitProps = (...args: any[]) => Record<string, any>[];
  method get (line 90) | get(target, property) {
  method has (line 94) | has(target, property) {
  method ownKeys (line 98) | ownKeys(target) {

FILE: packages/solid/test/component.spec.ts
  type SimplePropTypes (line 14) | type SimplePropTypes = {
  method name (line 35) | get name() {
  method a (line 56) | get a() {
  method value (line 71) | get value() {
  method value (line 76) | get value() {
  method a (line 89) | get a() {
  method value2 (line 110) | get value2() {
  method value3 (line 138) | get value3() {
  method a (line 151) | get a() {
  method b (line 156) | get b() {
  method b (line 181) | get b() {
  method b (line 191) | get b() {
  method a (line 235) | get a() {
  method a (line 254) | get a() {
  method a (line 290) | get a() {
  method name (line 330) | get name() {
  method get (line 356) | get() {
  method c (line 424) | get c() {
  method w (line 430) | get w() {
  method color (line 471) | get color() {

FILE: packages/solid/test/component.type-tests.ts
  type Assert (line 3) | type Assert<T extends true> = never;
  type IsExact (line 5) | type IsExact<T, U, I = never> =
  type M1 (line 47) | type M1 = typeof m1;
  type TestM1 (line 48) | type TestM1 = Assert<
  type M2 (line 78) | type M2 = typeof m2;
  type TestM2 (line 79) | type TestM2 = Assert<IsExact<M2, { a?: number }>>;
  type M3 (line 83) | type M3 = typeof m3;
  type TestM3 (line 84) | type TestM3 = Assert<IsExact<M3, { a: number }>>;
  type M4Type (line 87) | type M4Type = {
  function M4 (line 91) | function M4<T extends keyof M4Type = "a">(
  type M5 (line 157) | type M5 = typeof m5;
  type TestM5 (line 158) | type TestM5 = Assert<IsExact<M5, { a: number; b: number; c: number }>>;
  type M6 (line 161) | type M6 = typeof m6;
  type TestM6 (line 162) | type TestM6 = Assert<IsExact<M6, { b: number; c: number }>>;
  type M7 (line 165) | type M7 = typeof m7;
  type TestM7 (line 166) | type TestM7 = Assert<IsExact<M7, { a: number; b: number }>>;
  type M8 (line 169) | type M8 = typeof m8;
  type TestM8 (line 170) | type TestM8 = Assert<IsExact<M8, { b: number }>>;
  type M9 (line 173) | type M9 = typeof m9;
  type TestM9 (line 174) | type TestM9 = Assert<IsExact<M9, { a: number; b: number; c: number }>>;
  type S1 (line 179) | type S1 = typeof s1;
  type TestS1 (line 180) | type TestS1 = Assert<IsExact<S1, [{ a: number }, { b: number }]>>;
  type S2 (line 183) | type S2 = typeof s2;
  type TestS2 (line 184) | type TestS2 = Assert<IsExact<S2, { b: number }>>;
  type S3 (line 187) | type S3 = typeof s3;
  type TestS3 (line 188) | type TestS3 = Assert<IsExact<S3, { a: number }>>;

FILE: packages/solid/test/external-source.spec.ts
  class ExternalSource (line 6) | class ExternalSource<T = any> {
    method constructor (line 9) | constructor(private value: T) {}
    method update (line 11) | update(x: T) {
    method get (line 16) | get() {
    method removeListener (line 24) | removeListener(listener: () => void) {
  function untrackSource (line 31) | function untrackSource<T>(fn: () => T) {

FILE: packages/solid/test/observable.spec.ts
  method next (line 47) | next(v) {

FILE: packages/solid/test/resource.spec.ts
  function fetcher (line 23) | function fetcher(id: string) {
  type User (line 80) | interface User {
  function fetcher (line 92) | function fetcher(_: unknown, { value }: ResourceFetcherInfo<Store<User>>) {
  method user (line 106) | get user() {
  method userLoading (line 109) | get userLoading() {
  function fetcher (line 153) | function fetcher(id: string) {
  function fetcher (line 186) | function fetcher(id: string) {
  type User (line 238) | type User = {
  function fetcher (line 251) | function fetcher() {
  function createDeepSignal (line 256) | function createDeepSignal<T>(value: T, options?: ReconcileOptions): Sign...

FILE: packages/solid/test/resource.type-tests.ts
  type Assert (line 4) | type Assert<T extends true> = T;
  type Equals (line 6) | type Equals<X, Y> =
  type Tests (line 17) | type Tests = Assert<Equals<typeof resourceReturn, ResourceReturn<number,...
  type Tests (line 25) | type Tests = Assert<Equals<typeof k, true | undefined>> &
  type Tests (line 38) | type Tests = Assert<
  type Tests (line 49) | type Tests = Assert<Equals<typeof k, true | undefined>> &
  type ResourceActions (line 55) | type ResourceActions = (typeof resourceReturn)[1];
  type Tests (line 56) | type Tests = Assert<Equals<ResourceActions["mutate"], Setter<number>>>;
  type Tests (line 66) | type Tests = Assert<Equals<typeof resourceReturn, ResourceReturn<number,...
  type Tests (line 74) | type Tests = Assert<Equals<typeof k, number | undefined>> &
  type ResourceActions (line 80) | type ResourceActions = (typeof resourceReturn)[1];
  type Tests (line 81) | type Tests = Assert<Equals<ResourceActions["mutate"], Setter<number | un...
  type Tests (line 90) | type Tests = Assert<
  type Tests (line 101) | type Tests = Assert<Equals<typeof k, number | undefined>> &
  type Tests (line 115) | type Tests = Assert<Equals<typeof resourceValue, string | undefined>> &
  type Test (line 139) | type Test = Assert<Equals<typeof errorValue, never>> &
  type Test (line 157) | type Test = Assert<Equals<typeof errorValue, never>> &

FILE: packages/solid/test/signals.memo.spec.ts
  function init (line 206) | function init() {

FILE: packages/solid/test/signals.type-tests.ts
  class Animal (line 14) | class Animal {
  class Dog (line 17) | class Dog extends Animal {
  function createGenericSignal (line 871) | function createGenericSignal<T>(): Signal<T | undefined> {
  function createInitializedSignal (line 877) | function createInitializedSignal<T>(init: T): Signal<T> {
  type KobalteBaseSelectProps (line 883) | interface KobalteBaseSelectProps<Option, OptGroup = never> {
  type KobaltSingleSelectProps (line 887) | interface KobaltSingleSelectProps<T> {
  type KobaltMultiSelectProps (line 893) | interface KobaltMultiSelectProps<T> {
  type KobaltSelectProps (line 899) | type KobaltSelectProps<Option, OptGroup = never> = (
  type fruits (line 905) | type fruits = "apple" | "banana" | "orange";
  function kobalteSelect (line 909) | function kobalteSelect<T>(props: KobaltSelectProps<T>) {}

FILE: packages/solid/universal/src/index.ts
  function createRenderer (line 7) | function createRenderer<NodeType>(options: RendererOptions<NodeType>): R...

FILE: packages/solid/web/server/index.ts
  function createDynamic (line 22) | function createDynamic<T extends ValidComponent>(
  type DynamicProps (line 37) | type DynamicProps<T extends ValidComponent, P = ComponentProps<T>> = {
  function Dynamic (line 43) | function Dynamic<T extends ValidComponent>(props: DynamicProps<T>): JSX....
  function Portal (line 48) | function Portal(props: { mount?: Node; useShadow?: boolean; children: JS...

FILE: packages/solid/web/src/index.ts
  constant SVG_NAMESPACE (line 38) | const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
  function createElement (line 40) | function createElement(tagName: string, isSVG = false, is = undefined): ...
  function Portal (line 58) | function Portal<T extends boolean = false, S extends boolean = false>(pr...
  type DynamicProps (line 113) | type DynamicProps<T extends ValidComponent, P = ComponentProps<T>> = {
  function createDynamic (line 131) | function createDynamic<T extends ValidComponent>(
  function Dynamic (line 168) | function Dynamic<T extends ValidComponent>(props: DynamicProps<T>): JSX....

FILE: packages/solid/web/src/server-mock.ts
  function throwInBrowser (line 2) | function throwInBrowser(func: Function) {
  function renderToString (line 8) | function renderToString<T>(
  function renderToStringAsync (line 17) | function renderToStringAsync<T>(
  function renderToStream (line 27) | function renderToStream<T>(
  function ssr (line 41) | function ssr(template: string[] | string, ...nodes: any[]): { t: string ...
  function ssrElement (line 42) | function ssrElement(
  function ssrClassList (line 48) | function ssrClassList(value: { [k: string]: boolean }): string {}
  function ssrStyle (line 49) | function ssrStyle(value: { [k: string]: string }): string {}
  function ssrAttribute (line 50) | function ssrAttribute(key: string, value: boolean): string {}
  function ssrHydrationKey (line 51) | function ssrHydrationKey(): string {}
  function resolveSSRNode (line 52) | function resolveSSRNode(node: any): string {}
  function escape (line 53) | function escape(html: string): string {}
  function ssrSpread (line 58) | function ssrSpread(props: any, isSVG: boolean, skipChildren: boolean): v...
  type LegacyResults (line 59) | type LegacyResults = {

FILE: packages/solid/web/storage/src/index.ts
  function provideRequestEvent (line 6) | function provideRequestEvent<T extends RequestEvent, U>(init: T, cb: () ...

FILE: packages/solid/web/test/dynamic.spec.tsx
  type ExampleProps (line 13) | interface ExampleProps {
  type ExampleProps (line 61) | interface ExampleProps {

FILE: packages/solid/web/test/element.spec.tsx
  type Directives (line 10) | interface Directives {

FILE: packages/solid/web/test/for.spec.tsx
  function apply (line 22) | function apply(array: string[]) {
  function apply (line 104) | function apply(array: string[]) {
  function apply (line 195) | function apply(array: string[]) {
  function apply (line 279) | function apply(array: string[]) {

FILE: packages/solid/web/test/index.spec.tsx
  function apply (line 22) | function apply(array: string[]) {
  function apply (line 104) | function apply(array: string[]) {
  function apply (line 195) | function apply(array: string[]) {
  function apply (line 286) | function apply(array: string[]) {

FILE: packages/solid/web/test/show.spec.tsx
  function when (line 77) | function when() {
  function when (line 128) | function when() {
  function when (line 179) | function when() {

FILE: packages/solid/web/test/switch.spec.tsx
  function makeCondition (line 213) | function makeCondition() {

FILE: packages/test-integration/test-imports.mjs
  function checkError (line 1) | function checkError(error) {

FILE: packages/test-integration/tests/downloaded.spec.ts
  function makeTestRepo (line 6) | function makeTestRepo(
  type TestRepo (line 17) | type TestRepo = ReturnType<typeof makeTestRepo>;
  function npmInstaller (line 19) | function npmInstaller(dependencies: string[]) {
  function testPackage (line 24) | async function testPackage(testRepo: TestRepo, dependencies: string[], i...
  function pack (line 52) | function pack(packageRoot: string) {
  function packageExists (line 61) | function packageExists(packageRoot: string) {
Condensed preview — 178 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (894K chars).
[
  {
    "path": ".changeset/README.md",
    "chars": 510,
    "preview": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that wo"
  },
  {
    "path": ".changeset/config.json",
    "chars": 305,
    "preview": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.2.0/schema.json\",\n  \"changelog\": \"@changesets/cli/changelog\",\n  \""
  },
  {
    "path": ".editorconfig",
    "chars": 114,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = LF\ncharset = utf-8\ninsert_final_newline = true"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 23,
    "preview": "open_collective: solid\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3479,
    "preview": "name: '🐛 Bug report'\ndescription: Create a report to help us improve\nbody:\n  - type: markdown\n    attributes:\n      valu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 1034,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: 🤔 Long question or idea\n    url: https://github.com/solidjs/solid/di"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1223,
    "preview": "<!--\n  Thanks for submitting a pull request!\n  We appreciate you spending the time to work on these changes. Please prov"
  },
  {
    "path": ".github/workflows/main-ci.yml",
    "chars": 899,
    "preview": "name: 'Solid CI'\n\non:\n  pull_request:\n    branches:\n      - '*'\n  push:\n    branches:\n      - main\n\njobs:\n job:\n  runs-o"
  },
  {
    "path": ".gitignore",
    "chars": 359,
    "preview": "node_modules/\ndist/\nlib/\n.vscode/\n.idea/\ncoverage/\ntypes/\n.DS_Store\n.turbo/\n\npackages/solid/src/jsx.d.ts\npackages/solid/"
  },
  {
    "path": ".gitpod.yml",
    "chars": 97,
    "preview": "tasks:\n  - init: pnpm install && pnpm run build\nvscode:\n  extensions: [\"esbenp.prettier-vscode\"]\n"
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "22.13.1\n"
  },
  {
    "path": ".prettierrc",
    "chars": 133,
    "preview": "{\n  \"trailingComma\": \"none\",\n  \"tabWidth\": 2,\n  \"semi\": true,\n  \"singleQuote\": false,\n  \"arrowParens\": \"avoid\",\n  \"print"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 72160,
    "preview": "# Changelog\n\n## 1.8.0 - 2023-10-09\n\nI admit this is not the most exciting release from a feature standpoint. We are in t"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5221,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6851,
    "preview": "# Contributing to SolidJS\n\nThank you for investing your time in contributing to our project! ✨.\n\nRead our [Code of Condu"
  },
  {
    "path": "LICENSE",
    "chars": 1075,
    "preview": "MIT License\n\nCopyright (c) 2016-2025 Ryan Carniato\n\nPermission is hereby granted, free of charge, to any person obtainin"
  },
  {
    "path": "README.md",
    "chars": 14319,
    "preview": "<p>\n  <img src=\"https://assets.solidjs.com/banner?project=Library&type=core\" alt=\"SolidJS\" />\n</p>\n\n[![Build Status](htt"
  },
  {
    "path": "documentation/resources/examples.md",
    "chars": 2987,
    "preview": "# Examples\n\n## Online\n- [Counter](https://codesandbox.io/s/8no2n9k94l) Simple Counter\n- [Simple Todos](https://codesandb"
  },
  {
    "path": "package.json",
    "chars": 2106,
    "preview": "{\n  \"name\": \"solid-js\",\n  \"description\": \"A declarative JavaScript library for building user interfaces.\",\n  \"version\": "
  },
  {
    "path": "packages/babel-preset-solid/CHANGELOG.md",
    "chars": 6889,
    "preview": "# babel-preset-solid\n\n## 1.9.10\n\n### Patch Changes\n\n- 6c92555: Update dom-expressions, seroval plugins, optional chainin"
  },
  {
    "path": "packages/babel-preset-solid/README.md",
    "chars": 930,
    "preview": "# babel-preset-solid\r\nBabel preset to transform JSX into Solid runtime calls.\r\n\r\n### Install\r\n\r\nVia NPM\r\n\r\n```javascript"
  },
  {
    "path": "packages/babel-preset-solid/index.js",
    "chars": 676,
    "preview": "const jsxTransform = require(\"babel-plugin-jsx-dom-expressions\");\n\nmodule.exports = function (context, options = {}) {\n "
  },
  {
    "path": "packages/babel-preset-solid/package.json",
    "chars": 718,
    "preview": "{\n  \"name\": \"babel-preset-solid\",\n  \"version\": \"1.9.10\",\n  \"description\": \"Babel preset to transform JSX for Solid.js\",\n"
  },
  {
    "path": "packages/babel-preset-solid/test.js",
    "chars": 400,
    "preview": "const babel = require(\"@babel/core\");\nconst preset = require(\".\");\nconst assert = require(\"assert\");\n\nconst { code } = b"
  },
  {
    "path": "packages/solid/.npmignore",
    "chars": 27,
    "preview": "types/tsconfig.tsbuildinfo\n"
  },
  {
    "path": "packages/solid/CHANGELOG.md",
    "chars": 19021,
    "preview": "# solid-js\n\n## 1.9.11\n\n### Patch Changes\n\n- 6628d9f: Update dom-expressions/seroval to latest\n\n## 1.9.10\n\n### Patch Chan"
  },
  {
    "path": "packages/solid/README.md",
    "chars": 14082,
    "preview": "<p>\n  <img src=\"https://assets.solidjs.com/banner?project=Library&type=core\" alt=\"SolidJS\" />\n</p>\n\n[![Build Status](htt"
  },
  {
    "path": "packages/solid/babel.config.cjs",
    "chars": 926,
    "preview": "const path = require('path');\r\n\r\nmodule.exports = {\r\n  env: {\r\n    test: {\r\n      presets: [\r\n        [\"@babel/preset-en"
  },
  {
    "path": "packages/solid/bench/bench.cjs",
    "chars": 8366,
    "preview": "const { createRoot, createSignal, createComputed } = require(\"../dist/solid.cjs\");\r\n\r\nvar now = typeof process === 'unde"
  },
  {
    "path": "packages/solid/bench/libraries/kairo.cjs",
    "chars": 15182,
    "preview": "let currentCollecting = null;\nfunction setData(data, value) {\n  if (!inTransaction) {\n    return runInTransaction(() => "
  },
  {
    "path": "packages/solid/bench/libraries/preact.cjs",
    "chars": 12971,
    "preview": "// preact signals 1.1.0 (c) 2018 Jason Miller\n// https://github.com/preactjs/signals\n\nfunction cycleDetected() {\n\tthrow "
  },
  {
    "path": "packages/solid/bench/libraries/rval-mod.cjs",
    "chars": 5534,
    "preview": "const NOT_TRACKING = 0;\r\nconst STALE = 1;\r\nconst UP_TO_DATE = 2;\r\n\r\nconst context = {\r\n  isUpdating: false,\r\n  pending: "
  },
  {
    "path": "packages/solid/bench/libraries/s-mod.cjs",
    "chars": 16071,
    "preview": "// Modified version of S.js[https://github.com/adamhaile/S] by Adam Haile\r\n// Comparator memos from VSJolund fork https:"
  },
  {
    "path": "packages/solid/bench/libraries/s.cjs",
    "chars": 14172,
    "preview": "\"use strict\";\n\n// Public interface\nvar S = function S(fn, value) {\n  if (Owner === null)\n    console.warn(\"computations "
  },
  {
    "path": "packages/solid/bench/libraries/sinuous-mod.cjs",
    "chars": 5260,
    "preview": "function getChildrenDeep(children, res) {\r\n  for (let i = 0; i < children.length; i += 1) {\r\n    res.push(children[i]);\r"
  },
  {
    "path": "packages/solid/bench/libraries/sinuous.cjs",
    "chars": 5932,
    "preview": "function getChildrenDeep(children) {\r\n  return children.reduce(\r\n    (res, curr) => res.concat(curr, getChildrenDeep(cur"
  },
  {
    "path": "packages/solid/bench/libraries/usignal.cjs",
    "chars": 6256,
    "preview": "// uSignal 0.7.0 https://github.com/WebReflection/usignal\n\n'use strict';\n/*! (c) Andrea Giammarchi */\n\nconst {is} = Obje"
  },
  {
    "path": "packages/solid/bench/libraries/vuerx.cjs",
    "chars": 26204,
    "preview": "//shared\r\n// Make a map and return a function for checking if a key\r\n// is in that map.\r\n//\r\n// IMPORTANT: all calls of "
  },
  {
    "path": "packages/solid/bench/prototypes/message-noarray.cjs",
    "chars": 8045,
    "preview": "const equalFn = (a, b) => a === b;\nconst signalOptions = {\n  equals: equalFn\n};\nlet runEffects = runQueue;\nconst UNOWNED"
  },
  {
    "path": "packages/solid/bench/prototypes/message.cjs",
    "chars": 6817,
    "preview": "const equalFn = (a, b) => a === b;\nconst signalOptions = {\n  equals: equalFn\n};\nlet runEffects = runQueue;\nconst UNOWNED"
  },
  {
    "path": "packages/solid/bench/prototypes/queue-noarray.cjs",
    "chars": 8067,
    "preview": "const equalFn = (a, b) => a === b;\nconst signalOptions = {\n  equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQu"
  },
  {
    "path": "packages/solid/bench/prototypes/queue.cjs",
    "chars": 6952,
    "preview": "const equalFn = (a, b) => a === b;\nconst signalOptions = {\n  equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQu"
  },
  {
    "path": "packages/solid/bench/results.md",
    "chars": 9215,
    "preview": "# Benchmark Results (22/09/2022)\n\nThis benchmark is mostly to serve Solid's own R&D. Everything is coerced to Solid's AP"
  },
  {
    "path": "packages/solid/h/README.md",
    "chars": 2843,
    "preview": "# Solid HyperScript\n\nThis sub module provides a HyperScript method for Solid. This is useful to use Solid in non-compile"
  },
  {
    "path": "packages/solid/h/jsx-dev-runtime/package.json",
    "chars": 216,
    "preview": "{\n  \"name\": \"solid-js/h/jsx-dev-runtime\",\n  \"main\": \"../jsx-runtime/dist/jsx.cjs\",\n  \"module\": \"../jsx-runtime/dist/jsx."
  },
  {
    "path": "packages/solid/h/jsx-runtime/package.json",
    "chars": 173,
    "preview": "{\n  \"name\": \"solid-js/h/jsx-runtime\",\n  \"main\": \"./dist/jsx.cjs\",\n  \"module\": \"./dist/jsx.js\",\n  \"types\": \"./types/index"
  },
  {
    "path": "packages/solid/h/jsx-runtime/src/index.ts",
    "chars": 384,
    "preview": "import h from \"solid-js/h\";\nexport type { JSX } from \"./jsx.d.ts\";\nimport type { JSX } from \"./jsx.d.ts\";\n\nfunction Frag"
  },
  {
    "path": "packages/solid/h/jsx-runtime/tsconfig.json",
    "chars": 195,
    "preview": "{\n  \"extends\": \"../../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"p"
  },
  {
    "path": "packages/solid/h/package.json",
    "chars": 157,
    "preview": "{\n  \"name\": \"solid-js/h\",\n  \"main\": \"./dist/h.cjs\",\n  \"module\": \"./dist/h.js\",\n  \"types\": \"./types/index.d.ts\",\n  \"type\""
  },
  {
    "path": "packages/solid/h/src/hyperscript.ts",
    "chars": 39,
    "preview": "export * from \"hyper-dom-expressions\";\n"
  },
  {
    "path": "packages/solid/h/src/index.ts",
    "chars": 370,
    "preview": "import { createHyperScript } from \"./hyperscript.js\";\nimport type { HyperScript } from \"./hyperscript.js\";\nimport {\n  sp"
  },
  {
    "path": "packages/solid/h/tsconfig.json",
    "chars": 228,
    "preview": "{\n  \"extends\": \"../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"path"
  },
  {
    "path": "packages/solid/html/README.md",
    "chars": 2410,
    "preview": "# Solid Tagged Template Literals\n\nThis sub module provides a Tagged Template Literal `html` method for Solid. This is us"
  },
  {
    "path": "packages/solid/html/package.json",
    "chars": 166,
    "preview": "{\n  \"name\": \"solid-js/html\",\n  \"main\": \"./dist/html.cjs\",\n  \"module\": \"./dist/html.js\",\n  \"types\": \"./types/index.d.ts\","
  },
  {
    "path": "packages/solid/html/src/index.ts",
    "chars": 766,
    "preview": "import { createHTML } from \"./lit.js\";\nimport type { HTMLTag } from \"./lit.js\";\nimport {\n  effect,\n  style,\n  insert,\n  "
  },
  {
    "path": "packages/solid/html/src/lit.ts",
    "chars": 37,
    "preview": "export * from \"lit-dom-expressions\";\n"
  },
  {
    "path": "packages/solid/html/tsconfig.json",
    "chars": 227,
    "preview": "{\n  \"extends\": \"../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"path"
  },
  {
    "path": "packages/solid/jsx-runtime.d.ts",
    "chars": 29,
    "preview": "export * from \"./types/jsx\";\n"
  },
  {
    "path": "packages/solid/package.json",
    "chars": 8282,
    "preview": "{\n  \"name\": \"solid-js\",\n  \"description\": \"A declarative JavaScript library for building user interfaces.\",\n  \"version\": "
  },
  {
    "path": "packages/solid/rollup.config.js",
    "chars": 5096,
    "preview": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport babel from \"@rollup/plugin-babel\";\nimport cleanup from \"ro"
  },
  {
    "path": "packages/solid/src/index.ts",
    "chars": 1786,
    "preview": "export {\n  $DEVCOMP,\n  $PROXY,\n  $TRACK,\n  batch,\n  catchError,\n  children,\n  createComputed,\n  createContext,\n  createD"
  },
  {
    "path": "packages/solid/src/reactive/array.ts",
    "chars": 8392,
    "preview": "import {\n  onCleanup,\n  createRoot,\n  untrack,\n  createSignal,\n  Accessor,\n  Setter,\n  $TRACK,\n  IS_DEV\n} from \"./signal"
  },
  {
    "path": "packages/solid/src/reactive/observable.ts",
    "chars": 3143,
    "preview": "import {\n  Accessor,\n  createEffect,\n  createRoot,\n  createSignal,\n  getOwner,\n  onCleanup,\n  Setter,\n  untrack\n} from \""
  },
  {
    "path": "packages/solid/src/reactive/scheduler.ts",
    "chars": 5168,
    "preview": "// Basic port modification of Reacts Scheduler: https://github.com/facebook/react/tree/master/packages/scheduler\nexport "
  },
  {
    "path": "packages/solid/src/reactive/signal.ts",
    "chars": 58412,
    "preview": "// Inspired by S.js by Adam Haile, https://github.com/adamhaile/S\n/**\nThe MIT License (MIT)\n\nCopyright (c) 2017 Adam Hai"
  },
  {
    "path": "packages/solid/src/render/Suspense.ts",
    "chars": 6671,
    "preview": "import { createComponent } from \"./component.js\";\nimport {\n  createRoot,\n  createSignal,\n  createContext,\n  useContext,\n"
  },
  {
    "path": "packages/solid/src/render/component.ts",
    "chars": 12781,
    "preview": "import {\n  untrack,\n  createSignal,\n  createResource,\n  createMemo,\n  devComponent,\n  $PROXY,\n  SUPPORTS_PROXY,\n  $DEVCO"
  },
  {
    "path": "packages/solid/src/render/flow.ts",
    "chars": 9825,
    "preview": "import {\n  createMemo,\n  untrack,\n  createSignal,\n  catchError,\n  children,\n  Accessor,\n  Setter,\n  onCleanup,\n  IS_DEV\n"
  },
  {
    "path": "packages/solid/src/render/hydration.ts",
    "chars": 1222,
    "preview": "import { Computation } from \"../reactive/signal.js\";\n\nexport type HydrationContext = { id: string; count: number };\n\ntyp"
  },
  {
    "path": "packages/solid/src/render/index.ts",
    "chars": 137,
    "preview": "export * from \"./component.js\";\nexport * from \"./flow.js\";\nexport * from \"./Suspense.js\";\nexport { sharedConfig } from \""
  },
  {
    "path": "packages/solid/src/server/index.ts",
    "chars": 876,
    "preview": "export {\n  catchError,\n  createRoot,\n  createSignal,\n  createComputed,\n  createRenderEffect,\n  createEffect,\n  createRea"
  },
  {
    "path": "packages/solid/src/server/reactive.ts",
    "chars": 10539,
    "preview": "import type { JSX } from \"../jsx.js\";\n\nexport const equalFn = <T>(a: T, b: T) => a === b;\nexport const $PROXY = Symbol(\""
  },
  {
    "path": "packages/solid/src/server/rendering.ts",
    "chars": 20664,
    "preview": "import {\n  Accessor,\n  castError,\n  catchError,\n  cleanNode,\n  createContext,\n  createMemo,\n  createOwner,\n  Owner,\n  ru"
  },
  {
    "path": "packages/solid/store/README.md",
    "chars": 706,
    "preview": "# Solid Store\n\nThis submodules contains the means for handling deeps nested reactivity. It provides 2 main primitives `c"
  },
  {
    "path": "packages/solid/store/package.json",
    "chars": 1208,
    "preview": "{\n  \"name\": \"solid-js/store\",\n  \"main\": \"./dist/server.cjs\",\n  \"module\": \"./dist/server.js\",\n  \"unpkg\": \"./dist/store.cj"
  },
  {
    "path": "packages/solid/store/src/index.ts",
    "chars": 480,
    "preview": "export { $RAW, createStore, unwrap } from \"./store.js\";\nexport type {\n  ArrayFilterFn,\n  DeepMutable,\n  DeepReadonly,\n  "
  },
  {
    "path": "packages/solid/store/src/modifiers.ts",
    "chars": 5414,
    "preview": "import { setProperty, unwrap, isWrappable, StoreNode, $RAW } from \"./store.js\";\n\nconst $ROOT = Symbol(\"store-root\");\n\nex"
  },
  {
    "path": "packages/solid/store/src/mutable.ts",
    "chars": 4408,
    "preview": "import { batch, getListener, DEV, $PROXY, $TRACK } from \"solid-js\";\nimport {\n  unwrap,\n  isWrappable,\n  getNodes,\n  trac"
  },
  {
    "path": "packages/solid/store/src/server.ts",
    "chars": 4611,
    "preview": "import type { SetStoreFunction, Store } from \"./store.js\";\n\nexport type {\n  ArrayFilterFn,\n  DeepMutable,\n  DeepReadonly"
  },
  {
    "path": "packages/solid/store/src/store.ts",
    "chars": 16896,
    "preview": "import { getListener, batch, DEV, $PROXY, $TRACK, createSignal } from \"solid-js\";\n\n// replaced during build\nexport const"
  },
  {
    "path": "packages/solid/store/test/modifiers.spec.ts",
    "chars": 14803,
    "preview": "import { describe, expect, test } from \"vitest\";\n\nimport { createRoot, createSignal, createEffect } from \"../../src/inde"
  },
  {
    "path": "packages/solid/store/test/mutable.spec.ts",
    "chars": 9316,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport { createRoot, createSignal, createMemo, batch, createEffect } fr"
  },
  {
    "path": "packages/solid/store/test/mutableWithClass.spec.tsx",
    "chars": 1608,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport { createEffect, createRoot } from \"../../src/index.js\";\nimport {"
  },
  {
    "path": "packages/solid/store/test/store.spec.ts",
    "chars": 32002,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport {\n  createRoot,\n  createSignal,\n  createEffect,\n  createMemo,\n  "
  },
  {
    "path": "packages/solid/store/tsconfig.build.json",
    "chars": 293,
    "preview": "{\n  \"extends\": \"../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"path"
  },
  {
    "path": "packages/solid/store/tsconfig.json",
    "chars": 75,
    "preview": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"./src\", \"./test\"]\n}\n"
  },
  {
    "path": "packages/solid/test/MessageChannel.ts",
    "chars": 179,
    "preview": "// @ts-ignore\nglobalThis.MessageChannel = class {\n  port1: { onmessage?: any } = {};\n  port2 = {\n    postMessage: () => "
  },
  {
    "path": "packages/solid/test/array.spec.ts",
    "chars": 1560,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport { mapArray, indexArray, createSignal, createMemo, createRoot } f"
  },
  {
    "path": "packages/solid/test/component.bench.ts",
    "chars": 4541,
    "preview": "import { mergeProps, splitProps } from \"../src/index.js\";\nimport { $PROXY } from \"../src/reactive/signal.js\";\nimport { b"
  },
  {
    "path": "packages/solid/test/component.spec.ts",
    "chars": 13973,
    "preview": "import { describe, expect, it, test } from \"vitest\";\nimport {\n  createRoot,\n  createComponent,\n  mergeProps,\n  splitProp"
  },
  {
    "path": "packages/solid/test/component.type-tests.ts",
    "chars": 4885,
    "preview": "import { mergeProps, splitProps } from \"../src/index.js\";\n\ntype Assert<T extends true> = never;\n// from: https://github."
  },
  {
    "path": "packages/solid/test/dev.spec.ts",
    "chars": 5872,
    "preview": "import { describe, expect, test, vi } from \"vitest\";\nimport {\n  createRoot,\n  getOwner,\n  createSignal,\n  createEffect,\n"
  },
  {
    "path": "packages/solid/test/external-source.spec.ts",
    "chars": 2144,
    "preview": "import { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { createRoot, createMemo, untrack, enab"
  },
  {
    "path": "packages/solid/test/observable.spec.ts",
    "chars": 2299,
    "preview": "import { describe, expect, test, vi } from \"vitest\";\nimport { createRoot, createSignal, from, observable } from \"../src/"
  },
  {
    "path": "packages/solid/test/rendering.spec.ts",
    "chars": 1848,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport { createResource } from \"../src/index.js\";\nimport { resolveSSRNo"
  },
  {
    "path": "packages/solid/test/resource.spec.ts",
    "chars": 11863,
    "preview": "import { describe, expect, test } from \"vitest\";\nimport {\n  createRoot,\n  createSignal,\n  createResource,\n  createRender"
  },
  {
    "path": "packages/solid/test/resource.type-tests.ts",
    "chars": 4801,
    "preview": "import { createResource, ResourceReturn, createSignal, Resource, Setter } from \"../src/index.js\";\nimport { InitializedRe"
  },
  {
    "path": "packages/solid/test/scheduler.spec.ts",
    "chars": 1093,
    "preview": "/** @vitest-environment jsdom */\nimport { describe, expect, test } from \"vitest\";\nimport { cancelCallback, requestCallba"
  },
  {
    "path": "packages/solid/test/signals.memo.spec.ts",
    "chars": 12426,
    "preview": "import { describe, expect, it } from \"vitest\";\nimport { createRoot, createSignal, createMemo, Accessor } from \"../src/in"
  },
  {
    "path": "packages/solid/test/signals.spec.ts",
    "chars": 22628,
    "preview": "/** @vitest-environment jsdom */\nimport { describe, expect, test } from \"vitest\";\nimport {\n  createRoot,\n  createSignal,"
  },
  {
    "path": "packages/solid/test/signals.type-tests.ts",
    "chars": 41404,
    "preview": "import {\n  createEffect,\n  createComputed,\n  createRenderEffect,\n  createMemo,\n  Accessor,\n  on,\n  createSignal,\n  creat"
  },
  {
    "path": "packages/solid/tsconfig.build.json",
    "chars": 116,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\"\n  },\n  \"include\": [\"./src\"],\n}\n"
  },
  {
    "path": "packages/solid/tsconfig.json",
    "chars": 75,
    "preview": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"./src\", \"./test\"]\n}\n"
  },
  {
    "path": "packages/solid/tsconfig.test.json",
    "chars": 241,
    "preview": "{\n  \"extends\": \"../../tsconfig.test.json\",\n  \"compilerOptions\": {\n    \"baseUrl\": \"\",\n    \"paths\": {\n      \"solid-js/jsx-"
  },
  {
    "path": "packages/solid/universal/README.md",
    "chars": 3002,
    "preview": "# Solid Universal\n\nThis contains the means to create the runtime for a custom renderer for Solid. This can enable using "
  },
  {
    "path": "packages/solid/universal/package.json",
    "chars": 476,
    "preview": "{\n  \"name\": \"solid-js/universal\",\n  \"main\": \"./dist/universal.cjs\",\n  \"module\": \"./dist/universal.js\",\n  \"types\": \"./typ"
  },
  {
    "path": "packages/solid/universal/src/index.ts",
    "chars": 442,
    "preview": "import { createRenderer as createRendererDX } from \"./universal.js\";\nimport type { RendererOptions, Renderer } from \"./u"
  },
  {
    "path": "packages/solid/universal/src/universal.ts",
    "chars": 50,
    "preview": "export * from \"dom-expressions/src/universal.js\";\n"
  },
  {
    "path": "packages/solid/universal/tsconfig.json",
    "chars": 190,
    "preview": "{\n  \"extends\": \"../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"path"
  },
  {
    "path": "packages/solid/vite.config.mjs",
    "chars": 1208,
    "preview": "/// <reference types=\"vitest\" />\n\nimport { defineConfig } from \"vitest/config\";\nimport solidPlugin from \"vite-plugin-sol"
  },
  {
    "path": "packages/solid/web/README.md",
    "chars": 528,
    "preview": "# Solid Web\n\nThis submodule contains the web specific APIs for Solid that are mostly internal methods imported during co"
  },
  {
    "path": "packages/solid/web/package.json",
    "chars": 1196,
    "preview": "{\n  \"name\": \"solid-js/web\",\n  \"main\": \"./dist/server.cjs\",\n  \"module\": \"./dist/server.js\",\n  \"unpkg\": \"./dist/web.cjs\",\n"
  },
  {
    "path": "packages/solid/web/server/index.ts",
    "chars": 1274,
    "preview": "import { ssrElement } from \"./server.js\";\nimport { splitProps, type JSX, type ValidComponent, type ComponentProps } from"
  },
  {
    "path": "packages/solid/web/server/server.ts",
    "chars": 44,
    "preview": "export * from \"dom-expressions/src/server\";\n"
  },
  {
    "path": "packages/solid/web/src/client.ts",
    "chars": 47,
    "preview": "export * from \"dom-expressions/src/client.js\";\n"
  },
  {
    "path": "packages/solid/web/src/core.ts",
    "chars": 257,
    "preview": "//@ts-nocheck\nimport { createMemo } from \"solid-js\";\nexport {\n  getOwner,\n  createComponent,\n  createRoot as root,\n  cre"
  },
  {
    "path": "packages/solid/web/src/index.ts",
    "chars": 5199,
    "preview": "import { getNextElement, insert, spread, SVGElements, hydrate as hydrateCore } from \"./client.js\";\nimport {\n  createSign"
  },
  {
    "path": "packages/solid/web/src/jsx.ts",
    "chars": 47,
    "preview": "export type { JSX } from \"../../types/jsx.js\";\n"
  },
  {
    "path": "packages/solid/web/src/server-mock.ts",
    "chars": 2207,
    "preview": "//@ts-nocheck\nfunction throwInBrowser(func: Function) {\n  const err = new Error(`${func.name} is not supported in the br"
  },
  {
    "path": "packages/solid/web/storage/package.json",
    "chars": 328,
    "preview": "{\n  \"name\": \"solid-js/web/storage\",\n  \"main\": \"./dist/storage.cjs\",\n  \"module\": \"./dist/storage.js\",\n  \"types\": \"./types"
  },
  {
    "path": "packages/solid/web/storage/src/index.ts",
    "chars": 623,
    "preview": "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { RequestEvent } from \"solid-js/web\";\nimport { isServe"
  },
  {
    "path": "packages/solid/web/storage/tsconfig.build.json",
    "chars": 338,
    "preview": "{\n  \"extends\": \"../../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"p"
  },
  {
    "path": "packages/solid/web/storage/tsconfig.json",
    "chars": 65,
    "preview": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"./src\"]\n}\n"
  },
  {
    "path": "packages/solid/web/test/context.spec.tsx",
    "chars": 2931,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, it } from \"vitest\";\n\nimport"
  },
  {
    "path": "packages/solid/web/test/dynamic.spec.tsx",
    "chars": 3102,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test, beforeEach, afterEach"
  },
  {
    "path": "packages/solid/web/test/element.spec.tsx",
    "chars": 3294,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/errorboundary.spec.tsx",
    "chars": 2820,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/for.spec.tsx",
    "chars": 9973,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/index.spec.tsx",
    "chars": 10008,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/portal.spec.tsx",
    "chars": 4207,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/server-mock.spec.tsx",
    "chars": 1247,
    "preview": "import { expect, test, vi, beforeEach, afterAll } from \"vitest\";\nimport { renderToString, renderToStringAsync, renderToS"
  },
  {
    "path": "packages/solid/web/test/show.spec.tsx",
    "chars": 9682,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/test/suspense.spec.tsx",
    "chars": 13328,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\n\nimport { describe, expect, test, beforeEach, afterEac"
  },
  {
    "path": "packages/solid/web/test/switch.spec.tsx",
    "chars": 11038,
    "preview": "/**\n * @jsxImportSource solid-js\n * @vitest-environment jsdom\n */\nimport { describe, expect, test } from \"vitest\";\nimpor"
  },
  {
    "path": "packages/solid/web/tsconfig.build.json",
    "chars": 293,
    "preview": "{\n  \"extends\": \"../../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./types\",\n    \"baseUrl\": \"src\",\n    \"path"
  },
  {
    "path": "packages/solid/web/tsconfig.json",
    "chars": 75,
    "preview": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"./src\", \"./test\"]\n}\n"
  },
  {
    "path": "packages/solid-element/CHANGELOG.md",
    "chars": 4037,
    "preview": "# solid-element\n\n## 1.9.1\n\n### Patch Changes\n\n- 5a14ab8: fix #2337 empty attributes in solid-element\n- Updated dependenc"
  },
  {
    "path": "packages/solid-element/README.md",
    "chars": 4742,
    "preview": "# Solid Element\n[![Build Status](https://github.com/solidjs/solid/workflows/Solid%20CI/badge.svg)](https://github.com/so"
  },
  {
    "path": "packages/solid-element/package.json",
    "chars": 661,
    "preview": "{\n  \"name\": \"solid-element\",\n  \"description\": \"Webcomponents wrapper for Solid\",\n  \"author\": \"Ryan Carniato\",\n  \"license"
  },
  {
    "path": "packages/solid-element/sample.jsx",
    "chars": 760,
    "preview": "import { createSignal } from \"solid-js\";\nimport { customElement } from \"solid-element\";\n\nconst style = `div * {\n        "
  },
  {
    "path": "packages/solid-element/src/index.ts",
    "chars": 2649,
    "preview": "import {\n  register,\n  ComponentType as mComponentType,\n  ICustomElement,\n  FunctionComponent,\n  ComponentOptions,\n  Pro"
  },
  {
    "path": "packages/solid-element/tsconfig.json",
    "chars": 155,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./dist\",\n    \"emitDeclarationOnly\": false\n  "
  },
  {
    "path": "packages/solid-ssr/CHANGELOG.md",
    "chars": 500,
    "preview": "# solid-ssr\n\n## 1.7.2\n\n### Patch Changes\n\n- e660e5a3: add prettier code format in git-commit-hook\n\n## 1.7.1\n\n### Patch C"
  },
  {
    "path": "packages/solid-ssr/README.md",
    "chars": 3896,
    "preview": "# `solid-ssr`\n\nThis library provides tools to help with SSR. So far it's a simple Static Generator. But will add more to"
  },
  {
    "path": "packages/solid-ssr/examples/.gitignore",
    "chars": 18,
    "preview": "**/public/\n**/lib/"
  },
  {
    "path": "packages/solid-ssr/examples/async/index.js",
    "chars": 575,
    "preview": "import express from \"express\";\nimport url from \"url\";\n\nimport { renderToStringAsync } from \"solid-js/web\";\nimport App fr"
  },
  {
    "path": "packages/solid-ssr/examples/async/rollup.config.js",
    "chars": 1251,
    "preview": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport common from \"@rollup/plugin-commonjs\";\nimport babel from \""
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/components/App.js",
    "chars": 2349,
    "preview": "import { useContext, lazy, ErrorBoundary } from \"solid-js\";\nimport { HydrationScript } from \"solid-js/web\";\nimport { Lin"
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/components/Home.js",
    "chars": 447,
    "preview": "import { createSignal, onCleanup, onMount } from \"solid-js\";\nconst Home = () => {\n  const [s, set] = createSignal(0);\n  "
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/components/Profile/Profile.js",
    "chars": 329,
    "preview": "const Profile = props => (\n  <>\n    <h1>{props.user?.firstName}'s Profile</h1>\n    <p>This section could be about you.</"
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/components/Profile/index.js",
    "chars": 855,
    "preview": "import { createResource, lazy } from \"solid-js\";\nconst Profile = lazy(() => import(\"./Profile\"));\n\n// this component laz"
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/components/Settings.js",
    "chars": 475,
    "preview": "import { createUniqueId, createSignal } from \"solid-js\";\n\nconst Settings = () => {\n  const [text, setText] = createSigna"
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/index.js",
    "chars": 138,
    "preview": "import { hydrate } from \"solid-js/web\";\nimport App from \"./components/App\";\n\n// entry point for browser\nhydrate(() => <A"
  },
  {
    "path": "packages/solid-ssr/examples/shared/src/router.js",
    "chars": 1218,
    "preview": "import { createSignal, createContext, useContext, useTransition } from \"solid-js\";\nimport { isServer } from \"solid-js/we"
  },
  {
    "path": "packages/solid-ssr/examples/shared/static/styles.css",
    "chars": 1302,
    "preview": "body {\r\n  background-color: #eee;\r\n}\r\n#app {\r\n  border-radius: 3px;\r\n  border: 1px solid #e5e5e5;\r\n  margin: 15px;\r\n  ba"
  },
  {
    "path": "packages/solid-ssr/examples/ssg/export.js",
    "chars": 469,
    "preview": "import path from \"path\";\nimport url from \"url\";\nimport renderStatic from \"../../static/index.js\";\n\nconst PAGES = [\"index"
  },
  {
    "path": "packages/solid-ssr/examples/ssg/index.js",
    "chars": 232,
    "preview": "import { renderToStringAsync } from \"solid-js/web\";\nimport App from \"../shared/src/components/App\";\n\n// entry point for "
  },
  {
    "path": "packages/solid-ssr/examples/ssg/rollup.config.js",
    "chars": 1188,
    "preview": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport common from \"@rollup/plugin-commonjs\";\nimport babel from \""
  },
  {
    "path": "packages/solid-ssr/examples/ssr/index.js",
    "chars": 547,
    "preview": "import express from \"express\";\nimport url from \"url\";\n\nimport { renderToString } from \"solid-js/web\";\nimport App from \"."
  },
  {
    "path": "packages/solid-ssr/examples/ssr/rollup.config.js",
    "chars": 1253,
    "preview": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport common from \"@rollup/plugin-commonjs\";\nimport babel from \""
  },
  {
    "path": "packages/solid-ssr/examples/stream/index.js",
    "chars": 441,
    "preview": "import express from \"express\";\nimport url from \"url\";\n\nimport { renderToStream } from \"solid-js/web\";\nimport App from \"."
  },
  {
    "path": "packages/solid-ssr/examples/stream/rollup.config.js",
    "chars": 1265,
    "preview": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport common from \"@rollup/plugin-commonjs\";\nimport babel from \""
  },
  {
    "path": "packages/solid-ssr/package.json",
    "chars": 1432,
    "preview": "{\n  \"name\": \"solid-ssr\",\n  \"description\": \"Utilities to help with SSR\",\n  \"version\": \"1.7.2\",\n  \"author\": \"Ryan Carniato"
  },
  {
    "path": "packages/solid-ssr/static/index.cjs",
    "chars": 574,
    "preview": "const path = require(\"path\");\nconst execFile = require(\"util\").promisify(require(\"child_process\").execFile);\n\nconst path"
  },
  {
    "path": "packages/solid-ssr/static/index.d.ts",
    "chars": 167,
    "preview": "export type StaticConfig = { entry: string; output: string; url: string };\nexport default function renderStatic(config: "
  },
  {
    "path": "packages/solid-ssr/static/index.js",
    "chars": 719,
    "preview": "import { resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execFile } from \"child_process\";\nimport { "
  },
  {
    "path": "packages/solid-ssr/static/writeToDisk.cjs",
    "chars": 323,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst server = require(process.argv[2]);\n\nasync function write()"
  },
  {
    "path": "packages/solid-ssr/static/writeToDisk.js",
    "chars": 368,
    "preview": "import { dirname, join } from \"path\";\nimport { writeFile, mkdir } from \"fs\";\n\nasync function write() {\n  const server = "
  },
  {
    "path": "packages/test-integration/CHANGELOG.md",
    "chars": 14139,
    "preview": "# test-integration\n\n## 1.9.11\n\n### Patch Changes\n\n- Updated dependencies [6628d9f]\n  - solid-js@1.9.11\n\n## 1.9.10\n\n### P"
  },
  {
    "path": "packages/test-integration/babel.config.cjs",
    "chars": 178,
    "preview": "module.exports = {\n  env: {\n    test: {\n      presets: [\n        [\"@babel/preset-env\", { targets: { node: \"current\" } }]"
  },
  {
    "path": "packages/test-integration/package.json",
    "chars": 385,
    "preview": "{\n  \"name\": \"test-integration\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"npm run test:imports\",\n    \"test:integrat"
  },
  {
    "path": "packages/test-integration/test-imports.mjs",
    "chars": 1698,
    "preview": "function checkError(error) {\n  // This error happens when missing the type:module field in package.json when it is neede"
  },
  {
    "path": "packages/test-integration/tests/downloaded.spec.ts",
    "chars": 2808,
    "preview": "import { mkdir, rm, exec } from \"shelljs\";\nimport { resolve, dirname, join } from \"path\";\nimport { download, extract } f"
  },
  {
    "path": "packages/test-integration/tsconfig.json",
    "chars": 70,
    "preview": "{\n  \"extends\": \"../../tsconfig.test.json\",\n  \"include\": [\"./tests\"]\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "chars": 27,
    "preview": "packages:\n  - 'packages/*'\n"
  },
  {
    "path": "tsconfig.json",
    "chars": 269,
    "preview": "{\n  \"compilerOptions\": {\n    \"emitDeclarationOnly\": true,\n    \"declaration\": true,\n    \"target\": \"ESNext\",\n    \"newLine\""
  },
  {
    "path": "tsconfig.test.json",
    "chars": 560,
    "preview": "{\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"target\": \"ESNext\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \""
  },
  {
    "path": "turbo.json",
    "chars": 757,
    "preview": "{\n  \"$schema\": \"https://turborepo.org/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      "
  }
]

About this extraction

This page contains the full source code of the solidjs/solid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 178 files (822.6 KB), approximately 228.5k tokens, and a symbol index with 924 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!