@praxisjs/core 1.8.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/__tests__/component.test.js +59 -26
  3. package/dist/__tests__/component.test.js.map +1 -1
  4. package/dist/__tests__/resource-server-pass.test.d.ts +2 -0
  5. package/dist/__tests__/resource-server-pass.test.d.ts.map +1 -0
  6. package/dist/__tests__/resource-server-pass.test.js +78 -0
  7. package/dist/__tests__/resource-server-pass.test.js.map +1 -0
  8. package/dist/__tests__/synced.test.js +6 -7
  9. package/dist/__tests__/synced.test.js.map +1 -1
  10. package/dist/async/resource-cache.d.ts +7 -0
  11. package/dist/async/resource-cache.d.ts.map +1 -1
  12. package/dist/async/resource-cache.js +18 -0
  13. package/dist/async/resource-cache.js.map +1 -1
  14. package/dist/async/resource.d.ts +7 -0
  15. package/dist/async/resource.d.ts.map +1 -1
  16. package/dist/async/resource.js +16 -1
  17. package/dist/async/resource.js.map +1 -1
  18. package/dist/async/server-mode.d.ts +10 -0
  19. package/dist/async/server-mode.d.ts.map +1 -0
  20. package/dist/async/server-mode.js +15 -0
  21. package/dist/async/server-mode.js.map +1 -0
  22. package/dist/component/base.d.ts +2 -26
  23. package/dist/component/base.d.ts.map +1 -1
  24. package/dist/component/base.js +2 -29
  25. package/dist/component/base.js.map +1 -1
  26. package/dist/component/internals.d.ts +16 -0
  27. package/dist/component/internals.d.ts.map +1 -0
  28. package/dist/component/internals.js +70 -0
  29. package/dist/component/internals.js.map +1 -0
  30. package/dist/component/stateful.d.ts +0 -15
  31. package/dist/component/stateful.d.ts.map +1 -1
  32. package/dist/component/stateful.js +0 -20
  33. package/dist/component/stateful.js.map +1 -1
  34. package/dist/component/stateless.d.ts +1 -1
  35. package/dist/component/stateless.d.ts.map +1 -1
  36. package/dist/component/stateless.js +3 -2
  37. package/dist/component/stateless.js.map +1 -1
  38. package/dist/internal.d.ts +4 -2
  39. package/dist/internal.d.ts.map +1 -1
  40. package/dist/internal.js +4 -2
  41. package/dist/internal.js.map +1 -1
  42. package/package.json +3 -3
  43. package/src/__tests__/component.test.ts +83 -26
  44. package/src/__tests__/resource-server-pass.test.ts +90 -0
  45. package/src/async/resource-cache.ts +20 -0
  46. package/src/async/resource.ts +17 -0
  47. package/src/async/server-mode.ts +16 -0
  48. package/src/component/base.ts +4 -38
  49. package/src/component/internals.ts +119 -0
  50. package/src/component/stateful.ts +1 -21
  51. package/src/component/stateless.ts +4 -3
  52. package/src/internal.ts +19 -1
