ember-primitives 0.35.0 → 0.36.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.
@@ -0,0 +1,37 @@
1
+ import type { ComponentLike } from "@glint/template";
2
+ interface LoadSignature<Expected = {
3
+ Args: any;
4
+ }> {
5
+ Blocks: {
6
+ loading: [];
7
+ error: [
8
+ {
9
+ original: unknown;
10
+ reason: string;
11
+ }
12
+ ];
13
+ success?: [component: ComponentLike<Expected>];
14
+ };
15
+ }
16
+ /**
17
+ * Loads a value / promise / function providing state for the lifetime of that value / promise / function.
18
+ *
19
+ * Can be used for manual bundle splitting via await importing components.
20
+ *
21
+ * @example
22
+ * ```gjs
23
+ * import { load } from 'ember-primitives/load';
24
+ *
25
+ * const Loader = load(() => import('./routes/sub-route'));
26
+ *
27
+ * <template>
28
+ * <Loader>
29
+ * <:loading> ... loading ... </:loading>
30
+ * <:error as |error|> ... error! {{error.reason}} </:error>
31
+ * <:success as |component|> <component /> </:success>
32
+ * </Loader>
33
+ * </template>
34
+ * ```
35
+ */
36
+ export declare function load<ExpectedSignature, Value>(fn: Value | Promise<Value> | (() => Promise<Value>) | (() => Value)): ComponentLike<LoadSignature<ExpectedSignature>>;
37
+ export {};
package/dist/load.js ADDED
@@ -0,0 +1,42 @@
1
+ import { setComponentTemplate } from '@ember/component';
2
+ import templateOnly from '@ember/component/template-only';
3
+ import { precompileTemplate } from '@ember/template-compilation';
4
+ import { getPromiseState } from 'reactiveweb/get-promise-state';
5
+
6
+ /**
7
+ * Loads a value / promise / function providing state for the lifetime of that value / promise / function.
8
+ *
9
+ * Can be used for manual bundle splitting via await importing components.
10
+ *
11
+ * @example
12
+ * ```gjs
13
+ * import { load } from 'ember-primitives/load';
14
+ *
15
+ * const Loader = load(() => import('./routes/sub-route.gts'));
16
+ *
17
+ * <template>
18
+ * <Loader>
19
+ * <:loading> ... loading ... </:loading>
20
+ * <:error as |error|> ... error! {{error.reason}} </:error>
21
+ * <:success as |component|> <component /> </:success>
22
+ * </Loader>
23
+ * </template>
24
+ * ```
25
+ */
26
+ function load(fn) {
27
+ return setComponentTemplate(precompileTemplate("{{#let (getPromiseState fn) as |state|}}\n {{#if state.isLoading}}\n {{yield to=\"loading\"}}\n {{else if state.error}}\n {{yield state.error to=\"error\"}}\n {{else if state.resolved}}\n {{#if (has-block \"success\")}}\n {{yield state.resolved to=\"success\"}}\n {{else}}\n <state.component />\n {{/if}}\n {{/if}}\n{{/let}}", {
28
+ strictMode: true,
29
+ /**
30
+ * The old setComponentTemplate + precompileTemplate combo
31
+ * does not allow defining things in this scope object,
32
+ * we _have_ to use the shorthand.
33
+ */
34
+ scope: () => ({
35
+ fn,
36
+ getPromiseState
37
+ })
38
+ }), templateOnly());
39
+ }
40
+
41
+ export { load };
42
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sources":["../src/load.gts"],"sourcesContent":["import { setComponentTemplate } from \"@ember/component\";\nimport templateOnly from \"@ember/component/template-only\";\n// Have to use these until min ember version is like 6.3 or something\nimport { precompileTemplate } from \"@ember/template-compilation\";\n\nimport { getPromiseState } from \"reactiveweb/get-promise-state\";\n\nimport type { ComponentLike } from \"@glint/template\";\n\ninterface LoadSignature<\n Expected = {\n Args: any;\n },\n> {\n Blocks: {\n loading: [];\n error: [\n {\n original: unknown;\n reason: string;\n },\n ];\n success?: [component: ComponentLike<Expected>];\n };\n}\n\n/**\n * Loads a value / promise / function providing state for the lifetime of that value / promise / function.\n *\n * Can be used for manual bundle splitting via await importing components.\n *\n * @example\n * ```gjs\n * import { load } from 'ember-primitives/load';\n *\n * const Loader = load(() => import('./routes/sub-route.gts'));\n *\n * <template>\n * <Loader>\n * <:loading> ... loading ... </:loading>\n * <:error as |error|> ... error! {{error.reason}} </:error>\n * <:success as |component|> <component /> </:success>\n * </Loader>\n * </template>\n * ```\n */\nexport function load<ExpectedSignature, Value>(\n fn: Value | Promise<Value> | (() => Promise<Value>) | (() => Value),\n): ComponentLike<LoadSignature<ExpectedSignature>> {\n return setComponentTemplate(\n precompileTemplate(\n `{{#let (getPromiseState fn) as |state|}}\n {{#if state.isLoading}}\n {{yield to=\"loading\"}}\n {{else if state.error}}\n {{yield state.error to=\"error\"}}\n {{else if state.resolved}}\n {{#if (has-block \"success\")}}\n {{yield state.resolved to=\"success\"}}\n {{else}}\n <state.component />\n {{/if}}\n {{/if}}\n{{/let}}`,\n {\n strictMode: true,\n /**\n * The old setComponentTemplate + precompileTemplate combo\n * does not allow defining things in this scope object,\n * we _have_ to use the shorthand.\n */\n scope: () => ({ fn, getPromiseState }),\n },\n ),\n templateOnly(),\n ) as ComponentLike<LoadSignature<ExpectedSignature>>;\n}\n"],"names":["load","fn","setComponentTemplate","precompileTemplate","strictMode","scope","getPromiseState","templateOnly"],"mappings":";;;;;AA0BA;;;;;;;;;;;;;;;;;;;AAmBC;AACM,SAASA,IAAAA,CACdC,EAAmE,EACtC;EAC7B,OAAOC,oBAAA,CACLC,wXAcE;AACEC,IAAAA,UAAA,EAAY,IAAA;AACZ;;;;;AAKAC,IAAAA,KAAA,EAAAA,OAAA;MAAAJ,EAAA;AAAAK,MAAAA;AAAA,KAAA;AACF,GAAA,CAAA,EAEFC,YAAA,EAAA,CAAA;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-primitives",
3
- "version": "0.35.0",
3
+ "version": "0.36.0",
4
4
  "description": "Making apps easier to build",
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -24,7 +24,7 @@
24
24
  "decorator-transforms": "^2.3.0",
25
25
  "ember-element-helper": "^0.8.8",
26
26
  "form-data-utils": "^0.6.0",
27
- "reactiveweb": "^1.4.2",
27
+ "reactiveweb": "^1.8.0",
28
28
  "should-handle-link": "^1.2.2",
29
29
  "tabster": "^8.5.5",
30
30
  "tracked-built-ins": "^4.0.0",