ember-source 7.2.0-beta.1 → 7.3.0-alpha.2

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 (144) hide show
  1. package/build-metadata.json +3 -3
  2. package/dist/dev/packages/@ember/-internals/deprecations/index.js +10 -0
  3. package/dist/dev/packages/@ember/-internals/glimmer/index.js +7 -7
  4. package/dist/dev/packages/@ember/-internals/metal/index.js +8 -8
  5. package/dist/dev/packages/@ember/-internals/routing/index.js +1 -1
  6. package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +3 -3
  7. package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/comparable.js +5 -0
  8. package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +1 -1
  9. package/dist/dev/packages/@ember/-internals/views/lib/system/event_dispatcher.js +1 -1
  10. package/dist/dev/packages/@ember/-internals/views/lib/views/core_view.js +1 -1
  11. package/dist/dev/packages/@ember/application/index.js +2 -2
  12. package/dist/dev/packages/@ember/application/instance.js +22 -2
  13. package/dist/dev/packages/@ember/array/index.js +3 -3
  14. package/dist/dev/packages/@ember/array/proxy.js +3 -3
  15. package/dist/dev/packages/@ember/component/helper.js +321 -1
  16. package/dist/dev/packages/@ember/component/index.js +3 -3
  17. package/dist/dev/packages/@ember/controller/index.js +2 -2
  18. package/dist/dev/packages/@ember/engine/index.js +3 -3
  19. package/dist/dev/packages/@ember/object/computed.js +2 -2
  20. package/dist/dev/packages/@ember/object/core.js +2 -2
  21. package/dist/dev/packages/@ember/object/index.js +4 -4
  22. package/dist/dev/packages/@ember/object/lib/computed/computed_macros.js +3 -3
  23. package/dist/dev/packages/@ember/object/lib/computed/reduce_computed_macros.js +1 -1
  24. package/dist/dev/packages/@ember/object/mixin.js +1 -1
  25. package/dist/dev/packages/@ember/object/observable.js +3 -3
  26. package/dist/dev/packages/@ember/object/promise-proxy-mixin.js +2 -2
  27. package/dist/dev/packages/@ember/renderer/index.js +1 -1
  28. package/dist/dev/packages/@ember/routing/-internals.js +1 -1
  29. package/dist/dev/packages/@ember/routing/lib/routing-service.js +0 -1
  30. package/dist/dev/packages/@ember/routing/lib/utils.js +1 -1
  31. package/dist/dev/packages/@ember/routing/route.js +4 -4
  32. package/dist/dev/packages/@ember/routing/router-service.js +0 -1
  33. package/dist/dev/packages/@ember/routing/router.js +3 -3
  34. package/dist/dev/packages/@ember/service/index.js +1 -1
  35. package/dist/dev/packages/@ember/utils/lib/compare.js +5 -2
  36. package/dist/dev/packages/@glimmer/node/index.js +2 -2
  37. package/dist/dev/packages/@glimmer/runtime/index.js +3 -3
  38. package/dist/dev/packages/@glimmer/tracking/index.js +1 -1
  39. package/dist/dev/packages/@glimmer/validator/index.js +1 -1
  40. package/dist/dev/packages/ember/version.js +1 -1
  41. package/dist/dev/packages/router_js/index.js +2 -2
  42. package/dist/dev/packages/shared-chunks/{alias-DpqL1qx6.js → alias-CT_thCad.js} +2 -2
  43. package/dist/dev/packages/shared-chunks/{api-C0PAtEgQ.js → api-Dz70AUL_.js} +6 -4
  44. package/dist/dev/packages/shared-chunks/{array-CVEnNWng.js → array-DvaweI_T.js} +1 -1
  45. package/dist/dev/packages/shared-chunks/{computed-BPCtuOxQ.js → computed-DGxbeUbf.js} +1 -6
  46. package/dist/dev/packages/shared-chunks/{curly-Ei5G8jhk.js → curly-DGUCLOud.js} +4 -5
  47. package/dist/dev/packages/shared-chunks/curly-brand-B_F79Dep.js +12 -0
  48. package/dist/dev/packages/shared-chunks/helper-brand-C9_8vvOf.js +12 -0
  49. package/dist/dev/packages/shared-chunks/{index-B3pPx1fL.js → index-D1AjYv31.js} +618 -1575
  50. package/dist/dev/packages/shared-chunks/{injected_property-CbBLr5jt.js → injected_property-DbXd6Gax.js} +1 -1
  51. package/dist/dev/packages/shared-chunks/outlet-CHFL7tun.js +135 -0
  52. package/dist/dev/packages/shared-chunks/{property_set-qCUylPEK.js → property_set-CVlVgdor.js} +1 -1
  53. package/dist/dev/packages/shared-chunks/{rehydrate-builder-C6k1XhET.js → rehydrate-builder-CsnkZkur.js} +1 -1
  54. package/dist/dev/packages/shared-chunks/{render-87_sKZ_k.js → render-CtH73XOv.js} +10 -5
  55. package/dist/dev/packages/shared-chunks/{serialize-builder-BlxBjwO-.js → serialize-builder-D1oAeiyl.js} +1 -1
  56. package/dist/dev/packages/shared-chunks/{set_properties-C4TSebH6.js → set_properties-CEUT_EJn.js} +2 -2
  57. package/dist/dev/packages/shared-chunks/setup-registry-DQ3c4Juo.js +951 -0
  58. package/dist/dev/packages/shared-chunks/{textarea-C4lYkaHj.js → textarea-DEvw4ezm.js} +1 -1
  59. package/dist/dev/packages/shared-chunks/tracked-57EW14Ny.js +253 -0
  60. package/dist/dev/packages/shared-chunks/tracked-value-DhyJmrhG.js +115 -0
  61. package/dist/dev/packages/shared-chunks/{unrecognized-url-error-BJHjL30Q.js → unrecognized-url-error-B8loxkay.js} +1 -1
  62. package/dist/prod/packages/@ember/-internals/deprecations/index.js +10 -0
  63. package/dist/prod/packages/@ember/-internals/glimmer/index.js +7 -7
  64. package/dist/prod/packages/@ember/-internals/metal/index.js +8 -8
  65. package/dist/prod/packages/@ember/-internals/routing/index.js +1 -1
  66. package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +3 -3
  67. package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/comparable.js +5 -0
  68. package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +1 -1
  69. package/dist/prod/packages/@ember/-internals/views/lib/system/event_dispatcher.js +1 -1
  70. package/dist/prod/packages/@ember/-internals/views/lib/views/core_view.js +1 -1
  71. package/dist/prod/packages/@ember/application/index.js +2 -2
  72. package/dist/prod/packages/@ember/application/instance.js +18 -3
  73. package/dist/prod/packages/@ember/array/index.js +3 -3
  74. package/dist/prod/packages/@ember/array/proxy.js +3 -3
  75. package/dist/prod/packages/@ember/component/helper.js +305 -1
  76. package/dist/prod/packages/@ember/component/index.js +3 -3
  77. package/dist/prod/packages/@ember/controller/index.js +2 -2
  78. package/dist/prod/packages/@ember/engine/index.js +3 -3
  79. package/dist/prod/packages/@ember/object/computed.js +2 -2
  80. package/dist/prod/packages/@ember/object/index.js +4 -4
  81. package/dist/prod/packages/@ember/object/lib/computed/computed_macros.js +3 -3
  82. package/dist/prod/packages/@ember/object/lib/computed/reduce_computed_macros.js +1 -1
  83. package/dist/prod/packages/@ember/object/mixin.js +1 -1
  84. package/dist/prod/packages/@ember/object/observable.js +3 -3
  85. package/dist/prod/packages/@ember/object/promise-proxy-mixin.js +2 -2
  86. package/dist/prod/packages/@ember/renderer/index.js +1 -1
  87. package/dist/prod/packages/@ember/routing/lib/routing-service.js +0 -1
  88. package/dist/prod/packages/@ember/routing/lib/utils.js +1 -1
  89. package/dist/prod/packages/@ember/routing/route.js +4 -4
  90. package/dist/prod/packages/@ember/routing/router-service.js +0 -1
  91. package/dist/prod/packages/@ember/routing/router.js +3 -3
  92. package/dist/prod/packages/@ember/service/index.js +1 -1
  93. package/dist/prod/packages/@ember/utils/lib/compare.js +5 -2
  94. package/dist/prod/packages/@glimmer/node/index.js +2 -2
  95. package/dist/prod/packages/@glimmer/runtime/index.js +3 -3
  96. package/dist/prod/packages/@glimmer/tracking/index.js +1 -1
  97. package/dist/prod/packages/@glimmer/validator/index.js +1 -1
  98. package/dist/prod/packages/ember/version.js +1 -1
  99. package/dist/prod/packages/router_js/index.js +2 -2
  100. package/dist/prod/packages/shared-chunks/{alias-Bod6qdNp.js → alias-CHHuE0LE.js} +2 -2
  101. package/dist/prod/packages/shared-chunks/{api-CQexacBn.js → api-DzOa0Acr.js} +6 -4
  102. package/dist/prod/packages/shared-chunks/{array-BzReKMeW.js → array-CnXdmzOG.js} +1 -1
  103. package/dist/prod/packages/shared-chunks/{computed-DtIStxvq.js → computed-BNdMwGhH.js} +1 -6
  104. package/dist/prod/packages/shared-chunks/{curly-IY06zACp.js → curly-a6DP7r87.js} +4 -5
  105. package/dist/prod/packages/shared-chunks/curly-brand-B_F79Dep.js +12 -0
  106. package/dist/prod/packages/shared-chunks/helper-brand-C9_8vvOf.js +12 -0
  107. package/dist/prod/packages/shared-chunks/{index-CslMfEpb.js → index-CvQQ6l11.js} +548 -1451
  108. package/dist/prod/packages/shared-chunks/{injected_property-Y-FadDej.js → injected_property-DqQ0XV7k.js} +1 -1
  109. package/dist/prod/packages/shared-chunks/outlet--lIm3q7t.js +132 -0
  110. package/dist/prod/packages/shared-chunks/{property_set-BaQJdVfS.js → property_set-CkLe4ht8.js} +1 -1
  111. package/dist/prod/packages/shared-chunks/{rehydrate-builder-Blt1x9MP.js → rehydrate-builder-n_8RCUj9.js} +1 -1
  112. package/dist/prod/packages/shared-chunks/{render-Dx7lr1hR.js → render-Bf7GviCY.js} +10 -5
  113. package/dist/prod/packages/shared-chunks/{serialize-builder-BvAXYHTr.js → serialize-builder-CsG9WHVw.js} +1 -1
  114. package/dist/prod/packages/shared-chunks/{set_properties-Qxhw4qzw.js → set_properties-Cs3rVemD.js} +2 -2
  115. package/dist/prod/packages/shared-chunks/setup-registry-kOGgOucf.js +886 -0
  116. package/dist/prod/packages/shared-chunks/{textarea-DOmZ1x0E.js → textarea-DMmdvgk2.js} +1 -1
  117. package/dist/prod/packages/shared-chunks/tracked-DvOpYI0o.js +235 -0
  118. package/dist/prod/packages/shared-chunks/tracked-value-CR6kx-73.js +115 -0
  119. package/dist/prod/packages/shared-chunks/{unrecognized-url-error-EgNrnFu_.js → unrecognized-url-error-jjQ-FqKB.js} +1 -1
  120. package/docs/data.json +426 -222
  121. package/package.json +6 -6
  122. package/types/stable/@ember/-internals/deprecations/index.d.ts +6 -0
  123. package/types/stable/@ember/-internals/glimmer/lib/base-renderer.d.ts +150 -0
  124. package/types/stable/@ember/-internals/glimmer/lib/component-managers/curly-brand.d.ts +10 -0
  125. package/types/stable/@ember/-internals/glimmer/lib/component-managers/curly.d.ts +3 -2
  126. package/types/stable/@ember/-internals/glimmer/lib/glimmer-tracking-docs.d.ts +68 -0
  127. package/types/stable/@ember/-internals/glimmer/lib/helper-brand.d.ts +10 -0
  128. package/types/stable/@ember/-internals/glimmer/lib/helper.d.ts +4 -6
  129. package/types/stable/@ember/-internals/glimmer/lib/renderer.d.ts +7 -154
  130. package/types/stable/@ember/-internals/glimmer/lib/router-resolver.d.ts +17 -0
  131. package/types/stable/@ember/-internals/metal/lib/tracked.d.ts +53 -6
  132. package/types/stable/@ember/renderer/index.d.ts +2 -2
  133. package/types/stable/@glimmer/tracking/index.d.ts +70 -1
  134. package/types/stable/@glimmer/validator/index.d.ts +1 -0
  135. package/types/stable/@glimmer/validator/lib/tracked-value.d.ts +58 -0
  136. package/types/stable/index.d.ts +591 -586
  137. package/dist/dev/packages/shared-chunks/helper-DIj85_-f.js +0 -326
  138. package/dist/dev/packages/shared-chunks/setup-registry-9DCmHTFF.js +0 -77
  139. package/dist/dev/packages/shared-chunks/tracked-DEyf0T_X.js +0 -148
  140. package/dist/dev/packages/shared-chunks/tracked-data-DgqqRdYO.js +0 -31
  141. package/dist/prod/packages/shared-chunks/helper-DkXiTBjc.js +0 -310
  142. package/dist/prod/packages/shared-chunks/setup-registry-U-6VaNQG.js +0 -74
  143. package/dist/prod/packages/shared-chunks/tracked-B9380JtC.js +0 -132
  144. package/dist/prod/packages/shared-chunks/tracked-data-CHq42QHb.js +0 -31
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-source",
3
- "version": "7.2.0-beta.1",
3
+ "version": "7.3.0-alpha.2",
4
4
  "description": "A JavaScript framework for creating ambitious web applications",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -92,7 +92,7 @@