@@ -0,0 +1,119 @@
1
+ export const componentPropsType: unique symbol = Symbol("praxis.componentPropsType");
2
+
3
+ interface ComponentInternals<T extends object> {
4
+ rawProps: T;
5
+ mounted: boolean;
6
+ anchor?: Comment;
7
+ defaults: Record<string, unknown>;
8
+ stateDirty: boolean;
9
+ }
10
+
11
+ const componentInternals = new WeakMap<object, ComponentInternals<object>>();
12
+
13
+ function getInternals(instance: object): ComponentInternals<object> {
14
+ const internals = componentInternals.get(instance);
15
+ if (!internals) {
16
+ throw new TypeError("Expected a PraxisJS component instance.");
17
+ }
18
+ return internals;
19
+ }
20
+
21
+ export function initComponentInternals(
22
+ instance: object,
23
+ props: object,
24
+ ): void {
25
+ componentInternals.set(instance, {
26
+ rawProps: { ...props },
27
+ mounted: false,
28
+ defaults: {},
29
+ stateDirty: false,
30
+ });
31
+ }
32
+
33
+ export function getComponentProps(instance: object): object {
34
+ return getInternals(instance).rawProps;
35
+ }
36
+
37
+ export function setComponentProps(
38
+ instance: object,
39
+ props: Record<string, unknown>,
40
+ ): void {
41
+ const rawProps = getInternals(instance).rawProps as Record<string, unknown>;
42
+ Object.keys(rawProps).forEach((key) => {
43
+ Reflect.deleteProperty(rawProps, key);
44
+ });
45
+ Object.assign(rawProps, props);
46
+ }
47
+
48
+ export function getComponentRawProp(
49
+ instance: object,
50
+ name: string,
51
+ ): unknown {
52
+ return (getInternals(instance).rawProps as Record<string, unknown>)[name];
53
+ }
54
+
55
+ export function getComponentDefault(
56
+ instance: object,
57
+ name: string,
58
+ ): unknown {
59
+ return getInternals(instance).defaults[name];
60
+ }
61
+
62
+ export function setComponentDefault(
63
+ instance: object,
64
+ name: string,
65
+ value: unknown,
66
+ ): void {
67
+ getInternals(instance).defaults[name] = value;
68
+ }
69
+
70
+ export function getComponentDefaults(
71
+ instance: object,
72
+ ): Record<string, unknown> {
73
+ return getInternals(instance).defaults;
74
+ }
75
+
76
+ export function getComponentAnchor(instance: object): Comment | undefined {
77
+ return getInternals(instance).anchor;
78
+ }
79
+
80
+ export function setComponentAnchor(
81
+ instance: object,
82
+ anchor: Comment | undefined,
83
+ ): void {
84
+ getInternals(instance).anchor = anchor;
85
+ }
86
+
87
+ export function isComponentMounted(instance: object): boolean {
88
+ return getInternals(instance).mounted;
89
+ }
90
+
91
+ export function setComponentMounted(
92
+ instance: object,
93
+ mounted: boolean,
94
+ ): void {
95
+ getInternals(instance).mounted = mounted;
96
+ }
97
+
98
+ export function markStateDirty(instance: object): void {
99
+ const internals = componentInternals.get(instance);
100
+ if (internals) {
101
+ internals.stateDirty = true;
102
+ }
103
+ }
104
+
105
+ export function isStateDirty(instance: object): boolean {
106
+ const internals = componentInternals.get(instance);
107
+ if (internals) return internals.stateDirty;
108
+ return false;
109
+ }
110
+
111
+ export function setStateDirty(
112
+ instance: object,
113
+ stateDirty: boolean,
114
+ ): void {
115
+ const internals = componentInternals.get(instance);
116
+ if (internals) {
117
+ internals.stateDirty = stateDirty;
118
+ }
119
+ }
@@ -2,24 +2,4 @@ import { RootComponent } from "./base";
2
2
 
3
3
  export abstract class StatefulComponent extends RootComponent<
4
4
  Record<string, unknown>
5
- > {
6
- /**
7
- * Default field values declared in the class, used to reset props on update.
8
- * @internal
9
- */
10
- readonly _defaults: Record<string, unknown> = {};
11
-
12
- /**
13
- * Set to `true` by `@State` on any write; cleared by the renderer after each re-render.
14
- * @internal
15
- */
16
- _stateDirty = false;
17
-
18
- /**
19
- * Raw props. Use `@Prop()` fields instead of reading this directly in user code.
20
- * @internal
21
- */
22
- override get props(): Record<string, unknown> {
23
- return this._rawProps;
24
- }
25
- }
5
+ > {}
@@ -1,14 +1,15 @@
1
1
  import type { Children } from "@praxisjs/shared";
2
2
 
3
3
  import { RootComponent } from "./base";
4
+ import { getComponentProps } from "./internals";
4
5
 
5
6
  type StatelessComponentType<T> = T & { children?: Children };
6
7
 
7
8
  export abstract class StatelessComponent<
8
9
  T extends object = Record<never, never>,
9
10
  > extends RootComponent<StatelessComponentType<T>> {
10
- /** Public props API for presentational components — see `RootComponent.props`. */
11
- override get props(): StatelessComponentType<T> {
12
- return this._rawProps;
11
+ /** Public props API for presentational components. */
12
+ get props(): StatelessComponentType<T> {
13
+ return getComponentProps(this) as StatelessComponentType<T>;
13
14
  }
14
15
  }
package/src/internal.ts CHANGED
@@ -19,11 +19,29 @@ export {
19
19
  type SyncedSignal,
20
20
  } from "./signal";
21
21
  export { RootComponent } from "./component";
22
+ export {
23
+ componentPropsType,
24
+ getComponentAnchor,
25
+ getComponentDefault,
26
+ getComponentDefaults,
27
+ getComponentProps,
28
+ getComponentRawProp,
29
+ isComponentMounted,
30
+ isStateDirty,
31
+ markStateDirty,
32
+ setComponentAnchor,
33
+ setComponentDefault,
34
+ setComponentMounted,
35
+ setComponentProps,
36
+ setStateDirty,
37
+ } from "./component/internals";
22
38
  export {
23
39
  resource,
24
40
  createResource,
41
+ flushPendingResources,
25
42
  type ResourceStatus,
26
43
  type Resource,
27
44
  type ResourceOptions,
28
45
  } from "./async/resource";
29
- export { invalidateResource, _clearCache } from "./async/resource-cache";
46
+ export { invalidateResource, trackPendingResource, _clearCache } from "./async/resource-cache";
47
+ export { setServerRenderPass, isServerRenderPass } from "./async/server-mode";