@microsoft/fast-element 2.4.0 → 2.5.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.
@@ -8566,6 +8566,15 @@
8566
8566
  "text": "compose",
8567
8567
  "canonicalReference": "@microsoft/fast-element!~compose:function"
8568
8568
  },
8569
+ {
8570
+ "kind": "Content",
8571
+ "text": ";\n defineAsync: typeof "
8572
+ },
8573
+ {
8574
+ "kind": "Reference",
8575
+ "text": "defineAsync",
8576
+ "canonicalReference": "@microsoft/fast-element!~defineAsync:function"
8577
+ },
8569
8578
  {
8570
8579
  "kind": "Content",
8571
8580
  "text": ";\n from: typeof "
@@ -8586,7 +8595,7 @@
8586
8595
  "name": "FASTElement",
8587
8596
  "variableTypeTokenRange": {
8588
8597
  "startIndex": 1,
8589
- "endIndex": 10
8598
+ "endIndex": 12
8590
8599
  }
8591
8600
  },
8592
8601
  {
@@ -9114,6 +9123,50 @@
9114
9123
  "isProtected": false,
9115
9124
  "isAbstract": false
9116
9125
  },
9126
+ {
9127
+ "kind": "Property",
9128
+ "canonicalReference": "@microsoft/fast-element!FASTElementDefinition.isRegistered:member",
9129
+ "docComment": "/**\n * The definition has been registered to the FAST element registry.\n */\n",
9130
+ "excerptTokens": [
9131
+ {
9132
+ "kind": "Content",
9133
+ "text": "static isRegistered: "
9134
+ },
9135
+ {
9136
+ "kind": "Reference",
9137
+ "text": "Record",
9138
+ "canonicalReference": "!Record:type"
9139
+ },
9140
+ {
9141
+ "kind": "Content",
9142
+ "text": "<string, "
9143
+ },
9144
+ {
9145
+ "kind": "Reference",
9146
+ "text": "Function",
9147
+ "canonicalReference": "!Function:interface"
9148
+ },
9149
+ {
9150
+ "kind": "Content",
9151
+ "text": ">"
9152
+ },
9153
+ {
9154
+ "kind": "Content",
9155
+ "text": ";"
9156
+ }
9157
+ ],
9158
+ "isReadonly": false,
9159
+ "isOptional": false,
9160
+ "releaseTag": "Public",
9161
+ "name": "isRegistered",
9162
+ "propertyTypeTokenRange": {
9163
+ "startIndex": 1,
9164
+ "endIndex": 5
9165
+ },
9166
+ "isStatic": true,
9167
+ "isProtected": false,
9168
+ "isAbstract": false
9169
+ },
9117
9170
  {
9118
9171
  "kind": "Property",
9119
9172
  "canonicalReference": "@microsoft/fast-element!FASTElementDefinition#name:member",
@@ -9188,6 +9241,54 @@
9188
9241
  "isProtected": false,
9189
9242
  "isAbstract": false
9190
9243
  },
9244
+ {
9245
+ "kind": "Property",
9246
+ "canonicalReference": "@microsoft/fast-element!FASTElementDefinition.registerAsync:member",
9247
+ "docComment": "/**\n * Indicates when a custom elements definition has been registered with the fastElementRegistry.\n *\n * @param name - The name of the defined custom element.\n *\n * @alpha\n */\n",
9248
+ "excerptTokens": [
9249
+ {
9250
+ "kind": "Content",
9251
+ "text": "static registerAsync: "
9252
+ },
9253
+ {
9254
+ "kind": "Content",
9255
+ "text": "(name: string) => "
9256
+ },
9257
+ {
9258
+ "kind": "Reference",
9259
+ "text": "Promise",
9260
+ "canonicalReference": "!Promise:interface"
9261
+ },
9262
+ {
9263
+ "kind": "Content",
9264
+ "text": "<"
9265
+ },
9266
+ {
9267
+ "kind": "Reference",
9268
+ "text": "Function",
9269
+ "canonicalReference": "!Function:interface"
9270
+ },
9271
+ {
9272
+ "kind": "Content",
9273
+ "text": ">"
9274
+ },
9275
+ {
9276
+ "kind": "Content",
9277
+ "text": ";"
9278
+ }
9279
+ ],
9280
+ "isReadonly": false,
9281
+ "isOptional": false,
9282
+ "releaseTag": "Alpha",
9283
+ "name": "registerAsync",
9284
+ "propertyTypeTokenRange": {
9285
+ "startIndex": 1,
9286
+ "endIndex": 6
9287
+ },
9288
+ "isStatic": true,
9289
+ "isProtected": false,
9290
+ "isAbstract": false
9291
+ },
9191
9292
  {
9192
9293
  "kind": "Property",
9193
9294
  "canonicalReference": "@microsoft/fast-element!FASTElementDefinition#registry:member",
@@ -9312,6 +9413,37 @@
9312
9413
  "isProtected": false,
9313
9414
  "isAbstract": false
9314
9415
  },