92
92
  "@embroider/vite": "^1.7.2",
93
93
  "@eslint/js": "^9.21.0",
94
94
  "@glimmer/component": "workspace:*",
95
- "@octokit/rest": "^20.1.2",
95
+ "@octokit/rest": "^22.0.0",
96
96
  "@rollup/plugin-babel": "^6.0.4",
97
97
  "@simple-dom/document": "^1.4.0",
98
98
  "@swc-node/register": "^1.6.8",
@@ -123,8 +123,8 @@
123
123
  "expect-type": "^0.15.0",
124
124
  "fs-extra": "^11.1.1",
125
125
  "git-repo-info": "^2.1.1",
126
- "glob": "^8.0.3",
127
- "globals": "^16.0.0",
126
+ "glob": "^13.0.0",
127
+ "globals": "^17.0.0",
128
128
  "kill-port-process": "^3.2.1",
129
129
  "mitata": "^1.0.34",
130
130
  "mocha": "^11.0.0",
@@ -367,9 +367,9 @@
367
367
  }
368
368
  },
369
369
  "packageManager": "pnpm@10.33.2",
370
- "_originalVersion": "7.2.0-beta.1",
370
+ "_originalVersion": "7.3.0-alpha.1",
371
371
  "_versionPreviouslyCalculated": true,
