Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: dev store with unstable_derive #2852

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open

feat: dev store with unstable_derive #2852

wants to merge 9 commits into from

Conversation

dai-shi
Copy link
Member

@dai-shi dai-shi commented Dec 11, 2024

Thanks to unstable_derive, we can implement dev store with it.

Copy link

vercel bot commented Dec 11, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
jotai ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 19, 2024 3:09am

Copy link

codesandbox-ci bot commented Dec 11, 2024

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Copy link

github-actions bot commented Dec 11, 2024

Size Change: +1.14 kB (+1.26%)

Total Size: 92.1 kB

Filename Size Change
./dist/esm/vanilla.mjs 4.26 kB +254 B (+6.35%) 🔍
./dist/system/vanilla.development.js 4.36 kB +273 B (+6.68%) 🔍
./dist/system/vanilla.production.js 2.15 kB +2 B (+0.09%)
./dist/umd/vanilla.development.js 5.68 kB +310 B (+5.77%) 🔍
./dist/umd/vanilla.production.js 2.85 kB -1 B (-0.04%)
./dist/vanilla.js 5.58 kB +306 B (+5.81%) 🔍
ℹ️ View Unchanged
Filename Size
./dist/babel/plugin-debug-label.js 932 B
./dist/babel/plugin-react-refresh.js 1.14 kB
./dist/babel/preset.js 1.41 kB
./dist/esm/babel/plugin-debug-label.mjs 1 kB
./dist/esm/babel/plugin-react-refresh.mjs 1.19 kB
./dist/esm/babel/preset.mjs 1.49 kB
./dist/esm/index.mjs 62 B
./dist/esm/react.mjs 1.4 kB
./dist/esm/react/utils.mjs 746 B
./dist/esm/utils.mjs 67 B
./dist/esm/vanilla/utils.mjs 5.04 kB
./dist/index.js 242 B
./dist/react.js 1.44 kB
./dist/react/utils.js 1.39 kB
./dist/system/babel/plugin-debug-label.development.js 1.1 kB
./dist/system/babel/plugin-debug-label.production.js 775 B
./dist/system/babel/plugin-react-refresh.development.js 1.29 kB
./dist/system/babel/plugin-react-refresh.production.js 928 B
./dist/system/babel/preset.development.js 1.59 kB
./dist/system/babel/preset.production.js 1.14 kB
./dist/system/index.development.js 252 B
./dist/system/index.production.js 183 B
./dist/system/react.development.js 1.56 kB
./dist/system/react.production.js 864 B
./dist/system/react/utils.development.js 860 B
./dist/system/react/utils.production.js 462 B
./dist/system/utils.development.js 257 B
./dist/system/utils.production.js 187 B
./dist/system/vanilla/utils.development.js 5.25 kB
./dist/system/vanilla/utils.production.js 3.14 kB
./dist/umd/babel/plugin-debug-label.development.js 1.08 kB
./dist/umd/babel/plugin-debug-label.production.js 852 B
./dist/umd/babel/plugin-react-refresh.development.js 1.27 kB
./dist/umd/babel/plugin-react-refresh.production.js 1 kB
./dist/umd/babel/preset.development.js 1.54 kB
./dist/umd/babel/preset.production.js 1.22 kB
./dist/umd/index.development.js 383 B
./dist/umd/index.production.js 328 B
./dist/umd/react.development.js 1.57 kB
./dist/umd/react.production.js 936 B
./dist/umd/react/utils.development.js 1.53 kB
./dist/umd/react/utils.production.js 1.01 kB
./dist/umd/utils.development.js 399 B
./dist/umd/utils.production.js 342 B
./dist/umd/vanilla/utils.development.js 6.24 kB
./dist/umd/vanilla/utils.production.js 3.78 kB
./dist/utils.js 247 B
./dist/vanilla/utils.js 6.1 kB

compressed-size-action

Copy link

github-actions bot commented Dec 11, 2024

LiveCodes Preview in LiveCodes

Latest commit: 73fcd61
Last updated: Dec 19, 2024 3:09am (UTC)

Playground Link
React demo https://livecodes.io?x=id/2K6HWC4WD