9416
+ {
9417
+ "kind": "Property",
9418
+ "canonicalReference": "@microsoft/fast-element!FASTElementDefinition#templateOptions:member",
9419
+ "docComment": "/**\n * The template options.\n *\n * @alpha\n */\n",
9420
+ "excerptTokens": [
9421
+ {
9422
+ "kind": "Content",
9423
+ "text": "templateOptions?: "
9424
+ },
9425
+ {
9426
+ "kind": "Reference",
9427
+ "text": "TemplateOptions",
9428
+ "canonicalReference": "@microsoft/fast-element!TemplateOptions:type"
9429
+ },
9430
+ {
9431
+ "kind": "Content",
9432
+ "text": ";"
9433
+ }
9434
+ ],
9435
+ "isReadonly": false,
9436
+ "isOptional": true,
9437
+ "releaseTag": "Alpha",
9438
+ "name": "templateOptions",
9439
+ "propertyTypeTokenRange": {
9440
+ "startIndex": 1,
9441
+ "endIndex": 2
9442
+ },
9443
+ "isStatic": false,
9444
+ "isProtected": false,
9445
+ "isAbstract": false
9446
+ },
9315
9447
  {
9316
9448
  "kind": "Property",
9317
9449
  "canonicalReference": "@microsoft/fast-element!FASTElementDefinition#type:member",
@@ -12266,6 +12398,85 @@
12266
12398
  "isAbstract": false,
12267
12399
  "name": "disconnect"
12268
12400
  },
12401
+ {
12402
+ "kind": "Method",
12403
+ "canonicalReference": "@microsoft/fast-element!HydratableElementController.forCustomElement:member(1)",
12404
+ "docComment": "",
12405
+ "excerptTokens": [
12406
+ {
12407
+ "kind": "Content",
12408
+ "text": "static forCustomElement(element: "
12409
+ },
12410
+ {
12411
+ "kind": "Reference",
12412
+ "text": "HTMLElement",
12413
+ "canonicalReference": "!HTMLElement:interface"
12414
+ },
12415
+ {
12416
+ "kind": "Content",
12417
+ "text": ", override?: "
12418
+ },
12419
+ {
12420
+ "kind": "Content",
12421
+ "text": "boolean"
12422
+ },
12423
+ {
12424
+ "kind": "Content",
12425
+ "text": "): "
12426
+ },
12427
+ {
12428
+ "kind": "Reference",
12429
+ "text": "ElementController",
12430
+ "canonicalReference": "@microsoft/fast-element!ElementController:class"
12431
+ },
12432
+ {
12433
+ "kind": "Content",
12434
+ "text": "<"
12435
+ },
12436
+ {
12437
+ "kind": "Reference",
12438
+ "text": "HTMLElement",
12439
+ "canonicalReference": "!HTMLElement:interface"
12440
+ },
12441
+ {
12442
+ "kind": "Content",
12443
+ "text": ">"
12444
+ },
12445
+ {
12446
+ "kind": "Content",
12447
+ "text": ";"
12448
+ }
12449
+ ],
12450
+ "isStatic": true,
12451
+ "returnTypeTokenRange": {
12452
+ "startIndex": 5,
12453
+ "endIndex": 9
12454
+ },
12455
+ "releaseTag": "Beta",
12456
+ "isProtected": false,
12457
+ "overloadIndex": 1,
12458
+ "parameters": [
12459
+ {
12460
+ "parameterName": "element",
12461
+ "parameterTypeTokenRange": {
12462
+ "startIndex": 1,
12463
+ "endIndex": 2
12464
+ },
12465
+ "isOptional": false
12466
+ },
12467
+ {
12468
+ "parameterName": "override",
12469
+ "parameterTypeTokenRange": {
12470
+ "startIndex": 3,
12471
+ "endIndex": 4
12472
+ },
12473
+ "isOptional": true
12474
+ }
12475
+ ],
12476
+ "isOptional": false,
12477
+ "isAbstract": false,
12478
+ "name": "forCustomElement"
12479
+ },
12269
12480
  {
12270
12481
  "kind": "Method",
12271
12482
  "canonicalReference": "@microsoft/fast-element!HydratableElementController.install:member(1)",
@@ -14926,6 +15137,34 @@
14926
15137
  "startIndex": 1,
14927
15138
  "endIndex": 2
14928
15139
  }
