crelte 0.5.12 → 0.5.13

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 (44) hide show
  1. package/dist/blocks/Blocks.d.ts +1 -1
  2. package/dist/blocks/Blocks.d.ts.map +1 -1
  3. package/dist/bodyClass/BodyClass.d.ts +18 -1
  4. package/dist/bodyClass/BodyClass.d.ts.map +1 -1
  5. package/dist/bodyClass/BodyClass.js +21 -2
  6. package/dist/bodyClass/ClientBodyClass.d.ts +7 -2
  7. package/dist/bodyClass/ClientBodyClass.d.ts.map +1 -1
  8. package/dist/bodyClass/ClientBodyClass.js +29 -15
  9. package/dist/bodyClass/ServerBodyClass.d.ts +7 -1
  10. package/dist/bodyClass/ServerBodyClass.d.ts.map +1 -1
  11. package/dist/bodyClass/ServerBodyClass.js +19 -5
  12. package/dist/bodyClass/utils.d.ts +39 -0
  13. package/dist/bodyClass/utils.d.ts.map +1 -0
  14. package/dist/bodyClass/utils.js +84 -0
  15. package/dist/crelte.d.ts.map +1 -1
  16. package/dist/crelte.js +2 -0
  17. package/dist/init/client.js +1 -1
  18. package/dist/init/server.d.ts.map +1 -1
  19. package/dist/init/server.js +1 -0
  20. package/dist/init/shared.d.ts.map +1 -1
  21. package/dist/init/shared.js +3 -0
  22. package/dist/loadData/entry.d.ts +11 -2
  23. package/dist/loadData/entry.d.ts.map +1 -1
  24. package/dist/loadData/entry.js +11 -2
  25. package/dist/queries/index.d.ts +1 -1
  26. package/dist/queries/index.d.ts.map +1 -1
  27. package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
  28. package/dist/server/queries/QueryGqlRoute.js +3 -3
  29. package/dist/server/queries/routes.d.ts +1 -1
  30. package/dist/server/queries/routes.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/blocks/Blocks.ts +1 -1
  33. package/src/bodyClass/BodyClass.ts +25 -3
  34. package/src/bodyClass/ClientBodyClass.ts +37 -20
  35. package/src/bodyClass/ServerBodyClass.ts +28 -7
  36. package/src/bodyClass/utils.ts +118 -0
  37. package/src/crelte.ts +3 -0
  38. package/src/init/client.ts +1 -1
  39. package/src/init/server.ts +1 -0
  40. package/src/init/shared.ts +3 -0
  41. package/src/loadData/entry.ts +12 -2
  42. package/src/queries/index.ts +5 -1
  43. package/src/server/queries/QueryGqlRoute.ts +3 -2
  44. package/src/server/queries/routes.ts +1 -0
@@ -58,7 +58,7 @@ export declare class BlockModules {
58
58
  * );