See documentations for usage instructions.

}),
dev4_get_mounted_atoms: () => debugMountedAtoms,
dev4_restore_atoms: (values) => {
throw new Error('TODO: not implemented yet' || values)
Copy link
Member Author

Choose a reason for hiding this comment

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

This probably requires "batch write".

Copy link
Collaborator

@dmaskasky dmaskasky Dec 11, 2024

Choose a reason for hiding this comment

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

#2827 introduces batch inside the write function.
So after the PR lands, it could look something like:

{
  ...
  dev4_restore_atoms: (values) => {
    store.set(atom(null, (get, set) => {
      values.forEach(([a, v]) => set(a, v))
    })
  },
}

@dai-shi
Copy link
Member Author

dai-shi commented Dec 11, 2024

/ecosystem-ci run

Copy link

Ecosystem CI Output

---- Jotai Ecosystem CI Results ----
{
  "bunshi": "PASS",
  "jotai-effect": "PASS",
  "jotai-scope": "PASS"
}

@dai-shi
Copy link
Member Author

dai-shi commented Dec 11, 2024

@arjunvegda Let's add jotai-devtools to https://github.com/jotaijs/jotai-ecosystem-ci ! Can you open a PR there?

@dmaskasky
Copy link
Collaborator

Separately, I think createPending should be part of deriveStore.

@dai-shi
Copy link
Member Author

dai-shi commented Dec 11, 2024

Separately, I think createPending should be part of deriveStore.

If necessary, I generally want to make functions as pure as reasonably possible.

(edit: I misunderstood the question.)

@dai-shi
Copy link
Member Author

dai-shi commented Dec 11, 2024

/ecosystem-ci run

Copy link

Ecosystem CI Output

---- Jotai Ecosystem CI Results ----
{
  "bunshi": "PASS",
  "jotai-devtools": "FAIL",
  "jotai-effect": "PASS",
  "jotai-scope": "PASS"
}

@dai-shi
Copy link
Member Author

dai-shi commented Dec 11, 2024

"jotai-devtools": "FAIL",

Yes, it's expected. Cool.

Copy link

pkg-pr-new bot commented Dec 16, 2024

Open in Stackblitz

More templates

npm i https://pkg.pr.new/jotai@2852

commit: 73fcd61

@dai-shi dai-shi changed the title wip: dev store with unstable_derive feat: dev store with unstable_derive Dec 19, 2024
@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

/ecosystem-ci run

Copy link

Ecosystem CI Output

---- Jotai Ecosystem CI Results ----
{
  "bunshi": "PASS",
  "jotai-devtools": "FAIL",
  "jotai-effect": "PASS",
  "jotai-scope": "PASS"
}

Comment on lines 780 to 786
const restoreAtom: WritableAtom<null, [], void> &
Record<typeof RESTORE_ATOM, typeof values> = {
[RESTORE_ATOM]: values,
read: () => null,
write: () => {},
}
derivedStore.set(restoreAtom)
Copy link
Collaborator

Choose a reason for hiding this comment

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

I'm curious why not simply?

store.set(atom(null, (get, set) => {
  values.forEach((args) => set(...args))
})

Copy link
Member Author

Choose a reason for hiding this comment

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

atom in values can have a custom write function, which we need to bypass.

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

"jotai-devtools": "FAIL",

Hmm, it's unexpected.

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

@arjunvegda Can you help here? My expectation is this is compatible behavior-wise, but there might be some cases to break.

@dai-shi dai-shi added this to the v2.11.0 milestone Dec 19, 2024
@arjunvegda
Copy link
Collaborator

@arjunvegda Can you help here? My expectation is this is compatible behavior-wise, but there might be some cases to break.

It appears that whenever a user attempts to restore a specific snapshot, the store ends up creating another snapshot in the "Time Travel" tab in DevTools UI. The intended behavior is to restore the chosen snapshot without adding any new entries to the list.

This is likely because we're calling store.set here, that triggers a store listener in dev tools to add a new entry. I'll see if there is a way to fix this in Devtools.

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

Hm, I see. Thanks!!

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

/ecosystem-ci run

Copy link

Ecosystem CI Output

---- Jotai Ecosystem CI Results ----
{
  "bunshi": "PASS",
  "jotai-devtools": "PASS",
  "jotai-effect": "PASS",
  "jotai-scope": "PASS"
}

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

🎉 Thanks @arjunvegda! I'm planning to release this next week.

@dai-shi dai-shi marked this pull request as ready for review December 19, 2024 02:20
Comment on lines 754 to 756
if (hasInitialValue(atom)) {
setter(atom as never, value)
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think this is still an issue. atom(0, () => {}), needs the init value, but its write function should not be called.

I think you will need to add createPending to unstable_derive. Then you can update the atomState and adjust batch.

Copy link
Member Author

Choose a reason for hiding this comment

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

I think this is still an issue.

Thanks for the catch. I didn't notice there was a test case missing. Added in #2873.

@dai-shi
Copy link
Member Author

dai-shi commented Dec 19, 2024

/ecosystem-ci run

Copy link

Ecosystem CI Output

---- Jotai Ecosystem CI Results ----
{
  "bunshi": "PASS",
  "jotai-devtools": "PASS",
  "jotai-effect": "PASS",
  "jotai-scope": "PASS"
}

let savedGetAtomState: StoreArgs[0]
let inRestoreAtom = false
const derivedStore = store.unstable_derive(
(getAtomState, atomRead, atomWrite, atomOnMount) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

For future compat.

Suggested change
(getAtomState, atomRead, atomWrite, atomOnMount) => {
(getAtomState, atomRead, atomWrite, ...rest) => {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants