Skip to content

Commit b365f83

Browse files
committed
WIP: refactoring client injection. EOD: 7-10-24
1 parent d45a9a9 commit b365f83

35 files changed

+516
-82
lines changed

.changeset/empty-impalas-play.md

-5
This file was deleted.

CHANGELOG.md

+40
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
## [1.2.5](https://github.com/ThinAirThings/uix/compare/v1.2.4...v1.2.5) (2024-05-23)
22

3+
## 3.0.5
4+
5+
### Patch Changes
6+
7+
- update templates
8+
9+
## 3.0.4
10+
11+
### Patch Changes
12+
13+
- wip
14+
15+
## 3.0.3
16+
17+
### Patch Changes
18+
19+
- wip
20+
21+
## 3.0.2
22+
23+
### Patch Changes
24+
25+
- fix string literal types
26+
27+
## 3.0.1
28+
29+
### Patch Changes
30+
31+
- fix hook types with string literal syntax
32+
33+
## 3.0.0
34+
35+
### Major Changes
36+
37+
- d45a9a9: Changed all the get apis to use object style inputs instead of argument lists. This is a breaking change
38+
39+
### Patch Changes
40+
41+
- fixed type bug where getUniqueChild and getNodeSet were resolving to unions due to input type not resolving to the string literal
42+
343
## 2.4.3
444

545
### Patch Changes

package.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@thinairthings/uix",
33
"author": "Dan Lannan",
4-
"version": "2.4.3",
4+
"version": "3.0.5",
55
"type": "module",
66
"types": "./dist/lib/index.d.ts",
77
"bin": {
@@ -61,13 +61,15 @@
6161
"ink-gradient": "^3.0.0",
6262
"ink-spinner": "^5.0.0",
6363
"neo4j-driver": "^5.21.0",
64-
"openai": "^4.49.0",
6564
"package-up": "^5.0.0",
6665
"pastel": "^3.0.0",
6766
"react": "^18.3.1",
6867
"uuid": "^10.0.0",
6968
"znv": "^0.4.0",
70-
"zod": "^3.23.8",
71-
"zustand": "^4.5.2"
69+
"zustand": "^4.5.2",
70+
"zod": "^3.23.8"
71+
},
72+
"peerDependencies": {
73+
"openai": "^4.49.0"
7274
}
7375
}

src/_next/UixNode.v2.tsx