15140
+ },
15141
+ {
15142
+ "kind": "PropertySignature",
15143
+ "canonicalReference": "@microsoft/fast-element!PartialFASTElementDefinition#templateOptions:member",
15144
+ "docComment": "/**\n * Options controlling how the template will be created.\n *\n * @alpha\n */\n",
15145
+ "excerptTokens": [
15146
+ {
15147
+ "kind": "Content",
15148
+ "text": "readonly templateOptions?: "
15149
+ },
15150
+ {
15151
+ "kind": "Reference",
15152
+ "text": "TemplateOptions",
15153
+ "canonicalReference": "@microsoft/fast-element!TemplateOptions:type"
15154
+ },
15155
+ {
15156
+ "kind": "Content",
15157
+ "text": ";"
15158
+ }
15159
+ ],
15160
+ "isReadonly": true,
15161
+ "isOptional": true,
15162
+ "releaseTag": "Alpha",
15163
+ "name": "templateOptions",
15164
+ "propertyTypeTokenRange": {
15165
+ "startIndex": 1,
15166
+ "endIndex": 2
15167
+ }
14929
15168
  }
14930
15169
  ],
14931
15170
  "extendsTokenRanges": []
@@ -20551,6 +20790,32 @@
20551
20790
  ],
20552
20791
  "extendsTokenRanges": []
20553
20792
  },