59
59
  * ```
60
60
  */
61
- export declare function blockModules(modules: Record<string, AsyncModule>, opts?: BlockModulesOptions): BlockModules;
61
+ export declare function blockModules(modules: Record<string, (() => Promise<any>) | Module>, opts?: BlockModulesOptions): BlockModules;
62
62
  /**
63
63
  * Load blocks data
64
64
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Blocks.d.ts","sourceRoot":"","sources":["../../src/blocks/Blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,MAAM;IACtB,uBAAuB;IACvB,OAAO,EAAE,GAAG,CAAC;IAEb,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE3B,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,CACV,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,YAAY,KACd,OAAO,CAAC,GAAG,CAAC,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG;IACjC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,qBAAa,YAAY;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAG1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACpC,IAAI,GAAE,mBAAwB;IAgC/B;;;;OAIG;IACG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAmBtE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACpC,IAAI,GAAE,mBAAwB,GAC5B,YAAY,CAEd;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CACnC,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,GAAG,EAAE,EACb,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,CAAC,CAMzB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC9B,MAAM,EAAE,GAAG,EAAE,EACb,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,CAAC,CAazB;AAED,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEjB,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAMjD,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,EAAE;CAclC"}
1
+ {"version":3,"file":"Blocks.d.ts","sourceRoot":"","sources":["../../src/blocks/Blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,MAAM;IACtB,uBAAuB;IACvB,OAAO,EAAE,GAAG,CAAC;IAEb,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE3B,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,CACV,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,YAAY,KACd,OAAO,CAAC,GAAG,CAAC,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG;IACjC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,qBAAa,YAAY;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAG1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACpC,IAAI,GAAE,mBAAwB;IAgC/B;;;;OAIG;IACG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAmBtE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,EACtD,IAAI,GAAE,mBAAwB,GAC5B,YAAY,CAEd;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CACnC,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,GAAG,EAAE,EACb,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,CAAC,CAMzB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC9B,MAAM,EAAE,GAAG,EAAE,EACb,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,CAAC,CAazB;AAED,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEjB,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAMjD,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,EAAE;CAclC"}
@@ -22,7 +22,23 @@ export default class BodyClass {
22
22
  * it.
23
23
  */
24
24
  toggle(cls: string, force?: boolean): void;
25
+ /**
26
+ * Removes the given classes from the body
27
+ */
25
28
  remove(...classes: string[]): void;
29
+ /**
30
+ * Sets the class for the given variant removing the old class for that
31
+ * variant, if cls is null it will remove the variant class
32
+ *
33
+ * If you just have like a dark or light mode and only for the dark mode a
34
+ * class, **prefer** `toggle('dark', isDarkMode)` over
35
+ * `setVariant('mode', isDarkMode ? 'dark' : null)`
36
+ *
37
+ * ## Note
38
+ * The variant name is only used for the internal state management
39
+ * and has no inpact on the actual class name
40
+ */
41
+ setVariant(variant: string, cls: string | null): void;
26
42
  /** @hidden */
27
43
  z_toRequest(): BodyClass;
28
44
  /** @hidden */
@@ -31,8 +47,9 @@ export default class BodyClass {
31
47
  export interface PlatformBodyClass {
32
48
  contains(cls: string): boolean;
33
49
  add(...classes: string[]): void;
34
- toggle(cls: string, force?: boolean): void;
50
+ toggle(cls: string, force?: boolean): boolean;
35
51
  remove(...classes: string[]): void;
52
+ setVariant(variant: string, cls: string | null): boolean;
36
53
  toRequest(): PlatformBodyClass;
37
54
  render?: () => void;
38
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/BodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,SAAS;IAC7B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,KAAK,CAAuB;gBAExB,KAAK,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC;IAKlE,SAAS,CACR,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,EAC5B,UAAU,CAAC,EAAE,MAAM,IAAI,GACrB,MAAM,IAAI;IAIb;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAK1C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC,cAAc;IACd,WAAW,IAAI,SAAS;IAIxB,cAAc;IACd,QAAQ,IAAI,IAAI;CAIhB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,SAAS,IAAI,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB"}
1
+ {"version":3,"file":"BodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/BodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,SAAS;IAC7B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,KAAK,CAAuB;gBAExB,KAAK,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC;IAKlE,SAAS,CACR,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,EAC5B,UAAU,CAAC,EAAE,MAAM,IAAI,GACrB,MAAM,IAAI;IAIb;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAI1C;;OAEG;IACH,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIrD,cAAc;IACd,WAAW,IAAI,SAAS;IAIxB,cAAc;IACd,QAAQ,IAAI,IAAI;CAIhB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAGhC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEnC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IACzD,SAAS,IAAI,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB"}
@@ -32,13 +32,32 @@ export default class BodyClass {
32
32
  * it.
33
33
  */
34
34
  toggle(cls, force) {
35
- this.inner.toggle(cls, force);
36
- this.store.set();
35
+ if (this.inner.toggle(cls, force))
36
+ this.store.set();
37
37
  }
38
+ /**
39
+ * Removes the given classes from the body
40
+ */
38
41
  remove(...classes) {
39
42
  this.inner.remove(...classes);
40
43
  this.store.set();
41
44
  }
45
+ /**
46
+ * Sets the class for the given variant removing the old class for that
47
+ * variant, if cls is null it will remove the variant class
48
+ *
49
+ * If you just have like a dark or light mode and only for the dark mode a
50
+ * class, **prefer** `toggle('dark', isDarkMode)` over
51
+ * `setVariant('mode', isDarkMode ? 'dark' : null)`
52
+ *
53
+ * ## Note
54
+ * The variant name is only used for the internal state management
55
+ * and has no inpact on the actual class name
56
+ */
57
+ setVariant(variant, cls) {
58
+ if (this.inner.setVariant(variant, cls))
59
+ this.store.set();
60
+ }
42
61
  /** @hidden */
43
62
  z_toRequest() {
44
63
  return new BodyClass(this.inner.toRequest(), this.store.stage());
@@ -1,11 +1,16 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
1
2
  import { PlatformBodyClass } from './BodyClass.js';
3
+ import { ClassSet, Variants } from './utils.js';
2
4
  export default class ClientBodyClass implements PlatformBodyClass {
5
+ private variants;
3
6
  private inner;
4
- constructor(inner?: Set<string>);
7
+ constructor(variants: Variants, inner?: ClassSet);
8
+ static fromSsrCache(ssrCache: SsrCache): ClientBodyClass;
5
9
  contains(cls: string): boolean;
6
10
  add(...classes: string[]): void;
7
- toggle(cls: string, force?: boolean): void;
11
+ toggle(cls: string, force?: boolean): boolean;
8
12
  remove(...classes: string[]): void;
13
+ setVariant(variant: string, cls: string | null): boolean;
9
14
  toRequest(): ClientBodyClass;
10
15
  render(): void;
11
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClientBodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/ClientBodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,iBAAiB;IAChE,OAAO,CAAC,KAAK,CAAqB;gBAEtB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;IAI/B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK9B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAY1C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC,SAAS,IAAI,eAAe;IAK5B,MAAM,IAAI,IAAI;CAgBd"}
1
+ {"version":3,"file":"ClientBodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/ClientBodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAsB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO,CAAC,KAAK,CAAkB;gBAEnB,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,QAAQ;IAKhD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe;IAKxD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK9B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAM/B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAe7C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAWxD,SAAS,IAAI,eAAe;IAK5B,MAAM,IAAI,IAAI;CAQd"}
@@ -1,8 +1,16 @@
1
+ import { ClassSet, ssrCacheToVariants } from './utils.js';
1
2
  export default class ClientBodyClass {
3
+ variants;
4
+ // during the request store the classes here
2
5
  inner;
3
- constructor(inner) {
6
+ constructor(variants, inner) {
7
+ this.variants = variants;
4
8
  this.inner = inner ?? null;
5
9
  }
10
+ static fromSsrCache(ssrCache) {
11
+ const variants = ssrCacheToVariants(ssrCache);
12
+ return new ClientBodyClass(variants);
13
+ }
6
14
  contains(cls) {
7
15
  if (this.inner)
8
16
  return this.inner.has(cls);
@@ -14,10 +22,13 @@ export default class ClientBodyClass {
14
22
  else
15
23
  cl().add(...classes);
16
24
  }
25
+ // returns true if the value was changed
17
26
  toggle(cls, force) {
27
+ const exists = this.contains(cls);
28
+ const shouldExist = typeof force === 'boolean' ? force : !exists;
29
+ const changed = shouldExist !== exists;
18
30
  if (this.inner) {
19
- const add = typeof force === 'boolean' ? force : !this.inner.has(cls);
20
- if (add)
31
+ if (shouldExist)
21
32
  this.inner.add(cls);
22
33
  else
23
34
  this.inner.delete(cls);
@@ -25,6 +36,7 @@ export default class ClientBodyClass {
25
36
  else {
26
37
  cl().toggle(cls, force);
27
38
  }
39
+ return changed;
28
40
  }
29
41
  remove(...classes) {
30
42
  if (this.inner)
@@ -32,24 +44,26 @@ export default class ClientBodyClass {
32
44
  else
33
45
  cl().remove(...classes);
34
46
  }
47
+ setVariant(variant, cls) {
48
+ if (this.inner)
49
+ return this.inner.setVariant(variant, cls);
50
+ const { remove, add } = this.variants.set(variant, cls);
51
+ if (remove)
52
+ cl().remove(remove);
53
+ if (add)
54
+ cl().add(add);
55
+ return !!remove || !!add;
56
+ }
35
57
  toRequest() {
36
- const inner = new Set(cl());
37
- return new ClientBodyClass(inner);
58
+ const inner = new ClassSet(cl(), this.variants.entries(), true);
59
+ return new ClientBodyClass(this.variants, inner);
38
60
  }
39
61
  render() {
40
62
  if (!this.inner)
41
63
  throw new Error('call toRequest first');
42
- const current = new Set(cl());
43
- for (const cls of this.inner) {
44
- const existed = current.delete(cls);
45
- if (!existed)
46
- cl().add(cls);
47
- }
48
- // now lets remove all classes that still exist in current
49
- for (const cls of current) {
50
- cl().remove(cls);
51
- }
64
+ const inner = this.inner;
52
65
  this.inner = null;
66
+ inner.applyHistory(this);
53
67
  }
54
68
  }
55
69
  function cl() {
@@ -1,12 +1,18 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
1
2
  import { PlatformBodyClass } from './BodyClass.js';
2
3
  export default class ServerBodyClass implements PlatformBodyClass {
3
4
  private inner;
4
5
  constructor();
5
6
  contains(cls: string): boolean;
6
7
  add(...classes: string[]): void;
7
- toggle(cls: string, force?: boolean): void;
8
+ toggle(cls: string, force?: boolean): boolean;
8
9
  remove(...classes: string[]): void;
10
+ /**
11
+ * @returns Returns true if the value was changed
12
+ */
13
+ setVariant(variant: string, cls: string | null): boolean;
9
14
  toRequest(): ServerBodyClass;
15
+ z_populateSsrCache(ssrCache: SsrCache): void;
10
16
  z_processHtmlTemplate(html: string): string;
11
17
  }
12
18
  //# sourceMappingURL=ServerBodyClass.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/ServerBodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,iBAAiB;IAChE,OAAO,CAAC,KAAK,CAAc;;IAM3B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAiB1C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC,SAAS,IAAI,eAAe;IAI5B,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAU3C"}
1
+ {"version":3,"file":"ServerBodyClass.d.ts","sourceRoot":"","sources":["../../src/bodyClass/ServerBodyClass.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,iBAAiB;IAChE,OAAO,CAAC,KAAK,CAAW;;IAMxB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAqB7C,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAIxD,SAAS,IAAI,eAAe;IAK5B,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI5C,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAa3C"}
@@ -1,7 +1,8 @@
1
+ import { ClassSet, variantsToSsrCache } from './utils.js';
1
2
  export default class ServerBodyClass {
2
3
  inner;
3
4
  constructor() {
4
- this.inner = new Set();
5
+ this.inner = new ClassSet();
5
6
  }
6
7
  contains(cls) {
7
8
  return this.inner.has(cls);
@@ -17,25 +18,38 @@ export default class ServerBodyClass {
17
18
  'to unexpected results. Because in a loadData the server will add it ' +
18
19
  'and the client will afterwards remove it.');
19
20
  }
20
- const add = typeof force === 'boolean' ? force : !this.inner.has(cls);
21
- if (add)
21
+ const exists = this.inner.has(cls);
22
+ const shouldExist = typeof force === 'boolean' ? force : !exists;
23
+ const changed = shouldExist !== exists;
24
+ if (shouldExist)
22
25
  this.inner.add(cls);
23
26
  else
24
27
  this.inner.delete(cls);
28
+ return changed;
25
29
  }
26
30
  remove(...classes) {
27
31
  validate(classes);
28
32
  classes.forEach(cls => this.inner.delete(cls));
29
33
  }
34
+ /**
35
+ * @returns Returns true if the value was changed
36
+ */
37
+ setVariant(variant, cls) {
38
+ return this.inner.setVariant(variant, cls);
39
+ }
30
40
  toRequest() {
41
+ // no second request should ever start on the server
31
42
  return this;
32
43
  }
44
+ z_populateSsrCache(ssrCache) {
45
+ variantsToSsrCache(this.inner.z_variants, ssrCache);
46
+ }
33
47
  z_processHtmlTemplate(html) {
34
48
  const SEARCH_STR = '<!--body-class-->';
35
- if (this.inner.size && !html.includes(SEARCH_STR)) {
49
+ if (this.inner.length && !html.includes(SEARCH_STR)) {
36
50
  throw new Error('index.html needs to contain `class="<!--body-class-->"`');
37
51
  }
38
- return html.replace(SEARCH_STR, Array.from(this.inner).join(' '));
52
+ return html.replace(SEARCH_STR, Array.from(this.inner.classes()).join(' '));
39
53
  }
40
54
  }
41
55
  function validate(classes) {
@@ -0,0 +1,39 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
2
+ export type HistoryClassSet = {
3
+ add(cls: string): void;
4
+ remove(cls: string): void;
5
+ setVariant(variant: string, cls: string | null): void;
6
+ };
7
+ export declare class ClassSet {
8
+ private _classes;
9
+ /** @hidden */
10
+ z_variants: Variants;
11
+ private history;
12
+ constructor(classes?: Iterable<string>, variants?: Iterable<[string, string]>, history?: boolean);
13
+ classes(): Iterable<string>;
14
+ get length(): number;
15
+ has(cls: string): boolean;
16
+ add(cls: string): void;
17
+ delete(cls: string): void;
18
+ /**
19
+ * @returns Returns true if the value was changed
20
+ */
21
+ setVariant(variant: string, cls: string | null): boolean;
22
+ /**
23
+ * Fails if no history is active.
24
+ */
25
+ applyHistory(cl: HistoryClassSet): void;
26
+ }
27
+ export type VariantSetReturn = {
28
+ remove?: string;
29
+ add?: string;
30
+ };
31
+ export declare class Variants {
32
+ private inner;
33
+ constructor(entries?: Iterable<[string, string]>);
34
+ set(variant: string, cls: string | null): VariantSetReturn;
35
+ entries(): Iterable<[string, string]>;
36
+ }
37
+ export declare function ssrCacheToVariants(ssrCache: SsrCache): Variants;
38
+ export declare function variantsToSsrCache(variants: Variants, ssrCache: SsrCache): void;
39
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/bodyClass/utils.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACtD,CAAC;AAEF,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAc;IAC9B,cAAc;IACd,UAAU,EAAE,QAAQ,CAAC;IACrB,OAAO,CAAC,OAAO,CAA2C;gBAGzD,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrC,OAAO,GAAE,OAAe;IAOzB,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC;IAI3B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKzB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAaxD;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;CAGvC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,QAAQ;IAEpB,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIhD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB;IAkB1D,OAAO,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAGrC;AAGD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAE/D;AAGD,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GAChB,IAAI,CAEN"}
@@ -0,0 +1,84 @@
1
+ export class ClassSet {
2
+ _classes;
3
+ /** @hidden */
4
+ z_variants;
5
+ history;
6
+ constructor(classes, variants, history = false) {
7
+ this._classes = new Set(classes);
8
+ this.z_variants = new Variants();
9
+ this.history = history ? [] : null;
10
+ }
11
+ classes() {
12
+ return this._classes;
13
+ }
14
+ get length() {
15
+ return this._classes.size;
16
+ }
17
+ has(cls) {
18
+ return this._classes.has(cls);
19
+ }
20
+ add(cls) {
21
+ this._classes.add(cls);
22
+ if (this.history)
23
+ this.history.push(c => c.add(cls));
24
+ }
25
+ delete(cls) {
26
+ this._classes.delete(cls);
27
+ if (this.history)
28
+ this.history.push(c => c.remove(cls));
29
+ }
30
+ /**
31
+ * @returns Returns true if the value was changed
32
+ */
33
+ setVariant(variant, cls) {
34
+ const { remove, add } = this.z_variants.set(variant, cls);
35
+ if (remove)
36
+ this.delete(remove);
37
+ if (add)
38
+ this.add(add);
39
+ const changed = !!remove || !!add;
40
+ if (this.history)
41
+ this.history.push(c => c.setVariant(variant, cls));
42
+ return changed;
43
+ }
44
+ /**
45
+ * Fails if no history is active.
46
+ */
47
+ applyHistory(cl) {
48
+ this.history.forEach(fn => fn(cl));
49
+ }
50
+ }
51
+ export class Variants {
52
+ // list of active variant classes
53
+ inner;
54
+ constructor(entries) {
55
+ this.inner = new Map(entries);
56
+ }
57
+ set(variant, cls) {
58
+ const current = this.inner.get(variant) ?? null;
59
+ if (current === cls)
60
+ return {};
61
+ const obj = {};
62
+ if (current)
63
+ obj.remove = current;
64
+ if (cls) {
65
+ obj.add = cls;
66
+ this.inner.set(variant, cls);
67
+ }
68
+ else {
69
+ this.inner.delete(variant);
70
+ }
71
+ return obj;
72
+ }
73
+ entries() {
74
+ return this.inner.entries();
75
+ }
76
+ }
77
+ // separate function for tree shaking
78
+ export function ssrCacheToVariants(ssrCache) {
79
+ return new Variants(ssrCache.get('BODY_CLASS_VAR'));
80
+ }
81
+ // separate function for tree shaking
82
+ export function variantsToSsrCache(variants, ssrCache) {
83
+ ssrCache.set('BODY_CLASS_VAR', Array.from(variants.entries()));
84
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"crelte.d.ts","sourceRoot":"","sources":["../src/crelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crelte.d.ts","sourceRoot":"","sources":["../src/crelte.ts"],"names":[],"mappings":"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"}
package/dist/crelte.js CHANGED
@@ -21,6 +21,8 @@ export function newCrelte({ config, ssrCache, plugins, events, globals, router,
21
21
  queries,
22
22
  cookies,
23
23
  bodyClass,
24
+ // when adding a new helper function make sure to add it to
25
+ // onNewCrelteRequest if needed
24
26
  getPlugin: name => plugins.get(name),
25
27
  getEnv: key => ssrCache.get(key),
26
28
  frontendUrl: path => urlWithPath(ssrCache.get('FRONTEND_URL'), path),
@@ -61,7 +61,7 @@ export async function main(data) {
61
61
  router: new Router(router),
62
62
  queries,
63
63
  cookies: new Cookies(new ClientCookies()),
64
- bodyClass: new BodyClass(new ClientBodyClass()),
64
+ bodyClass: new BodyClass(ClientBodyClass.fromSsrCache(ssrCache)),
65
65
  });
66
66
  const app = new InternalApp(data.app);
67
67
  // setup plugins
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/init/server.ts"],"names":[],"mappings":"AAoBA,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IAET,0CAA0C;IAC1C,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAsHlE;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAE3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IAEf,UAAU,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC5C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/init/server.ts"],"names":[],"mappings":"AAoBA,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IAET,0CAA0C;IAC1C,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAuHlE;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAE3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IAEf,UAAU,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC5C"}
@@ -101,6 +101,7 @@ export async function main(data) {
101
101
  props: { route: routeProp },
102
102
  context,
103
103
  });
104
+ bodyClass.z_populateSsrCache(ssrCache);
104
105
  head += ssrComponents.toHead(data.serverData.ssrManifest);
105
106
  head += crelte.ssrCache.z_exportToHead();
106
107
  let htmlTemplate = data.serverData.htmlTemplate;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/init/shared.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,WAA+B,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9E,OAAO,OAA2B,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAExE;AAED,wBAAgB,UAAU,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAcxB;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACV,aAAa,CAcf;AAsBD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAwHf"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/init/shared.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,WAA+B,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9E,OAAO,OAA2B,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAExE;AAED,wBAAgB,UAAU,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAcxB;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACV,aAAa,CAiBf;AAsBD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAwHf"}
@@ -46,6 +46,9 @@ export function onNewCrelteRequest(crelte, req) {
46
46
  cookies: crelte.cookies.z_toRequest(),
47
47
  bodyClass: crelte.bodyClass.z_toRequest(),
48
48
  };
49
+ // make sure helper funcitons link to the correct instances
50
+ nCrelte.getPlugin = name => nCrelte.plugins.get(name);
51
+ nCrelte.getGlobalStore = name => nCrelte.globals.getStore(name);
49
52
  return crelteToRequest(nCrelte, req);
50
53
  }
51
54
  async function eventsLoadEntry(cr) {
@@ -1,5 +1,5 @@
1
1
  import { CrelteRequest } from '../index.js';
2
- import { Query } from '../queries/Queries.js';
2
+ import { Query, QueryOptions } from '../queries/Queries.js';
3
3
  export type Entry = {
4
4
  sectionHandle: string;
5
5
  typeHandle: string;
@@ -11,7 +11,16 @@ export type EntryQueryVars = {
11
11
  [key: string]: any;
12
12
  };
13
13
  export declare function entryQueryVars(cr: CrelteRequest): EntryQueryVars;
14
- export declare function queryEntry(cr: CrelteRequest, entryQuery: Query, vars: EntryQueryVars): Promise<Entry>;
14
+ /**
15
+ * ## Example
16
+ * `App.svelte`
17
+ * ```ts
18
+ * import entryQuery from '@/queries/entry.graphql';
19
+ *
20
+ * export const loadEntry => cr => queryEntry(cr, entryQuery, entryQueryVars(cr));
21
+ * ```
22
+ */
23
+ export declare function queryEntry(cr: CrelteRequest, entryQuery: Query, vars: EntryQueryVars, opts?: QueryOptions): Promise<Entry>;
15
24
  export declare const ENTRY_ERROR_404: Entry;
16
25
  /**
17
26
  * Get the entry from the page
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/loadData/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,MAAM,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IAGf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,cAAc,CAchE;AAED,wBAAsB,UAAU,CAC/B,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,cAAc,GAClB,OAAO,CAAC,KAAK,CAAC,CAGhB;AAED,eAAO,MAAM,eAAe,EAAE,KAG7B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,IAAI,CAUpD"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/loadData/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IAGf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,cAAc,CAchE;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC/B,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,KAAK,CAAC,CAGhB;AAED,eAAO,MAAM,eAAe,EAAE,KAG7B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,IAAI,CAUpD"}
@@ -11,8 +11,17 @@ export function entryQueryVars(cr) {
11
11
  siteId: cr.site.id,
12
12
  };
13
13
  }
14
- export async function queryEntry(cr, entryQuery, vars) {
15
- const page = await cr.query(entryQuery, vars);
14
+ /**
15
+ * ## Example
16
+ * `App.svelte`
17
+ * ```ts
18
+ * import entryQuery from '@/queries/entry.graphql';
19
+ *
20
+ * export const loadEntry => cr => queryEntry(cr, entryQuery, entryQueryVars(cr));
21
+ * ```
22
+ */
23
+ export async function queryEntry(cr, entryQuery, vars, opts) {
24
+ const page = await cr.query(entryQuery, vars, opts);
16
25
  return extractEntry(page) ?? ENTRY_ERROR_404;
17
26
  }
18
27
  export const ENTRY_ERROR_404 = {
@@ -41,7 +41,7 @@ export type TransformFn<T extends Record<string, QueryVar<any>> = Record<string,
41
41
  * };
42
42
  * ```