+187
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
2+
import { AnyNodeType, AnyRelationshipTypeSet, GenericNodeType, GenericRelationshipType, GenericRelationshipTypeSet, NodeKey, NodeState, NodeType, RelationshipType } from "@thinairthings/uix";
3+
import { nodeTypeMap } from '../../tests/uix/generated/staticObjects'
4+
import dedent from "dedent";
5+
6+
// SAVED GET RETURN TYPE
7+
// : Promise<(ThisNodeType['relationshipTypeSet'][number] & { relationshipClass: 'Set' }) extends RelationshipType<any, any, any, infer ToNodeType, any>
8+
// ? typeof nodeTypeMap[NextType] extends ToNodeType
9+
// ? UixNode<this, typeof nodeTypeMap[NextType]>[]
10+
// : UixNode<this, typeof nodeTypeMap[NextType]>
11+
// : never
12+
const createUixNode = () => {
13+
14+
}
15+
16+
class UixNode<
17+
ParentUixNode extends UixNode<any, any, any> | null,
18+
ThisNodeType extends AnyNodeType,
19+
_CollectionType
20+
> {
21+
constructor(
22+
public parentUixNode: ParentUixNode,
23+
public nodeType: ThisNodeType,
24+
public operationSet: Array<string>,
25+
public _collectionType: _CollectionType = {
26+
...parentUixNode?._collectionType,
27+
}
28+
) { }
29+
create = async <
30+
NextType extends ThisNodeType extends NodeType<any, any, any, any, infer RelationshipTypeSet>
31+
? RelationshipTypeSet[number]['toNodeType']['type']
32+
: never
33+
>(nextType: NextType, nextTypeState: NodeState<typeof nodeTypeMap[NextType]>) => {
34+
35+
}
36+
update = async (data: Partial<NodeState<ThisNodeType>>) => {
37+
return new UixNode(this.parentUixNode, this.nodeType)
38+
}
39+
get = async <
40+
NextType extends ThisNodeType extends NodeType<any, any, any, any, infer RelationshipTypeSet, any>
41+
? RelationshipTypeSet[number]['toNodeType']['type']
42+
: never
43+
>(
44+
nextType: NextType
45+
)
46+
// : Promise<(ThisNodeType['relationshipTypeSet'][number] & { relationshipClass: 'Set' }) extends RelationshipType<any, any, any, infer ToNodeType, any>
47+
// ? typeof nodeTypeMap[NextType] extends ToNodeType
48+
// ? UixNode<this, typeof nodeTypeMap[NextType]>[]
49+
// : UixNode<this, typeof nodeTypeMap[NextType]>
50+
// : never
51+
// >
52+
=> {
53+
54+
return new UixNode(
55+
this,
56+
nodeTypeMap[nextType],
57+
this.operationSet.concat([dedent`
58+
<-[:${this.nodeType.relationshipTypeSet.includes((relationshipType: GenericRelationshipType) =>
59+
relationshipType.relationshipClass === 'Set'
60+
&& relationshipType.toNodeType.type === nextType
61+
) ? `CHILD_TO` : `UNIQUE_TO`}-(${nextType}Node:Node:${nextType}})
62+
`]),
63+
{
64+
[`${this.nodeType}Node`]: this,
65+
[`${nextType}Node`]:
66+
}
67+
)
68+
}
69+
}
70+
71+
class RootUixNode extends UixNode<
72+
null, typeof nodeTypeMap['Root'], {}
73+
> {
74+
constructor(
75+
public userNodeKey: NodeKey<typeof nodeTypeMap, 'User'>
76+
) {
77+
super(null, nodeTypeMap.Root, [], {})
78+
}
79+
get activeUserNode() {
80+
return new UixNode(
81+
this,
82+
nodeTypeMap['User'],
83+
this.operationSet.concat([dedent/*cypher*/`
84+
MATCH (userNode:Node:${this.userNodeKey.nodeType} {nodeId: $nodeId})
85+
`]), {
86+
UserNode: this
87+
})
88+
}
89+
}
90+
91+
const useUserNodeKey = () => ({ nodeType: 'User', nodeId: '123' }) as NodeKey<typeof nodeTypeMap, 'User'>
92+
export const useUix = <
93+
Collection,
94+
Selection = Collection
95+
>({
96+
collector,
97+
selector
98+
}: {
99+
collector: ({ root }: { root: RootUixNode }) => Collection,
100+
selector?: (collection: Collection) => Selection
101+
}) => {
102+
const userNodeKey = useUserNodeKey() // From UixProvider
103+
collector({
104+
root: new RootUixNode(userNodeKey)
105+
})
106+
}
107+
108+
const ProfilePage = () => {
109+
const { userNode, profileNode, skillNodeSet, skillNodeDraft } = useUix({
110+
collector: ({ root }) => {
111+
const userNode = root.activeUserNode
112+
root.activeUserNode.get('Profile')
113+
userNode._collectionType['UserNode']
114+
//** Scratch Block */
115+
const queryString = dedent/*cypher*/`
116+
MATCH (userNode:Node:${root.userNodeKey.nodeType} {nodeId: $nodeId})
117+
`
118+
//** End Scratch Block */
119+
const profileNode = userNode.get('Profile')
120+
//** Scratch Block */
121+
const queryString2 = dedent/*cypher*/`
122+
MATCH (userNode:Node:${root.userNodeKey.nodeType} {nodeId: $nodeId})
123+
<-[:UNIQUE_TO]-(profileNode:Node:${})
124+
`
125+
//** End Scratch Block */
126+
const { profileNode, skillNodeSet } = userNode.get({
127+
nodeType: 'Profile'
128+
}).chain(({ profileNode }) => {
129+
profileNode.get({ nodeType: 'Skill' })
130+
})
131+
// OR
132+
const { skillNodeSet } = profileNode.get({
133+
134+
})
135+
const skillNodeDraft = skillNodeSet.createDraft({
136+
description: 'some default'
137+
})
138+
return { firstName, profileNode, skillNodeSet, skillNodeDraft }
139+
}
140+
})
141+
const { data } = useNode({
142+
node: userNode,
143+
selector: () => { }
144+
})
145+
146+
return (
147+
<div>
148+
<span>{userNode.data} </span>
149+
<input value={profileNode.draft.name} onChange={(e) => profileNode.draft.update(draft => {
150+
draft.name = e.value
151+
})} />
152+
<button
153+
data-loading={profileNode.isSubmitting ? true : null}
154+
onClick={profileNode.handleSubmit(async () => {
155+
await profileNode.draft.save()
156+
})}
157+
>Update Profile</button>
158+
{skillNodeSet.map(skillNode => <SkillNode
159+
key={skillNode.nodeId}
160+
skillNode={skillNode}
161+
/>)}
162+
<input value={skillNodeDraft.description} onChange={(e) => skillNodeDraft.update(draft => {
163+
draft.description = e.value
164+
})} />
165+
<button
166+
data-loading={skillNodeDraft.isSubmitting ? true : null}
167+
onClick={skillNodeDraft.handleSubmit(async () => {
168+
await skillNodeDraft.save()
169+
})}
170+
>Create Skill</button>
171+
</div>
172+
)
173+
}
174+
175+
176+
177+
178+
179+
180+
181+
182+
183+
184+
185+
186+
187+

0 commit comments

Comments
 (0)