20793
+ {
20794
+ "kind": "TypeAlias",
20795
+ "canonicalReference": "@microsoft/fast-element!TemplateOptions:type",
20796
+ "docComment": "/**\n * Template options.\n *\n * @alpha\n */\n",
20797
+ "excerptTokens": [
20798
+ {
20799
+ "kind": "Content",
20800
+ "text": "export declare type TemplateOptions = "
20801
+ },
20802
+ {
20803
+ "kind": "Content",
20804
+ "text": "\"defer-and-hydrate\""
20805
+ },
20806
+ {
20807
+ "kind": "Content",
20808
+ "text": ";"
20809
+ }
20810
+ ],
20811
+ "fileUrlPath": "dist/dts/components/fast-definitions.d.ts",
20812
+ "releaseTag": "Alpha",
20813
+ "name": "TemplateOptions",
20814
+ "typeTokenRange": {
20815
+ "startIndex": 1,
20816
+ "endIndex": 2
20817
+ }
20818
+ },
20554
20819
  {
20555
20820
  "kind": "TypeAlias",
20556
20821
  "canonicalReference": "@microsoft/fast-element!TemplateValue:type",
@@ -2349,11 +2349,20 @@ const HydrationMarkup = Object.freeze({
2349
2349
  */
2350
2350
  parseEnumeratedAttributeBinding(node) {
2351
2351
  const attrs = [];
2352
- let count = 0;
2353
- while (node.hasAttribute(`${this.attributeMarkerName}-${count}`)) {
2354
- attrs.push(count++);
2352
+ const prefixLength = this.attributeMarkerName.length + 1;
2353
+ const prefix = `${this.attributeMarkerName}-`;
2354
+ for (const attr of node.getAttributeNames()) {
2355
+ if (attr.startsWith(prefix)) {
2356
+ const count = Number(attr.slice(prefixLength));
2357
+ if (!Number.isNaN(count)) {
2358
+ attrs.push(count);
2359
+ }
2360
+ else {
2361
+ throw new Error(`Invalid attribute marker name: ${attr}. Expected format is ${prefix}<number>.`);
2362
+ }
2363
+ }
2355
2364
  }
2356
- return count === 0 ? null : attrs;
2365
+ return attrs.length === 0 ? null : attrs;
2357
2366
  },
2358
2367
  /**
2359
2368
  * Parses the ViewBehaviorFactory index from string data. Returns
@@ -4501,6 +4510,36 @@ function children(propertyOrOptions) {
4501
4510
  return new ChildrenDirective(propertyOrOptions);
4502
4511
  }
4503
4512
 
4513
+ /******************************************************************************
4514
+ Copyright (c) Microsoft Corporation.
4515
+
4516
+ Permission to use, copy, modify, and/or distribute this software for any
4517
+ purpose with or without fee is hereby granted.
4518
+
4519
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
4520
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
4521
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
4522
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
4523
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
4524
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
4525
+ PERFORMANCE OF THIS SOFTWARE.
4526
+ ***************************************************************************** */
4527
+
4528
+ function __awaiter(thisArg, _arguments, P, generator) {
4529
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4530
+ return new (P || (P = Promise))(function (resolve, reject) {
4531
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4532
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
4533
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4534
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
4535
+ });
4536
+ }
4537
+
4538
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
4539
+ var e = new Error(message);
4540
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
4541
+ };
4542
+
4504
4543
  const booleanMode = "boolean";
4505
4544
  const reflectMode = "reflect";
4506
4545
  /**
@@ -4723,7 +4762,7 @@ const fastElementRegistry = FAST.getById(KernelServiceId.elementRegistry, () =>
4723
4762
  */
4724
4763
  class FASTElementDefinition {
4725
4764
  constructor(type, nameOrConfig = type.definition) {
4726
- var _a;
4765
+ var _b;
4727
4766
  this.platformDefined = false;
4728
4767
  if (isString(nameOrConfig)) {
4729
4768
  nameOrConfig = { name: nameOrConfig };
@@ -4731,7 +4770,8 @@ class FASTElementDefinition {
4731
4770
  this.type = type;
4732
4771
  this.name = nameOrConfig.name;
4733
4772
  this.template = nameOrConfig.template;
4734
- this.registry = (_a = nameOrConfig.registry) !== null && _a !== void 0 ? _a : customElements;
4773
+ this.templateOptions = nameOrConfig.templateOptions;
4774
+ this.registry = (_b = nameOrConfig.registry) !== null && _b !== void 0 ? _b : customElements;
4735
4775
  const proto = type.prototype;
4736
4776
  const attributes = AttributeDefinition.collect(type, nameOrConfig.attributes);
4737
4777
  const observedAttributes = new Array(attributes.length);
@@ -4763,6 +4803,8 @@ class FASTElementDefinition {
4763
4803
  : Object.assign(Object.assign({}, defaultElementOptions), nameOrConfig.elementOptions);
4764
4804
  this.styles = ElementStyles.normalize(nameOrConfig.styles);
4765
4805
  fastElementRegistry.register(this);
4806
+ Observable.defineProperty(FASTElementDefinition.isRegistered, this.name);
4807
+ FASTElementDefinition.isRegistered[this.name] = this.type;
4766
4808
  }
4767
4809
  /**
4768
4810
  * Indicates if this element has been defined in at least one registry.
@@ -4805,7 +4847,43 @@ class FASTElementDefinition {
4805
4847
  static registerBaseType(type) {
4806
4848
  fastElementBaseTypes.add(type);
4807
4849
  }
4850
+ /**
4851
+ * Creates an instance of FASTElementDefinition asynchronously. This option assumes
4852
+ * that a template and shadowOptions will be provided and completes when those requirements
4853
+ * are met.
4854
+ * @param type - The type this definition is being created for.
4855
+ * @param nameOrDef - The name of the element to define or a config object
4856
+ * that describes the element to define.
4857
+ * @alpha
4858
+ */
4859
+ static composeAsync(type, nameOrDef) {
4860
+ return new Promise(resolve => {
4861
+ if (fastElementBaseTypes.has(type) || fastElementRegistry.getByType(type)) {
4862
+ resolve(new FASTElementDefinition(class extends type {
4863
+ }, nameOrDef));
4864
+ }
4865
+ const definition = new FASTElementDefinition(type, nameOrDef);
4866
+ Promise.all([
4867
+ new Promise(resolve => {
4868
+ Observable.getNotifier(definition).subscribe({
4869
+ handleChange: () => resolve(),
4870
+ }, "template");
4871
+ }),
4872
+ new Promise(resolve => {
4873
+ Observable.getNotifier(definition).subscribe({
4874
+ handleChange: () => resolve(),
4875
+ }, "shadowOptions");
4876
+ }),
4877
+ ]).then(() => {
4878
+ resolve(definition);
4879
+ });
4880
+ });
4881
+ }
4808
4882
  }
4883
+ /**
4884
+ * The definition has been registered to the FAST element registry.
4885
+ */
4886
+ FASTElementDefinition.isRegistered = {};
4809
4887
  /**
4810
4888
  * Gets the element definition associated with the specified type.
4811
4889
  * @param type - The custom element type to retrieve the definition for.
@@ -4816,6 +4894,21 @@ FASTElementDefinition.getByType = fastElementRegistry.getByType;
4816
4894
  * @param instance - The custom element instance to retrieve the definition for.
4817
4895
  */
4818
4896
  FASTElementDefinition.getForInstance = fastElementRegistry.getForInstance;
4897
+ /**
4898
+ * Indicates when a custom elements definition has been registered with the fastElementRegistry.
4899
+ * @param name - The name of the defined custom element.
4900
+ * @alpha
4901
+ */
4902
+ FASTElementDefinition.registerAsync = (name) => __awaiter(void 0, void 0, void 0, function* () {
4903
+ return new Promise(resolve => {
4904
+ if (FASTElementDefinition.isRegistered[name]) {
4905
+ resolve(FASTElementDefinition.isRegistered[name]);
4906
+ }
4907
+ Observable.getNotifier(FASTElementDefinition.isRegistered).subscribe({
4908
+ handleChange: () => resolve(FASTElementDefinition.isRegistered[name]),
4909
+ }, name);
4910
+ });
4911
+ });
4819
4912
  Observable.defineProperty(FASTElementDefinition.prototype, "template");
4820
4913
  Observable.defineProperty(FASTElementDefinition.prototype, "shadowOptions");
4821
4914
 
@@ -5916,6 +6009,16 @@ class HydratableElementController extends ElementController {
5916
6009
  record.target.$fastController.connect();
5917
6010
  }
5918
6011
  }
6012
+ static forCustomElement(element, override) {
6013
+ const definition = FASTElementDefinition.getForInstance(element);
6014
+ if (definition !== undefined &&
6015
+ definition.templateOptions === "defer-and-hydrate" &&
6016
+ !definition.template) {
6017
+ element.setAttribute(deferHydrationAttribute, "");
6018
+ element.setAttribute(needsHydrationAttribute, "");
6019
+ }
6020
+ return super.forCustomElement(element, override);
6021
+ }
5919
6022
  connect() {
5920
6023
  var _a, _b;
5921
6024
  // Initialize needsHydration on first connect
@@ -6015,6 +6118,24 @@ function compose(type, nameOrDef) {
6015
6118
  }
6016
6119
  return FASTElementDefinition.compose(this, type);
6017
6120
  }
6121
+ function defineAsync(type, nameOrDef) {
6122
+ if (isFunction(type)) {
6123
+ return new Promise(resolve => {
6124
+ FASTElementDefinition.composeAsync(type, nameOrDef).then(value => {
6125
+ resolve(value);
6126
+ });
6127
+ }).then(value => {
6128
+ return value.define().type;
6129
+ });
6130
+ }
6131
+ return new Promise(resolve => {
6132
+ FASTElementDefinition.composeAsync(this, type).then(value => {
6133
+ resolve(value);
6134
+ });
6135
+ }).then(value => {
6136
+ return value.define().type;
6137
+ });
6138
+ }
6018
6139
  function define(type, nameOrDef) {
6019
6140
  if (isFunction(type)) {
6020
6141
  return FASTElementDefinition.compose(type, nameOrDef).define().type;
@@ -6048,6 +6169,11 @@ const FASTElement = Object.assign(createFASTElement(HTMLElement), {
6048
6169
  * @public
6049
6170
  */
6050
6171
  compose,
6172
+ /**
6173
+ * Defines metadata for a FASTElement which can be used after it has been resolved to define the element.
6174
+ * @alpha
6175
+ */
6176
+ defineAsync,
6051
6177
  });
6052
6178
  /**
6053
6179
  * Decorator: Defines a platform custom element based on `FASTElement`.