43
43
  */
44
- export type Transform<T extends Record<string, QueryVar<any>> = Record<string, QueryVar<any>>, F extends TransformFn<T> = TransformFn<T>> = (response: any, vars: InferVariableTypes<T>) => Awaited<ReturnType<F>>;
44
+ export type Transform<T extends Record<string, QueryVar<any>> = Record<string, QueryVar<any>>, F extends TransformFn<T> = TransformFn<T>> = (response: any, vars: InferVariableTypes<T>, csr: CrelteServerRequest) => Awaited<ReturnType<F>>;
45
45
  /** use {@link Handle} */
46
46
  export type HandleFn<T extends Record<string, QueryVar<any>> = Record<string, QueryVar<any>>> = (csr: CrelteServerRequest, vars: InferVariableTypes<T>) => any;
47
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAY,WAAW,EAAgB,MAAM,aAAa,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;IA2B3D,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAuBX,SAAS;IAUjB,MAAM,CACX,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;CAkHpB"}
1
+ {"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAY,WAAW,EAAgB,MAAM,aAAa,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;IA2B3D,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAuBX,SAAS;IAWjB,MAAM,CACX,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;CAkHpB"}
@@ -76,10 +76,10 @@ export default class QueryGqlRoute {
76
76
  ' https://github.com/crelte/crelte/issues/114 for infos');