372
372
  "publishConfig": {
373
- "tag": "beta"
373
+ "tag": "alpha"
374
374
  }
375
375
  }
@@ -21,6 +21,12 @@ declare module '@ember/-internals/deprecations' {
21
21
  isEnabled: boolean;
22
22
  isRemoved: boolean;
23
23
  };
24
+ DEPRECATE_COMPARABLE_MIXIN: {
25
+ options: DeprecationOptions;
26
+ test: boolean;
27
+ isEnabled: boolean;
28
+ isRemoved: boolean;
29
+ };
24
30
  };
25
31
  export function deprecateUntil(message: string, deprecation: DeprecationObject): void;
26
32
  export {};
@@ -0,0 +1,150 @@
1
+ declare module '@ember/-internals/glimmer/lib/base-renderer' {
2
+ import type { Cursor, DebugRenderTree, Environment, RenderResult as GlimmerRenderResult, EvaluationContext, TreeBuilder, ClassicResolver } from "@glimmer/interfaces";
3
+ import type { SimpleDocument, SimpleElement } from "@simple-dom/interface";
4
+ export type IBuilder = (env: Environment, cursor: Cursor) => TreeBuilder;
5
+ export function errorLoopTransaction(fn: () => void): () => void;
6
+ /**
7
+ * The interface the `RendererState` needs from a render root. The base
8
+ * renderer only ever creates `ComponentRootState`s; the classic renderer
9
+ * (`./renderer`) adds `ClassicRootState` for outlet/classic-component roots.
10
+ */
11
+ export interface RendererRoot {
12
+ readonly type: string;
13
+ readonly result: GlimmerRenderResult | undefined;
14
+ readonly destroyed: boolean;
15
+ render(): void;
16
+ destroy(): void;
17
+ isFor(possibleRoot: unknown): boolean;
18
+ }
19
+ export class ComponentRootState implements RendererRoot {
20
+ #private;
21
+ readonly type = "component";
22
+ constructor(state: RendererState, definition: object, options: {
23
+ into: Cursor;
24
+ args?: Record<string, unknown>;
25
+ });
26
+ isFor(_possibleRoot: unknown): boolean;
27
+ render(): void;
28
+ destroy(): void;
29
+ get destroyed(): boolean;
30
+ get result(): GlimmerRenderResult | undefined;
31
+ }
32
+ export function _resetRenderers(): void;
33
+ export function renderSettled(): Promise<void>;
34
+ type Resolver = ClassicResolver;
35
+ interface RendererData {
36
+ owner: object;
37
+ context: EvaluationContext;
38
+ builder: IBuilder;
39
+ }
40
+ export class RendererState {
41
+ #private;
42
+ static create(data: RendererData, renderer: BaseRenderer): RendererState;
43
+ private constructor();
44
+ get debug(): {
45
+ roots: RendererRoot[];
46
+ inRenderTransaction: boolean;
47
+ isInteractive: boolean;
48
+ };
49
+ get roots(): RendererRoot[];
50
+ get owner(): object;
51
+ get builder(): IBuilder;
52
+ get context(): EvaluationContext;
53
+ get env(): Environment;
54
+ get isInteractive(): boolean;
55
+ renderRoot(root: RendererRoot, renderer: BaseRenderer): RendererRoot;
56
+ renderRoots(renderer: BaseRenderer): void;
57
+ scheduleRevalidate(renderer: BaseRenderer): void;
58
+ isValid(): boolean;
59
+ revalidate(renderer: BaseRenderer): void;
60
+ clearAllRoots(renderer: BaseRenderer): void;
61
+ }
62
+ type IntoTarget = Cursor | Element | SimpleElement;
63
+ /**
64
+ * The returned object from `renderComponent`
65
+ * @public
66
+ * @module @ember/renderer
67
+ */
68
+ export interface RenderResult {
69
+ /**
70
+ * Destroys the render tree and removes all rendered content from the element rendered into
71
+ */
72
+ destroy(): void;
73
+ }
74
+ /**
75
+ * Render a component into a DOM element.
76
+ *
77
+ * @method renderComponent
78
+ * @static
79
+ * @for @ember/renderer
80
+ * @param {Object} component The component to render.
81
+ * @param {Object} options
82
+ * @param {Element} options.into Where to render the component in to.
83
+ * @param {Object} [options.owner] Optionally specify the owner to use. This will be used for injections, and overall cleanup.
84
+ * @param {Object} [options.env] Optional renderer configuration
85
+ * @param {Object} [options.args] Optionally pass args in to the component. These may be reactive as long as it is an object or object-like
86
+ * @public
87
+ */
88
+ export function renderComponent(
89
+ /**
90
+ * The component definition to render.
91
+ *
92
+ * Any component that has had its manager registered is valid.
93
+ * For the component-types that ship with ember, manager registration
94
+ * does not need to be worried about.
95
+ */
96
+ component: object,
97
+ { owner, env, into, args, }: {
98
+ /**
99
+ * The element to render the component in to.
100
+ */
101
+ into: IntoTarget;
102
+ /**
103
+ * Optional owner. Defaults to `{}`, can be any object, but will need to implement the [Owner](https://api.emberjs.com/ember/release/classes/Owner) API for components within this render tree to access services.
104
+ */
105
+ owner?: object;
106
+ /**
107
+ * Optionally configure the rendering environment
108
+ */
109
+ env?: {
110
+ /**
111
+ * When false, modifiers will not run.
112
+ */
113
+ isInteractive?: boolean;
114
+ /**
115
+ * All other options are forwarded to the underlying renderer.
116
+ * (its API is currently private and out of scope for this RFC,
117
+ * so passing additional things here is also considered private API)
118
+ */
119
+ [rendererOption: string]: unknown;
120
+ };
121
+ /**
122
+ * These args get passed to the rendered component
123
+ *
124
+ * If your args are reactive, re-rendering will happen automatically.
125
+ *
126
+ */
127
+ args?: Record<string, unknown>;
128
+ }
129
+ ): RenderResult;
130
+ export class BaseRenderer {
131
+ static strict(owner: object, document: SimpleDocument | Document, options: {
132
+ isInteractive: boolean;
133
+ hasDOM?: boolean;
134
+ }): BaseRenderer;
135
+ readonly state: RendererState;
136
+ constructor(owner: object, envOptions: {
137
+ isInteractive: boolean;
138
+ hasDOM: boolean;
139
+ }, document: SimpleDocument, resolver: Resolver, builder: IBuilder);
140
+ get debugRenderTree(): DebugRenderTree;
141
+ isValid(): boolean;
142
+ destroy(): void;
143
+ render(component: object, options: {
144
+ into: IntoTarget;
145
+ args?: Record<string, unknown>;
146
+ }): RendererRoot;
147
+ rerender(): void;
148
+ }
149
+ export {};
150
+ }
@@ -0,0 +1,10 @@
1
+ declare module '@ember/-internals/glimmer/lib/component-managers/curly-brand' {
2
+ /**
3
+ * The brand for the curly component manager lives in its own module so that
4
+ * code which only needs to *detect* the curly manager (e.g. the resolver)
5
+ * does not have to import the manager itself (and with it the classic
6
+ * component machinery).
7
+ */
8
+ export const CURLY_MANAGER_BRAND: unique symbol;
9
+ export function isCurlyManager(manager: object): boolean;
10
+ }
@@ -7,6 +7,7 @@ declare module '@ember/-internals/glimmer/lib/component-managers/curly' {
7
7
  import type { DynamicScope } from "@ember/-internals/glimmer/lib/renderer";
8
8
  import type RuntimeResolver from "@ember/-internals/glimmer/lib/resolver";
9
9
  import ComponentStateBucket from "@ember/-internals/glimmer/lib/utils/curly-component-state-bucket";
10
+ import { CURLY_MANAGER_BRAND } from "@ember/-internals/glimmer/lib/component-managers/curly-brand";
10
11
  export function getComponentCapturedArgs(component: object): CapturedArguments["named"] | undefined;
11
12
  export const DIRTY_TAG: unique symbol;
12
13
  export const IS_DISPATCHING_ATTRS: unique symbol;
@@ -20,6 +21,7 @@ declare module '@ember/-internals/glimmer/lib/component-managers/curly' {
20
21
  positionalParams: string | string[] | undefined | null;
21
22
  };
22
23
  export default class CurlyComponentManager implements WithCreateInstance<ComponentStateBucket>, WithDynamicLayout<ComponentStateBucket, RuntimeResolver>, WithDynamicTagName<ComponentStateBucket> {
24
+ readonly [CURLY_MANAGER_BRAND] = true;
23
25
  protected templateFor(component: Component): CompilableProgram | null;
24
26
  getDynamicLayout(bucket: ComponentStateBucket): CompilableProgram | null;
25
27
  getTagName(state: ComponentStateBucket): Nullable<string>;
@@ -39,6 +41,5 @@ declare module '@ember/-internals/glimmer/lib/component-managers/curly' {
39
41
  export function processComponentInitializationAssertions(component: Component, props: any): void;
40
42
  export function initialRenderInstrumentDetails(component: any): any;
41
43
  export const CURLY_COMPONENT_MANAGER: CurlyComponentManager;
42
- export function isCurlyManager(manager: object): boolean;
43
- export {};
44
+ export { isCurlyManager } from "@ember/-internals/glimmer/lib/component-managers/curly-brand";
44
45
  }
@@ -149,6 +149,74 @@ declare module '@ember/-internals/glimmer/lib/glimmer-tracking-docs' {
149
149
  });
150
150
  ```
151
151
 
152
+ Calling `tracked` with an initial value creates a standalone reactive
153
+ value, usable outside of classes:
154
+
155
+ ```js
156
+ import { tracked } from '@glimmer/tracking';
157
+
158
+ const count = tracked(0);
159
+
160
+ count.value; // read the value, entangling with any tracking context
161
+ count.value = 1; // write the value, notifying consumers
162
+ count.get(); // function shorthand for reading
163
+ count.set(2); // function shorthand for writing
164
+ count.update((n) => n + 1); // write based on the current value, without entangling
165
+ count.freeze(); // prevent all future writes
166
+ ```
167
+
168
+ Reading `value` in a template (or in a getter used by a template) will
169
+ rerender just like a `@tracked` property:
170
+
171
+ ```gjs
172
+ import { tracked } from '@glimmer/tracking';
173
+ import { on } from '@ember/modifier';
174
+
175
+ const count = tracked(0);
176
+ const increment = () => count.value++;
177
+
178
+ <template>
179
+ Count is: {{count.value}}
180
+
181
+ <button {{on "click" increment}}>add one</button>
182
+ </template>
183
+ ```
184
+
185
+ This form accepts an options object containing an `equals` function, which
186
+ decides whether a written value should notify consumers (it defaults to
187
+ `Object.is`), and a `description` used for debugging:
188
+
189
+ ```js
190
+ const count = tracked(0, { equals: (a, b) => a === b });
191
+
192
+ count.value = 0; // does not notify consumers, the value did not change
193
+ ```
194
+
195
+ Note: when `tracked` is called with a single plain object whose keys are all
196
+ drawn from `value`, `initializer`, `equals`, and `description`, it is treated
197
+ as the configuration object for a decorator (or classic-class field), not as a
198
+ standalone value wrapping that object. To create a standalone reactive value
199
+ around such an object, pass it as an initial value and include a (possibly
200
+ empty) options argument: `tracked({ value: 5 }, {})`.
201
+
202
+ The `@tracked` decorator accepts the same options. By default, setting a
203
+ `@tracked` property always notifies consumers, even when setting the
204
+ property to the same value; passing `equals` opts in to equality-based
205
+ notification instead:
206
+
207
+ ```js
208
+ import { tracked } from '@glimmer/tracking';
209
+
210
+ class Counter {
211
+ @tracked({ equals: (a, b) => a === b }) count = 0;
212
+
213
+ noop = () => {
214
+ // does not notify consumers, the value did not change
215
+ this.count = this.count;
216
+ };
217
+ }
218
+ ```
219
+
152
220
  @method tracked
153
221
  @static
154
222
  @for @glimmer/tracking
@@ -0,0 +1,10 @@
1
+ declare module '@ember/-internals/glimmer/lib/helper-brand' {
2
+ /**
3
+ * The brand for classic (class-based) helpers lives in its own module so that
4
+ * code which only needs to *detect* classic helpers (e.g. the resolver) does
5
+ * not have to import the classic `Helper` base class (and with it the classic
6
+ * object model: `EmberObject`, `Mixin`, meta, etc.).
7
+ */
8
+ export const IS_CLASSIC_HELPER: unique symbol;
9
+ export function isClassicHelper(obj: object): boolean;
10
+ }
@@ -4,6 +4,8 @@ declare module '@ember/-internals/glimmer/lib/helper' {
4
4
  */
5
5
  import { FrameworkObject } from "@ember/object/-internals";
6
6
  import type { DirtyableTag } from "@glimmer/interfaces";
7
+ import { IS_CLASSIC_HELPER } from "@ember/-internals/glimmer/lib/helper-brand";
8
+ export { isClassicHelper } from "@ember/-internals/glimmer/lib/helper-brand";
7
9
  const RECOMPUTE_TAG: unique symbol;
8
10
  type GetOr<T, K, Else> = K extends keyof T ? T[K] : Else;
9
11
  type Args<S> = GetOr<S, "Args", {}>;
@@ -20,7 +22,6 @@ declare module '@ember/-internals/glimmer/lib/helper' {
20
22
  destroy(): void;
21
23
  [RECOMPUTE_TAG]: DirtyableTag;
22
24
  }
23
- const IS_CLASSIC_HELPER: unique symbol;
24
25
  export interface SimpleHelper<S> {
25
26
  compute: (positional: Positional<S>, named: Named<S>) => Return<S>;
26
27
  }
@@ -31,7 +32,7 @@ declare module '@ember/-internals/glimmer/lib/helper' {
31
32
 
32
33
  ```app/templates/application.gjs
33
34
  import Cost from '../components/cost';
34
-
35
+
35
36
  <template>
36
37
  <Cost @cents={{230}} />
37
38
  </template>
@@ -39,7 +40,7 @@ declare module '@ember/-internals/glimmer/lib/helper' {
39
40
 
40
41
  ```app/components/cost.gjs
41
42
  import formatCurrency from '../helpers/format-currency';
42
-
43
+
43
44
  <template>
44
45
  <div>{{formatCurrency @cents currency="$"}}</div>
45
46
  </template>
@@ -140,8 +141,6 @@ declare module '@ember/-internals/glimmer/lib/helper' {
140
141
  */
141
142
  recompute(): void;
142
143
  }
143
- export function isClassicHelper(obj: object): boolean;
144
- export const CLASSIC_HELPER_MANAGER: import("@glimmer/interfaces").Helper<object> | import("@glimmer/manager").CustomHelperManager<object>;
145
144
  /**
146
145
  * The type of a function-based helper.
147
146
  *
@@ -181,5 +180,4 @@ declare module '@ember/-internals/glimmer/lib/helper' {
181
180
  Return: R;
182
181
  }>;
183
182
  export function helper<S>(helperFn: (positional: Positional<S>, named: Named<S>) => Return<S>): FunctionBasedHelper<S>;
184
- export {};
185
183
  }
@@ -1,18 +1,19 @@
1
1
  declare module '@ember/-internals/glimmer/lib/renderer' {
2
2
  import type { InternalOwner } from "@ember/-internals/owner";
3
- import type { Bounds, Cursor, DebugRenderTree, Environment, DynamicScope as GlimmerDynamicScope, RenderResult as GlimmerRenderResult, Template, TemplateFactory, EvaluationContext, TreeBuilder, ClassicResolver } from "@glimmer/interfaces";
3
+ import type { Bounds, DynamicScope as GlimmerDynamicScope, TemplateFactory, EvaluationContext } from "@glimmer/interfaces";
4
4
  import type { Nullable } from "@ember/-internals/utility-types";
5
5
  import type { Reference } from "@glimmer/reference/lib/reference";
6
6
  import type { CurriedValue } from "@glimmer/runtime/lib/curried-value";
7
7
  import { clientBuilder } from "@glimmer/runtime/lib/vm/element-builder";
8
8
  import type { SimpleDocument, SimpleElement, SimpleNode } from "@simple-dom/interface";
9
- import type Component from "@ember/-internals/glimmer/lib/component";
10
9
  import type ClassicComponent from "@ember/-internals/glimmer/lib/component";
11
10
  import { BOUNDS } from "@ember/-internals/glimmer/lib/component-managers/curly";
12
- import ResolverImpl from "@ember/-internals/glimmer/lib/resolver";
11
+ import RouterResolver from "@ember/-internals/glimmer/lib/router-resolver";
13
12
  import type { OutletState } from "@ember/-internals/glimmer/lib/utils/outlet";
14
13
  import OutletView from "@ember/-internals/glimmer/lib/views/outlet";
15
- export type IBuilder = (env: Environment, cursor: Cursor) => TreeBuilder;
14
+ import type { RendererRoot } from "@ember/-internals/glimmer/lib/base-renderer";
15
+ import { BaseRenderer } from "@ember/-internals/glimmer/lib/base-renderer";
16
+ export { type IBuilder, type RendererRoot, type RenderResult, BaseRenderer, ComponentRootState, errorLoopTransaction, renderComponent, renderSettled, _resetRenderers, } from "@ember/-internals/glimmer/lib/base-renderer";
16
17
  export interface View {
17
18
  parentView: Nullable<View>;
18
19
  renderer: Renderer;
@@ -30,157 +31,10 @@ declare module '@ember/-internals/glimmer/lib/renderer' {
30
31
  get(key: "outletState"): Reference<OutletState | undefined>;
31
32
  set(key: "outletState", value: Reference<OutletState | undefined>): Reference<OutletState | undefined>;
32
33
  }
33
- type RootState = ClassicRootState | ComponentRootState;
34
- class ComponentRootState {
35
- #private;
36
- readonly type = "component";
37
- constructor(state: RendererState, definition: object, options: {
38
- into: Cursor;
39
- args?: Record<string, unknown>;
40
- });
41
- isFor(_component: ClassicComponent): boolean;
42
- render(): void;
43
- destroy(): void;
44
- get destroyed(): boolean;
45
- get result(): GlimmerRenderResult | undefined;
46
- }
47
- class ClassicRootState {
48
- root: Component | OutletView;
49
- readonly type = "classic";
50
- id: string;
51
- result: GlimmerRenderResult | undefined;
52
- destroyed: boolean;
53
- render: () => void;
54
- readonly env: Environment;
55
- constructor(root: Component | OutletView, context: EvaluationContext, owner: object, template: Template, self: Reference<unknown>, parentElement: SimpleElement, dynamicScope: DynamicScope, builder: IBuilder);
56
- isFor(possibleRoot: unknown): boolean;
57
- destroy(): void;
58
- }
59
- export function _resetRenderers(): void;
60
- export function renderSettled(): Promise<void>;
61
34
  interface ViewRegistry {
62
35
  [viewId: string]: unknown;
63
36
  }
64
- type Resolver = ClassicResolver;
65
- interface RendererData {
66
- owner: object;
67
- context: EvaluationContext;
68
- builder: IBuilder;
69
- }
70
- class RendererState {
71
- #private;
72
- static create(data: RendererData, renderer: BaseRenderer): RendererState;
73
- private constructor();
74
- get debug(): {
75
- roots: RootState[];
76
- inRenderTransaction: boolean;
77
- isInteractive: boolean;
78
- };
79
- get roots(): RootState[];
80
- get owner(): object;
81
- get builder(): IBuilder;
82
- get context(): EvaluationContext;
83
- get env(): Environment;
84
- get isInteractive(): boolean;
85
- renderRoot(root: RootState, renderer: BaseRenderer): RootState;
86
- renderRoots(renderer: BaseRenderer): void;
87
- scheduleRevalidate(renderer: BaseRenderer): void;
88
- isValid(): boolean;
89
- revalidate(renderer: BaseRenderer): void;
90
- clearAllRoots(renderer: BaseRenderer): void;
91
- }
92
- type IntoTarget = Cursor | Element | SimpleElement;
93
- /**
94
- * The returned object from `renderComponent`
95
- * @public
96
- * @module @ember/renderer
97
- */
98
- export interface RenderResult {
99
- /**
100
- * Destroys the render tree and removes all rendered content from the element rendered into
101
- */
102
- destroy(): void;
103
- }
104
- /**
105
- * Render a component into a DOM element.
106
- *
107
- * @method renderComponent
108
- * @static
109
- * @for @ember/renderer
110
- * @param {Object} component The component to render.
111
- * @param {Object} options
112
- * @param {Element} options.into Where to render the component in to.
113
- * @param {Object} [options.owner] Optionally specify the owner to use. This will be used for injections, and overall cleanup.
114
- * @param {Object} [options.env] Optional renderer configuration
115
- * @param {Object} [options.args] Optionally pass args in to the component. These may be reactive as long as it is an object or object-like
116
- * @public
117
- */
118
- export function renderComponent(
119
- /**
120
- * The component definition to render.
121
- *
122
- * Any component that has had its manager registered is valid.
123
- * For the component-types that ship with ember, manager registration
124
- * does not need to be worried about.
125
- */
126
- component: object,
127
- { owner, env, into, args, }: {
128
- /**
129
- * The element to render the component in to.
130
- */
131
- into: IntoTarget;
132
- /**
133
- * Optional owner. Defaults to `{}`, can be any object, but will need to implement the [Owner](https://api.emberjs.com/ember/release/classes/Owner) API for components within this render tree to access services.
134
- */
135
- owner?: object;
136
- /**
137
- * Optionally configure the rendering environment
138
- */
139
- env?: {
140
- /**
141
- * When false, modifiers will not run.
142
- */
143
- isInteractive?: boolean;
144
- /**
145
- * All other options are forwarded to the underlying renderer.
146
- * (its API is currently private and out of scope for this RFC,
147
- * so passing additional things here is also considered private API)
148
- */
149
- [rendererOption: string]: unknown;
150
- };
151
- /**
152
- * These args get passed to the rendered component
153
- *
154
- * If your args are reactive, re-rendering will happen automatically.
155
- *
156
- */
157
- args?: Record<string, unknown>;
158
- }
159
- ): RenderResult;
160
- class BaseRenderer {
161
- static strict(owner: object, document: SimpleDocument | Document, options: {
162
- isInteractive: boolean;
163
- hasDOM?: boolean;
164
- }): BaseRenderer;
165
- readonly state: RendererState;
166
- constructor(owner: object, envOptions: {
167
- isInteractive: boolean;
168
- hasDOM: boolean;
169
- }, document: SimpleDocument, resolver: Resolver, builder: IBuilder);
170
- get debugRenderTree(): DebugRenderTree;
171
- isValid(): boolean;
172
- destroy(): void;
173
- render(component: object, options: {
174
- into: IntoTarget;
175
- args?: Record<string, unknown>;
176
- }): RootState;
177
- rerender(): void;
178
- }
179
37
  export class Renderer extends BaseRenderer {
180
- static strict(owner: object, document: SimpleDocument | Document, options: {
181
- isInteractive: boolean;
182
- hasDOM?: boolean;
183
- }): BaseRenderer;
184
38
  private _rootTemplate;
185
39
  private _viewRegistry;
186
40
  static create(props: {
@@ -189,13 +43,13 @@ declare module '@ember/-internals/glimmer/lib/renderer' {
189
43
  constructor(owner: InternalOwner, document: SimpleDocument, env: {
190
44
  isInteractive: boolean;
191
45
  hasDOM: boolean;
192
- }, rootTemplate: TemplateFactory, viewRegistry: ViewRegistry, builder?: typeof clientBuilder, resolver?: ResolverImpl);
46
+ }, rootTemplate: TemplateFactory, viewRegistry: ViewRegistry, builder?: typeof clientBuilder, resolver?: RouterResolver);
193
47
  appendOutletView(view: OutletView, target: SimpleElement): void;
194
48
  appendTo(view: ClassicComponent, target: SimpleElement): void;
195
49
  _appendDefinition(root: OutletView | ClassicComponent, definition: CurriedValue, target: SimpleElement): void;
196
50
  cleanupRootFor(component: ClassicComponent): void;
197
51
  remove(view: ClassicComponent): void;
198
- get _roots(): RootState[];
52
+ get _roots(): RendererRoot[];
199
53
  get _inRenderTransaction(): boolean;
200
54
  get _isInteractive(): boolean;
201
55
  get _context(): EvaluationContext;
@@ -208,5 +62,4 @@ declare module '@ember/-internals/glimmer/lib/renderer' {
208
62
  lastNode: SimpleNode;
209
63
  };
210
64
  }
211
- export {};
212
65
  }
@@ -0,0 +1,17 @@
1
+ declare module '@ember/-internals/glimmer/lib/router-resolver' {
2
+ import type { HelperDefinitionState } from "@glimmer/interfaces";
3
+ import type { InternalOwner } from "@ember/-internals/owner";
4
+ import type { Nullable } from "@ember/-internals/utility-types";
5
+ import ResolverImpl from "@ember/-internals/glimmer/lib/resolver";
6
+ /**
7
+ * The resolver used by the classic application `Renderer`. It extends the
8
+ * shared `ResolverImpl` with the keywords that require the router and engine
9
+ * infrastructure (`{{outlet}}` and `{{mount}}`). Keeping these out of the
10
+ * base resolver means renderers that have no router (e.g. `renderComponent`)
11
+ * do not pull the outlet/engine machinery into the build.
12
+ */
13
+ export default class RouterResolver extends ResolverImpl {
14
+ lookupBuiltInHelper(name: string): Nullable<HelperDefinitionState>;
15
+ lookupHelper(name: string, owner: InternalOwner): Nullable<HelperDefinitionState>;
16
+ }
17
+ }
@@ -1,4 +1,5 @@
1
1
  declare module '@ember/-internals/metal/lib/tracked' {
2
+ import { type TrackedValue } from "@glimmer/validator/lib/tracked-value";
2
3
  import type { ExtendedMethodDecorator, DecoratorPropertyDescriptor } from "@ember/-internals/metal/lib/decorator";
3
4
  /**
4
5
  @decorator
@@ -62,14 +63,59 @@ declare module '@ember/-internals/metal/lib/tracked' {
62
63
 
63
64
  @param dependencies Optional dependents to be tracked.
64
65
  */
65
- export function tracked(
66
- propertyDesc: {
67
- value: any;
68
- initializer: () => any;
69
- }
70
- ): ExtendedMethodDecorator;
66
+ /**
67
+ * Reactivity options for the standalone `tracked(value, options)` form.
68
+ *
69
+ * - `equals` decides whether writing a value notifies consumers; it defaults to
70
+ * `Object.is`.
71
+ * - `description` is used in development for debugging.
72
+ *
73
+ * `equals` is a function-typed property (rather than method syntax) on purpose:
74
+ * this keeps its parameters checked strictly, so passing an `equals` typed for
75
+ * the wrong value type is a type error instead of being silently accepted.
76
+ */
77
+ interface TrackedValueOptions<Value> {
78
+ equals?: (a: Value, b: Value) => boolean;
79
+ description?: string;
80
+ }
81
+ /**
82
+ * Options for `tracked` used as a decorator, or as a field on a *classic* class
83
+ * (`EmberObject.extend({ foo: tracked({ value }) })`).
84
+ *
85
+ * All properties are optional because this single shape backs several usages:
86
+ * classic-field defaults (`tracked({ value })` / `tracked({ initializer })`) and
87
+ * options-only native decorators (`@tracked({ equals })`). The mutually
88
+ * exclusive combinations (e.g. both `value` and `initializer`) and the
89
+ * classic-only restriction on `value`/`initializer` are enforced at runtime via
90
+ * assertions rather than in the type, matching the runtime `isDecoratorOptions`
91
+ * check that accepts any object composed of these keys.
92
+ *
93
+ * - `value` / `initializer` supply a default value and are only valid on classic
94
+ * classes; native classes use class field initializers instead.
95
+ * - `equals` / `description` configure reactivity, mirroring
96
+ * {@link TrackedValueOptions}.
97
+ */
98
+ interface TrackedDecoratorOptions {
99
+ value?: any;
100
+ initializer?: () => any;
101
+ equals?(a: any, b: any): boolean;
102
+ description?: string;
103
+ }
104
+ /**
105
+ * `tracked` as a decorator factory: `@tracked({ equals })`, or on classic
106
+ * classes `tracked({ value })` / `tracked({ initializer })`.
107
+ */
108
+ export function tracked(propertyDesc: TrackedDecoratorOptions): ExtendedMethodDecorator;
109
+ /**
110
+ * `tracked` as a bare decorator: `@tracked foo = 1`.
111
+ */
71
112
  export function tracked(target: object, key: string): void;
72
113
  export function tracked(target: object, key: string, desc: DecoratorPropertyDescriptor): DecoratorPropertyDescriptor;
114
+ /**
115
+ * `tracked` as a standalone reactive value, usable outside of classes:
116
+ * `const count = tracked(0)`.
117
+ */
118
+ export function tracked<Value>(initialValue: Value, options?: TrackedValueOptions<Value>): TrackedValue<Value>;
73
119
  export class TrackedDescriptor {
74
120
  private _get;
75
121
  private _set;
@@ -77,4 +123,5 @@ declare module '@ember/-internals/metal/lib/tracked' {
77
123
  get(obj: object): unknown;
78
124
  set(obj: object, _key: string, value: unknown): void;
79
125
  }
126
+ export {};
80
127
  }