77
77
  }
78
78
  }
79
- async transform(jsonResp, vars) {
79
+ async transform(jsonResp, vars, csr) {
80
80
  if (!this.transformFn || !jsonResp.data)
81
81
  return;
82
- const transformed = await this.transformFn(jsonResp.data, vars);
82
+ const transformed = await this.transformFn(jsonResp.data, vars, csr);
83
83
  if (typeof transformed !== 'undefined')
84
84
  jsonResp.data = transformed;
85
85
  }
@@ -164,7 +164,7 @@ export default class QueryGqlRoute {
164
164
  jsonResp = await resp.json();
165
165
  if (!jsonResp || typeof jsonResp !== 'object')
166
166
  throw new Error('invalid json response');
167
- await this.transform(jsonResp, vars);
167
+ await this.transform(jsonResp, vars, csr);
168
168
  }
169
169
  catch (e) {
170
170
  return newError(e, 500);
@@ -2,7 +2,7 @@ import { QueryVar } from '../../queries/vars.js';
2
2
  import CrelteServerRequest from '../CrelteServer.js';
3
3
  import ServerRouter from '../ServerRouter.js';
4
4
  export type CacheIfFn = (response: any, vars: Record<string, any>) => boolean;
5
- export type TransformFn = (response: any, vars: Record<string, any>) => void | any | Promise<void | any>;
5
+ export type TransformFn = (response: any, vars: Record<string, any>, csr: CrelteServerRequest) => void | any | Promise<void | any>;
6
6
  export type HandleFn = (csr: CrelteServerRequest, vars: Record<string, any>) => Promise<any> | any;
7
7
  /**
8
8
  * Returns the validated variables if some vars where defined
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/server/queries/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;AAM9E,MAAM,MAAM,WAAW,GAAG,CACzB,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACrB,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,CACtB,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACrB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAExB;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,EACtC,IAAI,EAAE,GAAG,EACT,EAAE,EAAE,YAAY,GACd,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAarB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEzD"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/server/queries/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;AAM9E,MAAM,MAAM,WAAW,GAAG,CACzB,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,GAAG,EAAE,mBAAmB,KACpB,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,CACtB,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACrB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAExB;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,EACtC,IAAI,EAAE,GAAG,EACT,EAAE,EAAE,YAAY,GACd,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAarB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEzD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.5.12",
3
+ "version": "0.5.13",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -125,7 +125,7 @@ export class BlockModules {
125
125
  * ```
126
126
  */
127
127
  export function blockModules(
128
- modules: Record<string, AsyncModule>,
128
+ modules: Record<string, (() => Promise<any>) | Module>,
129
129
  opts: BlockModulesOptions = {},
130
130
  ): BlockModules {
131
131
  return new BlockModules(modules, opts);
@@ -41,15 +41,33 @@ export default class BodyClass {
41
41
  * it.
42
42
  */
43
43
  toggle(cls: string, force?: boolean): void {
44
- this.inner.toggle(cls, force);
45
- this.store.set();
44
+ if (this.inner.toggle(cls, force)) this.store.set();
46
45
  }
47
46
 
47
+ /**
48
+ * Removes the given classes from the body
49
+ */
48
50
  remove(...classes: string[]): void {
49
51
  this.inner.remove(...classes);
50
52
  this.store.set();
51
53
  }
52
54
 
55
+ /**
56
+ * Sets the class for the given variant removing the old class for that
57
+ * variant, if cls is null it will remove the variant class
58
+ *
59
+ * If you just have like a dark or light mode and only for the dark mode a
60
+ * class, **prefer** `toggle('dark', isDarkMode)` over
61
+ * `setVariant('mode', isDarkMode ? 'dark' : null)`
62
+ *
63
+ * ## Note
64
+ * The variant name is only used for the internal state management
65
+ * and has no inpact on the actual class name
66
+ */
67
+ setVariant(variant: string, cls: string | null): void {
68
+ if (this.inner.setVariant(variant, cls)) this.store.set();
69
+ }
70
+
53
71
  /** @hidden */
54
72
  z_toRequest(): BodyClass {
55
73
  return new BodyClass(this.inner.toRequest(), this.store.stage());
@@ -65,8 +83,12 @@ export default class BodyClass {
65
83
  export interface PlatformBodyClass {
66
84
  contains(cls: string): boolean;
67
85
  add(...classes: string[]): void;
68
- toggle(cls: string, force?: boolean): void;
86
+ // returns true if the value was changed (this is different to the
87
+ // DOMTokenList.toggle which returns true if the class is now present)
88
+ toggle(cls: string, force?: boolean): boolean;
69
89
  remove(...classes: string[]): void;
90
+ // returns true if the value was changed
91
+ setVariant(variant: string, cls: string | null): boolean;
70
92
  toRequest(): PlatformBodyClass;
71
93
  render?: () => void;
72
94
  }
@@ -1,12 +1,22 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
1
2
  import { PlatformBodyClass } from './BodyClass.js';
3
+ import { ClassSet, ssrCacheToVariants, Variants } from './utils.js';
2
4
 
3
5
  export default class ClientBodyClass implements PlatformBodyClass {
4
- private inner: Set<string> | null;
6
+ private variants: Variants;
7
+ // during the request store the classes here
8
+ private inner: ClassSet | null;
5
9
 
6
- constructor(inner?: Set<string>) {
10
+ constructor(variants: Variants, inner?: ClassSet) {
11
+ this.variants = variants;
7
12
  this.inner = inner ?? null;
8
13
  }
9
14
 
15
+ static fromSsrCache(ssrCache: SsrCache): ClientBodyClass {
16
+ const variants = ssrCacheToVariants(ssrCache);
17
+ return new ClientBodyClass(variants);
18
+ }
19
+
10
20
  contains(cls: string): boolean {
11
21
  if (this.inner) return this.inner.has(cls);
12
22
  return cl().contains(cls);
@@ -17,16 +27,20 @@ export default class ClientBodyClass implements PlatformBodyClass {
17
27
  else cl().add(...classes);
18
28
  }
19
29
 
20
- toggle(cls: string, force?: boolean): void {
21
- if (this.inner) {
22
- const add =
23
- typeof force === 'boolean' ? force : !this.inner.has(cls);
30
+ // returns true if the value was changed
31
+ toggle(cls: string, force?: boolean): boolean {
32
+ const exists = this.contains(cls);
33
+ const shouldExist = typeof force === 'boolean' ? force : !exists;
34
+ const changed = shouldExist !== exists;
24
35
 
25
- if (add) this.inner.add(cls);
36
+ if (this.inner) {
37
+ if (shouldExist) this.inner.add(cls);
26
38
  else this.inner.delete(cls);
27
39
  } else {
28
40
  cl().toggle(cls, force);
29
41
  }
42
+
43
+ return changed;
30
44
  }
31
45
 
32
46
  remove(...classes: string[]): void {
@@ -34,26 +48,29 @@ export default class ClientBodyClass implements PlatformBodyClass {
34
48
  else cl().remove(...classes);
35
49
  }
36
50
 
51
+ setVariant(variant: string, cls: string | null): boolean {
52
+ if (this.inner) return this.inner.setVariant(variant, cls);
53
+
54
+ const { remove, add } = this.variants.set(variant, cls);
55
+
56
+ if (remove) cl().remove(remove);
57
+ if (add) cl().add(add);
58
+
59
+ return !!remove || !!add;
60
+ }
61
+
37
62
  toRequest(): ClientBodyClass {
38
- const inner = new Set(cl());
39
- return new ClientBodyClass(inner);
63
+ const inner = new ClassSet(cl(), this.variants.entries(), true);
64
+ return new ClientBodyClass(this.variants, inner);
40
65
  }
41
66
 
42
67
  render(): void {
43
68
  if (!this.inner) throw new Error('call toRequest first');
44
- const current = new Set(cl());
45
-
46
- for (const cls of this.inner) {
47
- const existed = current.delete(cls);
48
- if (!existed) cl().add(cls);
49
- }
50
-
51
- // now lets remove all classes that still exist in current
52
- for (const cls of current) {
53
- cl().remove(cls);
54
- }
55
69
 
70
+ const inner = this.inner;
56
71
  this.inner = null;
72
+
73
+ inner.applyHistory(this);
57
74
  }
58
75
  }
59
76
 
@@ -1,10 +1,12 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
1
2
  import { PlatformBodyClass } from './BodyClass.js';
3
+ import { ClassSet, variantsToSsrCache } from './utils.js';
2
4
 
3
5
  export default class ServerBodyClass implements PlatformBodyClass {
4
- private inner: Set<string>;
6
+ private inner: ClassSet;
5
7
 
6
8
  constructor() {
7
- this.inner = new Set();
9
+ this.inner = new ClassSet();
8
10
  }
9
11
 
10
12
  contains(cls: string): boolean {
@@ -16,7 +18,7 @@ export default class ServerBodyClass implements PlatformBodyClass {
16
18
  classes.forEach(cls => this.inner.add(cls));
17
19
  }
18
20
 
19
- toggle(cls: string, force?: boolean): void {
21
+ toggle(cls: string, force?: boolean): boolean {
20
22
  validate([cls]);
21
23
 
22
24
  if (import.meta.env.DEV && typeof force !== 'boolean') {
@@ -27,10 +29,14 @@ export default class ServerBodyClass implements PlatformBodyClass {
27
29
  );
28
30
  }
29
31
 
30
- const add = typeof force === 'boolean' ? force : !this.inner.has(cls);
32
+ const exists = this.inner.has(cls);
33
+ const shouldExist = typeof force === 'boolean' ? force : !exists;
34
+ const changed = shouldExist !== exists;
31
35
 
32
- if (add) this.inner.add(cls);
36
+ if (shouldExist) this.inner.add(cls);
33
37
  else this.inner.delete(cls);
38
+
39
+ return changed;
34
40
  }
35
41
 
36
42
  remove(...classes: string[]): void {
@@ -38,19 +44,34 @@ export default class ServerBodyClass implements PlatformBodyClass {
38
44
  classes.forEach(cls => this.inner.delete(cls));
39
45
  }
40
46
 
47
+ /**
48
+ * @returns Returns true if the value was changed
49
+ */
50
+ setVariant(variant: string, cls: string | null): boolean {
51
+ return this.inner.setVariant(variant, cls);
52
+ }
53
+
41
54
  toRequest(): ServerBodyClass {
55
+ // no second request should ever start on the server
42
56
  return this;
43
57
  }
44
58
 
59
+ z_populateSsrCache(ssrCache: SsrCache): void {
60
+ variantsToSsrCache(this.inner.z_variants, ssrCache);
61
+ }
62
+
45
63
  z_processHtmlTemplate(html: string): string {
46
64
  const SEARCH_STR = '<!--body-class-->';
47
- if (this.inner.size && !html.includes(SEARCH_STR)) {
65
+ if (this.inner.length && !html.includes(SEARCH_STR)) {
48
66
  throw new Error(
49
67
  'index.html needs to contain `class="<!--body-class-->"`',
50
68
  );
51
69
  }
52
70
 
53
- return html.replace(SEARCH_STR, Array.from(this.inner).join(' '));
71
+ return html.replace(
72
+ SEARCH_STR,
73
+ Array.from(this.inner.classes()).join(' '),
74
+ );
54
75
  }
55
76
  }
56
77
 
@@ -0,0 +1,118 @@
1
+ import SsrCache from '../ssr/SsrCache.js';
2
+
3
+ export type HistoryClassSet = {
4
+ add(cls: string): void;
5
+ remove(cls: string): void;
6
+ setVariant(variant: string, cls: string | null): void;
7
+ };
8
+
9
+ export class ClassSet {
10
+ private _classes: Set<string>;
11
+ /** @hidden */
12
+ z_variants: Variants;
13
+ private history: ((cl: HistoryClassSet) => void)[] | null;
14
+
15
+ constructor(
16
+ classes?: Iterable<string>,
17
+ variants?: Iterable<[string, string]>,
18
+ history: boolean = false,
19
+ ) {
20
+ this._classes = new Set(classes);
21
+ this.z_variants = new Variants();
22
+ this.history = history ? [] : null;
23
+ }
24
+
25
+ classes(): Iterable<string> {
26
+ return this._classes;
27
+ }
28
+
29
+ get length(): number {
30
+ return this._classes.size;
31
+ }
32
+
33
+ has(cls: string): boolean {
34
+ return this._classes.has(cls);
35
+ }
36
+
37
+ add(cls: string): void {
38
+ this._classes.add(cls);
39
+ if (this.history) this.history.push(c => c.add(cls));
40
+ }
41
+
42
+ delete(cls: string): void {
43
+ this._classes.delete(cls);
44
+ if (this.history) this.history.push(c => c.remove(cls));
45
+ }
46
+
47
+ /**
48
+ * @returns Returns true if the value was changed
49
+ */
50
+ setVariant(variant: string, cls: string | null): boolean {
51
+ const { remove, add } = this.z_variants.set(variant, cls);
52
+
53
+ if (remove) this.delete(remove);
54
+ if (add) this.add(add);
55
+
56
+ const changed = !!remove || !!add;
57
+
58
+ if (this.history) this.history.push(c => c.setVariant(variant, cls));
59
+
60
+ return changed;
61
+ }
62
+
63
+ /**
64
+ * Fails if no history is active.
65
+ */
66
+ applyHistory(cl: HistoryClassSet): void {
67
+ this.history!.forEach(fn => fn(cl));
68
+ }
69
+ }
70
+
71
+ export type VariantSetReturn = {
72
+ remove?: string;
73
+ add?: string;
74
+ };
75
+
76
+ export class Variants {
77
+ // list of active variant classes
78
+ private inner: Map<string, string>;
79
+
80
+ constructor(entries?: Iterable<[string, string]>) {
81
+ this.inner = new Map(entries);
82
+ }
83
+
84
+ set(variant: string, cls: string | null): VariantSetReturn {
85
+ const current = this.inner.get(variant) ?? null;
86
+
87
+ if (current === cls) return {};
88
+
89
+ const obj: VariantSetReturn = {};
90
+
91
+ if (current) obj.remove = current;
92
+ if (cls) {
93
+ obj.add = cls;
94
+ this.inner.set(variant, cls);
95
+ } else {
96
+ this.inner.delete(variant);
97
+ }
98
+
99
+ return obj;
100
+ }
101
+
102
+ entries(): Iterable<[string, string]> {
103
+ return this.inner.entries();
104
+ }
105
+ }
106
+
107
+ // separate function for tree shaking
108
+ export function ssrCacheToVariants(ssrCache: SsrCache): Variants {
109
+ return new Variants(ssrCache.get('BODY_CLASS_VAR')!);
110
+ }
111
+
112
+ // separate function for tree shaking
113
+ export function variantsToSsrCache(
114
+ variants: Variants,
115
+ ssrCache: SsrCache,
116
+ ): void {
117
+ ssrCache.set('BODY_CLASS_VAR', Array.from(variants.entries()));
118
+ }
package/src/crelte.ts CHANGED
@@ -292,6 +292,9 @@ export function newCrelte({
292
292
  cookies,
293
293
  bodyClass,
294
294
 
295
+ // when adding a new helper function make sure to add it to
296
+ // onNewCrelteRequest if needed
297
+
295
298
  getPlugin: name => plugins.get(name),
296
299
  getEnv: key => ssrCache.get(key as any) as any,
297
300
  frontendUrl: path => urlWithPath(ssrCache.get('FRONTEND_URL')!, path),
@@ -88,7 +88,7 @@ export async function main(data: MainData) {
88
88
  router: new Router(router),
89
89
  queries,
90
90
  cookies: new Cookies(new ClientCookies()),
91
- bodyClass: new BodyClass(new ClientBodyClass()),
91
+ bodyClass: new BodyClass(ClientBodyClass.fromSsrCache(ssrCache)),
92
92
  });
93
93
 
94
94
  const app = new InternalApp(data.app);
@@ -152,6 +152,7 @@ export async function main(data: MainData): Promise<RenderResponse> {
152
152
  context,
153
153
  });
154
154
 
155
+ bodyClass.z_populateSsrCache(ssrCache);
155
156
  head += ssrComponents.toHead(data.serverData.ssrManifest);
156
157
  head += crelte.ssrCache.z_exportToHead();
157
158
 
@@ -74,6 +74,9 @@ export function onNewCrelteRequest(
74
74
  cookies: crelte.cookies.z_toRequest(),
75
75
  bodyClass: crelte.bodyClass.z_toRequest(),
76
76
  };
77
+ // make sure helper funcitons link to the correct instances
78
+ nCrelte.getPlugin = name => nCrelte.plugins.get(name);
79
+ nCrelte.getGlobalStore = name => nCrelte.globals.getStore(name);
77
80
  return crelteToRequest(nCrelte, req);
78
81
  }
79
82
 
@@ -1,5 +1,5 @@
1
1
  import { CrelteRequest } from '../index.js';
2
- import { Query } from '../queries/Queries.js';
2
+ import { Query, QueryOptions } from '../queries/Queries.js';
3
3
 
4
4
  export type Entry = {
5
5
  sectionHandle: string;
@@ -31,12 +31,22 @@ export function entryQueryVars(cr: CrelteRequest): EntryQueryVars {
31
31
  };
32
32
  }
33
33
 
34
+ /**
35
+ * ## Example
36
+ * `App.svelte`
37
+ * ```ts
38
+ * import entryQuery from '@/queries/entry.graphql';
39
+ *
40
+ * export const loadEntry => cr => queryEntry(cr, entryQuery, entryQueryVars(cr));
41
+ * ```
42
+ */
34
43
  export async function queryEntry(
35
44
  cr: CrelteRequest,
36
45
  entryQuery: Query,
37
46
  vars: EntryQueryVars,
47
+ opts?: QueryOptions,
38
48
  ): Promise<Entry> {
39
- const page = await cr.query(entryQuery, vars);
49
+ const page = await cr.query(entryQuery, vars, opts);
40
50
  return extractEntry(page) ?? ENTRY_ERROR_404;
41
51
  }
42
52
 
@@ -81,7 +81,11 @@ export type TransformFn<
81
81
  export type Transform<
82
82
  T extends Record<string, QueryVar<any>> = Record<string, QueryVar<any>>,
83
83
  F extends TransformFn<T> = TransformFn<T>,
84
- > = (response: any, vars: InferVariableTypes<T>) => Awaited<ReturnType<F>>;
84
+ > = (
85
+ response: any,
86
+ vars: InferVariableTypes<T>,
87
+ csr: CrelteServerRequest,
88
+ ) => Awaited<ReturnType<F>>;
85
89
 
86
90
  /** use {@link Handle} */
87
91
  export type HandleFn<
@@ -97,10 +97,11 @@ export default class QueryGqlRoute {
97
97
  private async transform(
98
98
  jsonResp: Record<string, any>,
99
99
  vars: Record<string, any>,
100
+ csr: CrelteServerRequest,
100
101
  ): Promise<void> {
101
102
  if (!this.transformFn || !jsonResp.data) return;
102
103
 
103
- const transformed = await this.transformFn(jsonResp.data, vars);
104
+ const transformed = await this.transformFn(jsonResp.data, vars, csr);
104
105
  if (typeof transformed !== 'undefined') jsonResp.data = transformed;
105
106
  }
106
107
 
@@ -195,7 +196,7 @@ export default class QueryGqlRoute {
195
196
  jsonResp = await resp.json();
196
197
  if (!jsonResp || typeof jsonResp !== 'object')
197
198
  throw new Error('invalid json response');
198
- await this.transform(jsonResp, vars);
199
+ await this.transform(jsonResp, vars, csr);
199
200
  } catch (e) {
200
201
  return newError(e, 500);
201
202
  }
@@ -11,6 +11,7 @@ export type CacheIfFn = (response: any, vars: Record<string, any>) => boolean;
11
11
  export type TransformFn = (
12
12
  response: any,
13
13
  vars: Record<string, any>,
14
+ csr: CrelteServerRequest,
14
15
  ) => void | any | Promise<void | any>;
15
16
 
16
17
  export type HandleFn = (