Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Triage all KumaScript macros that are called from our JS docs #2846

Closed
Tracked by #5216
wbamberg opened this issue Dec 3, 2019 · 31 comments
Closed
Tracked by #5216

Triage all KumaScript macros that are called from our JS docs #2846

wbamberg opened this issue Dec 3, 2019 · 31 comments
Labels
🐌 idle Issues and PRs without recent activity. Flagged for maintainer follow-up. idle macros tracking issues related to kumascript macros p2 We want to address this but may have other higher priority items. 🚉 platform keeping the platform healthy

Comments

@wbamberg
Copy link
Collaborator

wbamberg commented Dec 3, 2019

Depends on mdn/sprints#2519

  1. Run our linter on all the JS docs to get a list of all the KumaScript macros that they call.
  2. Go through all the macros, and decide for each one whether we should:
  • render: replace the macro call with the static HTML that it generates
  • remove: remove the macro call
  • replace: design and implement a replacement for the KumaScript macro

These decisions should be made public and reviewed by our content lead.

Acceptance criteria

We have a resolution (render, remove, replace) for every macro called from the JS docs.

@Elchi3
Copy link
Member

Elchi3 commented Dec 11, 2019

This list of macros uses mdn/stumptown-content#264 to lint for all macro calls under /en-US/docs/Web/JavaScript:

Macro name                         number of calls
--------------------------------------------------
jsxref                             7387
Spec2                              1839
SpecName                           1832
EmbedInteractiveExample            490
jsSidebar                          241
page                               142
Glossary                           142
domxref                            89
bug                                84
js_property_attributes             82
htmlelement                        50
PreviousNext                       32
anch                               30
geckoRelease                       21
Obsolete_Header                    10
EmbedLiveSample                    9
EmbedTest262ReportResultsTable     8
interwiki                          5
htmlattrxref                       4
obsolete_inline                    4
JSFiddleEmbed                      4
jsindex                            2
HTTPHeader                         2
Previous                           2
JSRef                              1
SectionOnPage                      1
compat                             1
Note                               1
Gecko                              1
RFC                                1
ListSubPages                       1
Next                               1
Index                              1

@wbamberg
Copy link
Collaborator Author

wbamberg commented Dec 12, 2019

This comment presents an initial triage for the 33 macros listed above and called from our JS docs.

It should assign to each macro one of the following three options:

  • Render: replace the macro call in the Wiki with the HTML it generates
  • Remove: replace the macro call in the Wiki with nothing
  • Replace: keep the macro call in the Wiki, possibly adapting it for stumptown-compatibility. Design and implement a replacement for the macro in stumptown. Then in scraping, convert macro calls into the stumptown format.

For macros we intend to replace, there's going to be a further choice about whether we expose them to guide pages via "directives" (as we already do for BCD, for example), or restrict them to pages that are of a particular recipe (as we do for specifications, for example).


* jsSidebar

* JSRef

Replace

We're intending to replace sidebars, of course.


* jsxref

* domxref

* bug

* HTMLElement

* anch

* interwiki

* htmlattrxref

* HTTPHeader

* SectionOnPage

* RFC

* Glossary

Render

These are all XRef macros, that convert some arguments (a partial path, in effect, plus sometimes some extra arguments) to a link.


* PreviousNext

* Previous

* Next

Replace

These are used to add specially styled "Next" and "Previous" links to documents that are part of a linear sequence. We don't yet have an implementation of this in stumptown, but see mdn/stumptown-content#265 for a proposal.


* js_property_attributes

Replace

This is an "info box" for JS properties. See e.g. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length.

We know we will want info box support in stumptown (see also mdn/stumptown-content#106). The actual items in this case seem simple to support (just booleans).

These macros are specific to certain structured page types, so I don't think we should expose them to guide pages as "directives".


* obsolete_inline

* Obsolete_Header

* Note

Remove

These are all "badge/banner" macros. Banners add specially styled blocks of text, while badges add specially styled inline text.

See for example: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators#Non-standard_features and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions for examples of the "obsolete_*" macros.

For "Note", see for example the first paragraph under https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#Using_split.

I propose removing all three of these. I expect removing Note might be controversial. Personally I think we should prefer to avoid these kinds of note/warning boxes and let the text speak for itself. If we did want to support them I'm not sure what would be the best way. Perhaps we could abuse Markdown code fences?


* SpecName

* Spec2

Replace

These are used to build spec tables.

They are already supported. We don't need to expose them to guide pages as directives.


* EmbedInteractiveExample

Replace

Already supported. We don't need to expose them to guide pages as directives.


* EmbedTest262ReportResultsTable

Replace

Embeds a test report table in an iframe. See for example https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis#Implementation_progress.

If we want to keep this feature, we'll need to replace this macro. We don't need to expose them to guide pages as directives.


* EmbedLiveSample

Replace

We already support this, and it's enabled for guide pages.


* Compat

Replace

We already support this, and it's enabled for guide pages.


* page

Render

This page is used to include content from one page in another page.

I would like us to render out this macro, in general. I think ad hoc transcluding of content is a kind of content antipattern (mostly because the original source of the doc doesn't know where it is included, so it's easy to edit it so it doesn't make sense in the transcluding context). But it is used quite extensively in the JS docs to include instance properties and methods from the corresponding Foo/prototype page.

For example, https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray uses it to include instance properties from https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype.

I think we should consider whether the JS docs really want to be doing this. If they do, we should find a way to support it.


* geckoRelease

Remove

This is used in pages like WeakMap.set(), where source like:

Prior to Firefox 33 {{geckoRelease("33")}}, WeakMap.prototype.set returned undefined and was not chainable. This has been fixed ({{bug(1031632)}}). The behavior could be found in Chrome/v8 as well (issue).

gives output like:

Prior to Firefox 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), WeakMap.prototype.set returned undefined and was not chainable. This has been fixed (bug 1031632). The behavior could be found in Chrome/v8 as well (issue).

So the macro converts "33" -> "(Firefox 33 / Thunderbird 33 / SeaMonkey 2.30)". Really, that paragraph should be removed, and its contents represented in BCD if it's important. But that's a manual update. For the sake of the machines, it would be fine to just remove the macro call, and the output would be:

Prior to Firefox 33, WeakMap.prototype.set returned undefined and was not chainable. This has been fixed (bug 1031632). The behavior could be found in Chrome/v8 as well (issue).


* JSFiddleEmbed

Replace, after changing to use EmbedLiveSample

Embeds a JSFiddle in the page.

These are only used in one page, https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Closures. Using JSFiddle embeds doesn't add any advantages over a normal live sample, as far as I can tell.


* jsindex

Replace

These are used to build two landing pages:
https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Properties_Index
https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Methods_Index

I'd suggest we rework these pages to be "stumptown landing page compatible", and scrape them as landing pages. We can I hope use stumptown "link lists" to replace the actual macro calls here.


* Gecko

Remove

Used in one page: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search.


* ListSubPages

Replace

Used in one page: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors, which looks like it wants to be a landing page. I'd suggest we rework this page to be "stumptown landing page compatible", and scrape it as as a landing page. Listing subpages is already supported in stumptown "link lists".


* Index

Replace ??

Used in only one page, https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Index. I think these pages are used for DocStatus, and I assume that in GitHub that whole system will be replaced. However we haven't yet thought about what the requirements are for this or how we will do it.


Summary

So to summarise, I'd say:

Remove:

  • obsolete_inline
  • Obsolete_Header
  • Note
  • geckoRelease
  • Gecko

Render:

  • jsxref
  • domxref
  • bug
  • HTMLElement
  • anch
  • interwiki
  • htmlattrxref
  • HTTPHeader
  • SectionOnPage
  • RFC
  • Glossary
  • page

Replace:

  • jsSidebar
  • JSRef
  • PreviousNext
  • Previous
  • Next
  • Index
  • js_property_attributes (info_box)
  • EmbedInteractiveExample [1]
  • EmbedTest262ReportResultsTable
  • EmbedLiveSample [1]
  • JSFiddleEmbed (after converting to EmbedLiveSample) [1]
  • Compat [1]
  • SpecName [1]
  • Spec2 [1]
  • ListSubPages [1]
  • jsindex [1]

[1] already supported in stumptown

@ddbeck
Copy link
Contributor

ddbeck commented Dec 20, 2019

This is great. Thank you for writing all of these up, Will.

There was only one macro decision that I had misgivings about and that was replacing EmbedTest262ReportResultsTable. Can we remove this one instead? It seems to cover a lot of the same ground as BCD but lacks details to make it actionable (e.g., so what if V8 passes the tests? does Chrome actually ship that version of V8? I don't know and the report doesn't tell me).

I take it we'll have separate issues to hash out the implementation details of removing or rendering out specific macros? For example, I'd like to see the potential diff of removing geckoRelease to make sure it's not being used all alone, or I'd like to suggest annotating the source for the HTML that removes macros. I haven't gotten into the weeds on this here because I figure it can wait, but please correct me if I'm wrong.

@wbamberg
Copy link
Collaborator Author

This is great. Thank you for writing all of these up, Will.

There was only one macro decision that I had misgivings about and that was replacing EmbedTest262ReportResultsTable. Can we remove this one instead? It seems to cover a lot of the same ground as BCD but lacks details to make it actionable (e.g., so what if V8 passes the tests? does Chrome actually ship that version of V8? I don't know and the report doesn't tell me).

I'd be happy to remove it, but it is very new (mdn/kumascript#1245). As I understand it, it is experimental and I don't know what the status of the experiment is. I think Florian's input is needed here.

I take it we'll have separate issues to hash out the implementation details of removing or rendering out specific macros? For example, I'd like to see the potential diff of removing geckoRelease to make sure it's not being used all alone, or I'd like to suggest annotating the source for the HTML that removes macros. I haven't gotten into the weeds on this here because I figure it can wait, but please correct me if I'm wrong.

Well, some of this work has to be done now, just to make a sensible determination. I mean, we need to have some idea of what they do and where/how they are used, and I've done some of that digging in the comment above. And I do want to be careful in this step and get to quite a high degree of confidence that we are making good decisions. But yes, there are issues for the next steps (e.g. https://github.com/mdn/sprints/issues/2524) and I don't expect us to get all the decisions right at this point. Does that answer your concern?

@chrisdavidmills
Copy link
Contributor

chrisdavidmills commented Dec 21, 2019

Great work here @wbamberg !

I agree with most of it, and just had the odd few comments/queries:

  • Your comment about "note" — "I propose removing all three of these. I expect removing Note might be controversial". I think we can live without explicit note and warning boxes and let the content speak for itself, at least for the time being. It might be nice to have some sort of styling in the future if possible. Could we add something to the renderer so that whenever it finds a paragraph with "Note: " or "Warning: " at the start of it, it just adds a note or warning class to the paragraph element in the final rendered version? So it just infers it from the text rather than needing a macro?

  • I am surprised that the deprecated_inline and deprecated_header macros are not used anywhere in the JS section!

  • "EmbedTest262ReportResultsTable" - I think I agree with @ddbeck on this one; it is not very useful to MDN readers. So let's remove it unless @Elchi3 has a good practical/political reason not to.

  • "I think these pages are used for DocStatus" - are we still using the DocStatus pages for anything? I've never really used them, and I think they were mainly used as community hubs for volunteers trying to find things to do? I reckon we can probably meet this need in a cleverer way in the new world, using the available GitHub machinery

@wbamberg
Copy link
Collaborator Author

wbamberg commented Dec 21, 2019

Thanks Chris, for taking a look!

Could we add something to the renderer so that whenever it finds a paragraph with "Note: " or "Warning: " at the start of it, it just adds a note or warning class to the paragraph element in the final rendered version? So it just infers it from the text rather than needing a macro?

Some difficulties with this:

  • you can only have 1-paragraph notes
  • things get complicated when you have translations: each locale needs its own copy of the magic word, and translators have to know what it is. We have to document the magic word for every locale.
  • more generally, inferring markup from the text is a rather implicit/magical way to do it, and that's tricky: it means it's not obvious to writers, and looks less like an explicit choice. Explicit markup is a signal to writers and maintainers that something special is going on.
  • you won't have native preview support in editors. That, combined with some of the other points, makes it easy to make mistakes. For example, if you accidentally add a paragraph in your note, it won't show up as a problem in the native preview, but the text will be mangled, because the second para will be semantically part of the same note, but won't be highlighted.

One reason for suggesting we abuse code fencing is that you get something like preview support, so source like this:

blah blah blah

```note
This is a note we've decided to highlight for some reason.

We can have 2 paragraphs.

[Other Markup doesn't work, though](https://example.com), which is sad
```

some more stuff that isn't in the note.

is shown in my editor's preview like this:

Screen Shot 2019-12-21 at 12 00 09 PM

I think in most cases, removing notes from MDN pages improves them. What happens is that people have A Thing they want to say, and it's important to them, because they're motivated enough to add it, so they mark it up to show how important it is. But when everyone does that, it's the documentation equivalent of a party where everyone's talking at once, so some people start talking louder to be heard, then eventually everyone's shouting and you can't hear anything.

For example, see the section of the JS docs that use {{Note}}:

Screen Shot 2019-12-21 at 11 45 16 AM

I think this passage would be improved by just removing the Note styling.

"I think these pages are used for DocStatus" - are we still using the DocStatus pages for anything? I've never really used them, and I think they were mainly used as community hubs for volunteers trying to find things to do? I reckon we can probably meet this need in a cleverer way in the new world, using the available GitHub machinery

I think they are used only by localizers, and @SphinxKnight has told me that they are useful and used. And yes, I expect this would have an out-of-content solution in stumptown, but that doesn't absolve us from thinking about it :).

@chrisdavidmills
Copy link
Contributor

Some difficulties with this / abusing code fencing

Valid points here, thanks for taking the time to explain the difficulties in so much detail. It is taking me a while to get into the stumptown mindset when thinking about how things will work, and this is very helpful! So yes, the code fencing thing does look it could work.

I totally agree with you on note usage too; as you said before, the content should largely just speak for itself.

@ddbeck
Copy link
Contributor

ddbeck commented Dec 23, 2019

Well, some of this work has to be done now, just to make a sensible determination. I mean, we need to have some idea of what they do and where/how they are used, and I've done some of that digging in the comment above. And I do want to be careful in this step and get to quite a high degree of confidence that we are making good decisions. But yes, there are issues for the next steps (e.g. #2844) and I don't expect us to get all the decisions right at this point. Does that answer your concern?

OK, that's fine. If you're pretty confident that the macros can be removed safely now, then that's good enough for me. Also, I mis-wrote before: my hope was that for macros that get rendered out to have an annotation as such (e.g., a data- attribute to note that the HTML used to be a macro); this is the sort of detail that I assumed would have to get written up in a user story for the dev team to implement.

@escattone
Copy link
Contributor

This is really exciting progress and looks great to me, thanks @wbamberg, @Elchi3, @ddbeck, and @chrisdavidmills!!

I had one thought/question while reading through the macro decisions. I was wondering if it might make more sense to remove the page macro rather than render it? In the example provided (https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray), the TypedArray prototype section of that page would have a link to https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype (generated by rendering-out the jsxref("TypedArray.prototype") macro call), so duplicating the Properties and Methods sections from that linked page, via the page('en-US/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype','Properties') and page('en-US/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype','Methods') macro calls, seems like it violates the DRY principle for no compelling reason, since the user could get to that information by following the link? This argument to remove rather than render assumes that the page macro calls are always immediately preceded by jsxref macro calls, which may not be the case though.

@wbamberg
Copy link
Collaborator Author

wbamberg commented Jan 7, 2020

That's a very interesting comment @escattone ! In this case I agree with you, remove is better. But as you imply, page is a very general-purpose macro, and removing it here is only an option in this particular context.

If we had a tool that let us say: "remove {{page}} only for pages under /en-US/docs/Web/JavaScript", and we could be fairly sure it's only called in this context (which means we have to spend the time checking through all 142 calls to this macro), then I'd be happy to do this for JS.

So this also suggests we could triage macros differently in different sections of the docs.

@escattone
Copy link
Contributor

@wbamberg I did some analysis of all of the documents under /en-US/docs/Web/JavaScript. Out of 1052 total documents descendant from /en-US/docs/Web/JavaScript, only 53 documents contain calls to the page macro. The following are the macro calls, in the order in which they are made, within each of those 53 documents. Scanning down the list, I marked the documents where one or more page macro calls might be able to be removed rather than rendered, and it seemed to me that 31 documents met that criteria (they're preceded with **DOC: rather than DOC: in the data below). Within those 31 documents, I found 60 page macro calls (out of the 139 total page macro calls within all 53 documents -- so less than 50%) which I thought could be removed rather than rendered (they're marked with **page rather than page). After looking at this data, I think your original decision to render is right on. Trying to determine when removal might be better doesn't seem worth it.

DOC: /en-US/docs/Web/JavaScript/Typed_arrays (JavaScript typed arrays)
   JsSidebar("Advanced")
   jsxref("Array")
   jsxref("ArrayBuffer")
   jsxref("ArrayBuffer")
   jsxref("DataView")
   page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "TypedArray_objects")
   jsxref("DataView")
   Glossary("Endianness")
   jsxref("ArrayBuffer")
   jsxref("Uint8ClampedArray")
   jsxref("Array")
   jsxref("Array.from")
   SpecName('Typed Array')
   Spec2('Typed Array')
   SpecName('ES2015', '#sec-typedarray-objects', 'TypedArray Objects')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-typedarray-objects', 'TypedArray Objects')
   Spec2('ESDraft')
   Compat("javascript.builtins.Int8Array")
   Glossary("Endianness")
DOC: /en-US/docs/Web/JavaScript/Data_structures (JavaScript data types and data structures)
   jsSidebar("More")
   Glossary("Primitive", "primitives")
   Glossary("Boolean")
   Glossary("Null")
   Glossary("Undefined")
   Glossary("Number")
   Glossary("BigInt")
   Glossary("String")
   Glossary("Symbol")
   Glossary("Object")
   Glossary("Boolean")
   jsxref("Boolean")
   jsxref("null")
   Glossary("Null")
   jsxref("undefined")
   Glossary("Undefined")
   jsxref("NaN")
   jsxref("Infinity", "+/-Infinity")
   jsxref("Number.MAX_VALUE")
   jsxref("Number.MIN_VALUE")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("Number.MIN_SAFE_INTEGER")
   jsxref("BigInt")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("TypeError")
   jsxref("String")
   domxref("XMLHttpRequest")
   Glossary("Symbol")
   jsxref("Symbol")
   Glossary("Identifier", "identifier")
   jsxref("Symbol")
   page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "TypedArray_objects", "", 0, 3)
   jsxref("Set")
   jsxref("WeakSet")
   jsxref("Map")
   jsxref("WeakMap")
   Glossary("JSON")
   jsxref("JSON")
   SpecName('ES1')
   Spec2('ES1')
   SpecName('ES5.1', '#sec-8', 'Types')
   Spec2('ES5.1')
   SpecName('ES2015', '#sec-ecmascript-data-types-and-values', 'ECMAScript Data Types and Values')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-ecmascript-data-types-and-values', 'ECMAScript Data Types and Values')
   Spec2('ESDraft')
DOC: /en-US/docs/Web/JavaScript/Reference (JavaScript reference)
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects', 'Standard_objects_by_category')
   page('/en-US/docs/Web/JavaScript/Reference/Statements', 'Statements_and_declarations_by_category')
   page('/en-US/docs/Web/JavaScript/Reference/Operators', 'Expressions_and_operators_by_category')
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Function (Function)
   jsxref("eval")
   EmbedInteractiveExample("pages/js/function-constructor.html")
   jsxref("Function.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype', 'Methods')
   jsxref("Function.prototype")
   jsxref("eval")
   SpecName('ES1')
   Spec2('ES1')
   SpecName('ES5.1', '#sec-15.3', 'Function')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-function-objects', 'Function')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-function-objects', 'Function')
   Spec2('ESDraft')
   Compat("javascript.builtins.Function")
   jsxref("Functions", "Functions and function scope")
   jsxref("Statements/function", "function statement")
   jsxref("Operators/function", "function expression")
   jsxref("Statements/function*", "function* statement")
   jsxref("Operators/function*", "function* expression")
   jsxref("AsyncFunction")
   jsxref("GeneratorFunction")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView (DataView)
   jsxref("ArrayBuffer")
   EmbedInteractiveExample("pages/js/dataview-constructor.html")
   jsxref("ArrayBuffer")
   jsxref("SharedArrayBuffer")
   jsxref("RangeError")
   Glossary("Endianness")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("BigInt")
   jsxref("DataView.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/DataView/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/DataView/prototype','Methods')
   SpecName('ESDraft', '#sec-dataview-constructor', 'DataView')
   Spec2('ESDraft')
   SpecName('ES6', '#sec-dataview-constructor', 'DataView')
   Spec2('ES6')
   SpecName('Typed Array')
   Spec2('Typed Array')
   Compat("javascript.builtins.DataView")
   jsxref("Operators/new", "new")
   jsxref("TypeError")
   jsxref("ArrayBuffer")
   jsxref("SharedArrayBuffer")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (Date)
   EmbedInteractiveExample("pages/js/date-constructor.html")
   jsxref("new")
   RFC(2822)
   anch("Two_digit_years_map_to_1900_-_1999", "example below")
   jsxref("Date.prototype")
   jsxref("Date.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/prototype', 'Methods')
   domxref("window.performance", "Web Performance API", "", 1)
   SpecName('ESDraft', '#sec-date-objects', 'Date')
   Spec2('ESDraft')
   SpecName('ES6', '#sec-date-objects', 'Date')
   Spec2('ES6')
   SpecName('ES5.1', '#sec-15.9', 'Date')
   Spec2('ES5.1')
   SpecName('ES1')
   Spec2('ES1')
   Compat("javascript.builtins.Date", 3)
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString (Date.prototype.toLocaleString())
   EmbedInteractiveExample("pages/js/date-tolocalestring.html")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat', 'Parameters')
   jsxref("undefined")
   jsxref("undefined")
   jsxref("RangeError")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
   jsxref("DateTimeFormat.prototype.format", "format")
   SpecName('ES1')
   Spec2('ES1')
   SpecName('ES5.1', '#sec-15.9.5.5', 'Date.prototype.toLocaleString')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-date.prototype.tolocalestring', 'Date.prototype.toLocaleString')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-date.prototype.tolocalestring', 'Date.prototype.toLocaleString')
   Spec2('ESDraft')
   SpecName('ES Int 1.0', '#sec-13.3.1', 'Date.prototype.toLocaleString')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-13.3.1', 'Date.prototype.toLocaleString')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#sec-Date.prototype.toLocaleString', 'Date.prototype.toLocaleString')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Date.toLocaleString")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString (Date.prototype.toLocaleTimeString())
   EmbedInteractiveExample("pages/js/date-tolocaletimestring.html")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat', 'Parameters')
   jsxref("undefined")
   jsxref("undefined")
   jsxref("Global_Objects/Date", "Date")
   jsxref("RangeError")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
   jsxref("DateTimeFormat.prototype.format", "format")
   SpecName('ESDraft', '#sec-date.prototype.tolocaletimestring', 'Date.prototype.toLocaleTimeString')
   Spec2('ESDraft')
   SpecName('ES Int Draft', '#sup-date.prototype.tolocaletimestring', 'Date.prototype.toLocaleTimeString')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Date.toLocaleTimeString")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString (Date.prototype.toLocaleDateString())
   EmbedInteractiveExample("pages/js/date-tolocaledatestring.html")
   anch("Browser compatibility")
   anch("Checking for support for locales and options arguments")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat', 'Parameters')
   jsxref("undefined")
   jsxref("undefined")
   jsxref("Global_Objects/Date", "Date")
   jsxref("RangeError")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
   jsxref("DateTimeFormat.prototype.format", "format")
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', 'sec-15.9.5.6', 'Date.prototype.toLocaleDateString')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-date.prototype.tolocaledatestring', 'Date.prototype.toLocaleDateString')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-date.prototype.tolocaledatestring', 'Date.prototype.toLocaleDateString')
   Spec2('ESDraft')
   SpecName('ES Int 1.0', '#sec-13.3.2', 'Date.prototype.toLocaleDateString')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-13.3.2', 'Date.prototype.toLocaleDateString')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#sec-Date.prototype.toLocaleDateString', 'Date.prototype.toLocaleDateString')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Date.toLocaleDateString")
   jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp (RegExp)
   EmbedInteractiveExample("pages/js/regexp-constructor.html")
   jsxref("TypeError")
   jsxref("RegExp.prototype")
   jsxref("RegExp.@@species", "get RegExp[@@species]")
   jsxref("RegExp.lastIndex")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/prototype', 'Methods')
   jsxref("Global_Objects/String", "String")
   jsxref("RegExp.prototype.lastIndex")
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.10', 'RegExp')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-regexp-regular-expression-objects', 'RegExp')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-regexp-regular-expression-objects', 'RegExp')
   Spec2('ESDraft')
   Compat("javascript.builtins.RegExp")
   bug(1053944)
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Map (Map)
   Glossary("Primitive", "primitive values")
   jsxref("Array")
   jsxref("Statements/for...of", "for...of")
   jsxref("NaN")
   anch("Browser compatibility")
   jsxref("Object")
   jsxref("String")
   jsxref("Symbol")
   jsxref("Map.prototype.size", "size")
   jsxref("Map.prototype.size")
   jsxref("Map.@@species", "get Map[@@species]")
   jsxref("Map.prototype")
   jsxref("Map.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Methods')
   jsxref("NaN")
   SpecName('ES2015', '#sec-map-objects', 'Map')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-map-objects', 'Map')
   Spec2('ESDraft')
   Compat("javascript.builtins.Map")
   jsxref("Set")
   jsxref("WeakMap")
   jsxref("WeakSet")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Set (Set)
   Glossary("Primitive", "primitive values")
   EmbedInteractiveExample("pages/js/set-prototype-constructor.html")
   jsxref("NaN")
   jsxref("undefined")
   jsxref("Set.@@species", "get Set[@@species]")
   jsxref("Set.prototype")
   jsxref("Set.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/prototype','Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/prototype','Methods')
   SpecName('ESDraft', '#sec-set-objects', 'Set')
   Spec2('ESDraft')
   SpecName('ES2015', '#sec-set-objects', 'Set')
   Spec2('ES2015')
   Compat("javascript.builtins.Set")
   jsxref("Map")
   jsxref("WeakMap")
   jsxref("WeakSet")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean (Boolean)
   jsxref("null")
   jsxref("NaN")
   jsxref("undefined")
   jsxref("undefined")
   jsxref("null")
   jsxref("Statements/if...else", "if")
   jsxref("Statements/if...else", "if")
   jsxref("Boolean.prototype")
   jsxref("Boolean.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/prototype', 'Methods')
   SpecName('ES1')
   Spec2('ES1')
   SpecName('ES5.1', '#sec-15.6', 'Boolean')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-boolean-objects', 'Boolean')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-boolean-objects', 'Boolean')
   Spec2('ESDraft')
   Compat("javascript.builtins.Boolean")
   jsxref("Boolean.prototype")
   Glossary("Boolean")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap (WeakMap)
   SectionOnPage("/en-US/docs/Web/JavaScript/Guide/Keyed_collections", "WeakMap object")
   Glossary("Primitive", "Primitive data types")
   jsxref("Symbol")
   jsxref("Map")
   jsxref("WeakMap.prototype")
   jsxref("WeakMap.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')
   SpecName('ESDraft', '#sec-weakmap-objects', 'WeakMap')
   Spec2('ESDraft')
   SpecName('ES2015', '#sec-weakmap-objects', 'WeakMap')
   Spec2('ES2015')
   Compat("javascript.builtins.WeakMap")
   jsxref("Map")
   jsxref("Set")
   jsxref("WeakSet")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Number (Number)
   jsxref("BigInt")
   jsxref("NaN")
   jsxref("Operators/new", "new")
   jsxref("Number.EPSILON")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("Number.MAX_VALUE")
   jsxref("Number.MIN_SAFE_INTEGER")
   jsxref("Number.MIN_VALUE")
   jsxref("Number.NaN")
   jsxref("Number.NEGATIVE_INFINITY")
   jsxref("Number.POSITIVE_INFINITY")
   jsxref("Number.prototype")
   jsxref("Global_Objects/Infinity", "Infinity")
   jsxref("Number.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/prototype', 'Methods')
   jsxref("String")
   jsxref("BigInt")
   jsxref("Date")
   SpecName('ES1')
   Spec2('ES1')
   SpecName('ES5.1', '#sec-15.7', 'Number')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-number-objects', 'Number')
   Spec2('ES6')
   jsxref("Number.EPSILON", "EPSILON")
   jsxref("Number.isFinite", "isFinite")
   jsxref("Number.isInteger", "isInteger")
   jsxref("Number.isNaN", "isNaN")
   jsxref("Number.parseFloat", "parseFloat")
   jsxref("Number.parseInt", "parseInt")
   SpecName('ESDraft', '#sec-number-objects', 'Number')
   Spec2('ESDraft')
   Compat("javascript.builtins.Number")
   jsxref("NaN")
   jsxref("Math")
   jsxref("BigInt")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString (Number.prototype.toLocaleString())
   EmbedInteractiveExample("pages/js/number-tolocalestring.html")
   jsxref("undefined")
   bug(999003)
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat', 'Parameters')
   jsxref("Global_Objects/RangeError", "RangeError")
   jsxref("NumberFormat")
   jsxref("NumberFormat.format")
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.7.4.3', 'Number.prototype.toLocaleString')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')
   Spec2('ESDraft')
   SpecName('ES Int 1.0', '#sec-13.2.1', 'Number.prototype.toLocaleString')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-13.2.1', 'Number.prototype.toLocaleString')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#sec-Number.prototype.toLocaleString', 'Number.prototype.toLocaleString')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Number.toLocaleString")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat (Number.parseFloat())
   EmbedInteractiveExample("pages/js/number-parsefloat.html")
   page("en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat", "Parameters")
   page("en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat", "Return value")
   SpecName('ES2015', '#sec-number.parsefloat', 'Number.parseFloat')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-number.parsefloat', 'Number.parseFloat')
   Spec2('ESDraft')
   Compat("javascript.builtins.Number.parseFloat")
   jsxref("Number")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt (Number.parseInt())
   EmbedInteractiveExample("pages/js/number-parseint.html")
   page("en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt", "Parameters")
   page("en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt", "Return value")
   SpecName('ES2015', '#sec-number.parseint', 'Number.parseInt')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-number.parseint', 'Number.parseInt')
   Spec2('ESDraft')
   Compat("javascript.builtins.Number.parseInt")
   jsxref("Number")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/String (String)
   jsxref("String.length", "length")
   jsxref("Boolean")
   jsxref("Global_Objects/Number", "Numbers")
   jsxref("Operators/new", "new")
   jsxref("String.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/prototype', 'Methods_unrelated_to_HTML')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/prototype', 'HTML_wrapper_methods')
   jsxref("null")
   jsxref("undefined")
   jsxref("Symbol", "symbols")
   SpecName('ESDraft', '#sec-string-objects', 'String')
   Spec2('ESDraft')
   SpecName('ES2015', '#sec-string-objects', 'String')
   Spec2('ES2015')
   SpecName('ES5.1', '#sec-15.5', 'String')
   Spec2('ES5.1')
   SpecName('ES1')
   Spec2('ES1')
   Compat("javascript.builtins.String",2)
   domxref("DOMString")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare (String.prototype.localeCompare())
   EmbedInteractiveExample("pages/js/string-localecompare.html")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator', 'Parameters')
   jsxref("RangeError")
   jsxref("Global_Objects/Collator", "Intl.Collator")
   jsxref("Collator.prototype.compare", "compare")
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.5.4.9', 'String.prototype.localeCompare')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-string.prototype.localecompare', 'String.prototype.localeCompare')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-string.prototype.localecompare', 'String.prototype.localeCompare')
   Spec2('ESDraft')
   SpecName('ES Int 1.0', '#sec-13.1.1', 'String.prototype.localeCompare')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-13.1.1', 'String.prototype.localeCompare')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#sec-String.prototype.localeCompare', 'String.prototype.localeCompare')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.String.localeCompare")
   jsxref("Global_Objects/Collator", "Intl.Collator")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray (TypedArray)
   EmbedInteractiveExample("pages/js/typedarray-constructor.html")
   jsxref("ArrayBuffer")
   jsxref("ArrayBuffer")
   jsxref("Int8Array")
   jsxref("Uint8Array")
   jsxref("Uint8ClampedArray")
   jsxref("Int16Array")
   jsxref("Uint16Array")
   jsxref("Int32Array")
   jsxref("Uint32Array")
   jsxref("Float32Array")
   jsxref("Float64Array")
   jsxref("BigInt64Array")
   jsxref("BigUint64Array")
   jsxref("TypedArray.BYTES_PER_ELEMENT")
   jsxref("TypedArray.name")
   jsxref("TypedArray.@@species", "get TypedArray[@@species]")
   jsxref("TypedArray.prototype")
   jsxref("TypedArray.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/TypedArray/prototype','Methods')
   SpecName('Typed Array')
   Spec2('Typed Array')
   SpecName('ES6', '#sec-typedarray-objects', 'TypedArray Objects')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-typedarray-objects', 'TypedArray Objects')
   Spec2('ESDraft')
   Compat("javascript.builtins.TypedArray")
   jsxref("Operators/new", "new")
   jsxref("TypeError")
   jsxref("ArrayBuffer")
   jsxref("DataView")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/toLocaleString (TypedArray.prototype.toLocaleString())
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat', 'Parameters')
   SpecName('ES2015', '#sec-%typedarray%.prototype.tolocalestring', 'TypedArray.prototype.toLocaleString')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-%typedarray%.prototype.tolocalestring', 'TypedArray.prototype.toLocaleString')
   Spec2('ESDraft')
   Compat("javascript.builtins.TypedArray.toLocaleString")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer (ArrayBuffer)
   jsxref("DataView")
   EmbedInteractiveExample("pages/js/arraybuffer-constructor.html")
   jsxref("RangeError")
   jsxref("Number.MAX_SAFE_INTEGER")
   jsxref("ArrayBuffer.@@species", "get ArrayBuffer[@@species]")
   jsxref("ArrayBuffer.prototype")
   jsxref("DataView")
   jsxref("ArrayBuffer.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/prototype','Methods')
   jsxref("Global_Objects/Int32Array", "Int32Array")
   SpecName('Typed Array')
   Spec2('Typed Array')
   SpecName('ES6', '#sec-arraybuffer-constructor', 'ArrayBuffer')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-arraybuffer-constructor', 'ArrayBuffer')
   Spec2('ESDraft')
   Compat("javascript.builtins.ArrayBuffer")
   jsxref("Operators/new", "new")
   jsxref("TypeError")
   jsxref("SharedArrayBuffer")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Object (Object)
   jsxref("null")
   jsxref("undefined")
   jsxref("Object.prototype")
   jsxref("Object.entries")
   jsxref("Object.prototype")
   **page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype", "Properties")
   **page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype", "Methods")
   jsxref("Boolean")
   SpecName('ESDraft', '#sec-object-objects', 'Object')
   Spec2('ESDraft')
   SpecName('ES6', '#sec-object-objects', 'Object')
   Spec2('ES6')
   SpecName('ES5.1', '#sec-15.2', 'Object')
   Spec2('ES5.1')
   SpecName('ES1')
   Spec2('ES1')
   Compat("javascript.builtins.Object")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Error (Error)
   JSxRef("Error.prototype")
   JSxRef("Operators/new", "new")
   JSxRef("EvalError")
   JSxRef("InternalError")
   JSxRef("RangeError")
   JSxRef("ReferenceError")
   JSxRef("SyntaxError")
   JSxRef("TypeError")
   JSxRef("URIError")
   JSxRef("Error.prototype")
   JSxRef("Error.prototype.stack", "stack")
   **page('/en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Description')
   **page('/en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Properties', '', '', 3)
   **page('/en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Methods')
   JSxRef("Statements/throw", "throw")
   JSxRef("Statements/try...catch", "try...catch")
   JSxRef("Object.prototype.constructor", "constructor")
   JSxRef("Operators/instanceof", "instanceof")
   SpecName('ESDraft', '#sec-error-objects', 'Error')
   Spec2('ESDraft')
   SpecName('ES2015', '#sec-error-objects', 'Error')
   Spec2('ES2015')
   SpecName('ES5.1', '#sec-15.11', 'Error')
   Spec2('ES5.1')
   SpecName('ES1')
   Spec2('ES1')
   Compat("javascript.builtins.Error")
   JSxRef("Error.prototype")
   JSxRef("Statements/throw", "throw")
   JSxRef("Statements/try...catch", "try...catch")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy (Proxy)
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler', 'Methods')
   SpecName('ES2015', '#sec-proxy-objects', 'Proxy')
   Spec2('ES2015')
   SpecName('ES2016', '#sec-proxy-objects', 'Proxy')
   Spec2('ES2016')
   SpecName('ES2017', '#sec-proxy-objects', 'Proxy')
   Spec2('ES2017')
   SpecName('ESDraft', '#sec-proxy-objects', 'Proxy')
   Spec2('ESDraft')
   Compat("javascript.builtins.Proxy", 2)
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError (URIError)
   jsxref("URIError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError/prototype', 'Methods')
   SpecName('ES3', '#sec-15.11.6.6', 'URIError')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.11.6.6', 'URIError')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-urierror', 'URIError')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-urierror', 'URIError')
   Spec2('ESDraft')
   Compat("javascript.builtins.URIError")
   jsxref("Error")
   jsxref("URIError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError (TypeError)
   jsxref("TypeError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError/prototype', 'Methods')
   SpecName('ES3', '#sec-15.11.6.5', 'TypeError')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.11.6.5', 'TypeError')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-typeerror', 'TypeError')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-typeerror', 'TypeError')
   Spec2('ESDraft')
   Compat("javascript.builtins.TypeError")
   jsxref("Error")
   jsxref("TypeError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError (SyntaxError)
   jsxref("SyntaxError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype', 'Methods')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-syntaxerror', 'SyntaxError')
   Spec2('ESDraft')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-syntaxerror', 'SyntaxError')
   Spec2('ES6')
   SpecName('ES5.1', '#sec-15.11.6.4', 'SyntaxError')
   Spec2('ES5.1')
   SpecName('ES3')
   Spec2('ES3')
   Compat("javascript.builtins.SyntaxError")
   jsxref("Error")
   jsxref("SyntaxError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError (RangeError)
   jsxref("Array")
   jsxref("RangeError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError/prototype', 'Methods')
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.11.6.2', 'RangeError')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-rangeerror', 'RangeError')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-rangeerror', 'RangeError')
   Spec2('ESDraft')
   Compat("javascript.builtins.RangeError")
   jsxref("Error")
   jsxref("RangeError.prototype")
   jsxref("Array")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError (ReferenceError)
   jsxref("ReferenceError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype', 'Methods')
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.11.6.3', 'ReferenceError')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-referenceerror', 'ReferenceError')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-referenceerror', 'ReferenceError')
   Spec2('ESDraft')
   Compat("javascript.builtins.ReferenceError")
   jsxref("Error")
   jsxref("ReferenceError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError (EvalError)
   jsxref("EvalError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError/prototype', 'Methods')
   SpecName('ES3')
   Spec2('ES3')
   SpecName('ES5.1', '#sec-15.11.6.1', 'EvalError')
   Spec2('ES5.1')
   SpecName('ES6', '#sec-native-error-types-used-in-this-standard-evalerror', 'EvalError')
   Spec2('ES6')
   SpecName('ESDraft', '#sec-native-error-types-used-in-this-standard-evalerror', 'EvalError')
   Spec2('ESDraft')
   Compat("javascript.builtins.EvalError")
   jsxref("Error")
   jsxref("EvalError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator (Intl.Collator)
   EmbedInteractiveExample("pages/js/intl-collator.html")
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_negotiation", 1)
   jsxref("Collator.prototype", "Intl.Collator.prototype")
   **page('en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/prototype', 'Properties')
   **page('en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/prototype', 'Methods')
   SpecName('ES Int 1.0', '#sec-10.1', 'Intl.Collator')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-10.1', 'Intl.Collator')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#collator-objects', 'Intl.Collator')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Intl.Collator")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat (Intl.NumberFormat)
   EmbedInteractiveExample("pages/js/intl-numberformat.html")
   jsxref("Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_negotiation", 1)
   jsxref("NumberFormat.prototype", "Intl.NumberFormat.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/prototype', 'Methods')
   SpecName('ES Int 1.0', '#sec-11.1', 'Intl.NumberFormat')
   Spec2('ES Int 1.0')
   SpecName('ES Int 2.0', '#sec-11.1', 'Intl.NumberFormat')
   Spec2('ES Int 2.0')
   SpecName('ES Int Draft', '#numberformat-objects', 'Intl.NumberFormat')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Intl.NumberFormat")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat (Intl.DateTimeFormat)
   EmbedInteractiveExample("pages/js/intl-datetimeformat.html")
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_negotiation", 1)
   jsxref("undefined")
   jsxref("undefined")
   jsxref("DateTimeFormat.prototype", "Intl.DateTimeFormat.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/prototype', 'Methods')
   SpecName('ES Int Draft', '#datetimeformat-objects', 'Intl.DateTimeFormat')
   Spec2('ES Int Draft')
   SpecName('ES Int 2.0', '#sec-12.1', 'Intl.DateTimeFormat')
   Spec2('ES Int 2.0')
   SpecName('ES Int 1.0', '#sec-12.1', 'Intl.DateTimeFormat')
   Spec2('ES Int 1.0')
   Compat("javascript.builtins.Intl.DateTimeFormat")
   EmbedTest262ReportResultsTable("Intl.DateTimeFormat-datetimestyle")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatRange (Intl.DateTimeFormat.prototype.formatRange())
   jsxref("DateTimeFormat", "Intl.DateTimeFormat")
   EmbedInteractiveExample("pages/js/intl-datetimeformat-prototype-formatrange.html")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet (WeakSet)
   jsxref("Set")
   jsxref("Set")
   jsxref("WeakSet.prototype")
   jsxref("WeakSet.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/WeakSet/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/WeakSet/prototype','Methods')
   SpecName('ES2015', '#sec-weakset-objects', 'WeakSet')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-weakset-objects', 'WeakSet')
   Spec2('ESDraft')
   Compat("javascript.builtins.WeakSet")
   jsxref("Map")
   jsxref("Set")
   jsxref("WeakMap")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError (InternalError)
   jsxref("InternalError.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError/prototype', 'Methods')
   Compat("javascript.builtins.InternalError")
   jsxref("Error")
   jsxref("InternalError.prototype")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol (Symbol)
   Glossary("Primitive", "primitive data type")
   EmbedInteractiveExample("pages/js/symbol-constructor.html")
   jsxref("Operators/new", "new")
   jsxref("TypeError")
   jsxref("Symbol.prototype")
   jsxref("Symbol.iterator")
   jsxref("Symbol.asyncIterator")
   jsxref("Symbol.match")
   jsxref("Symbol.matchAll")
   jsxref("Symbol.replace")
   jsxref("Symbol.search")
   jsxref("Symbol.split")
   jsxref("Symbol.hasInstance")
   jsxref("Operators/instanceof", "instanceof")
   jsxref("Symbol.isConcatSpreadable")
   jsxref("Symbol.unscopables")
   jsxref("Symbol.species")
   jsxref("Symbol.toPrimitive")
   jsxref("Symbol.toStringTag")
   jsxref("Symbol.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')
   jsxref("Operators/typeof", "typeof")
   jsxref("TypeError")
   jsxref("TypeError")
   SpecName('ES2015', '#sec-symbol-objects', 'Symbol')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')
   Spec2('ESDraft')
   Compat("javascript.builtins.Symbol")
   jsxref("Operators/typeof", "typeof")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction (GeneratorFunction)
   jsxref("Statements/function*", "generator function")
   jsxref("Statements/function*", "generator function")
   jsxref("Statements/function*", "function* expression")
   jsxref("Statements/function*", "generator function")
   jsxref("Global_Objects/eval", "eval")
   jsxref("GeneratorFunction.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction/prototype', 'Properties')
   jsxref("GeneratorFunction.prototype")
   SpecName('ES2015', '#sec-generatorfunction-objects', 'GeneratorFunction')
   Spec2('ES2015')
   SpecName('ESDraft', '#sec-generatorfunction-objects', 'GeneratorFunction')
   Spec2('ESDraft')
   Compat("javascript.builtins.GeneratorFunction")
   jsxref("Statements/function*", "function* function")
   jsxref("Operators/function*", "function* expression")
   jsxref("Global_Objects/Function", "Function")
   jsxref("Statements/function", "function statement")
   jsxref("Operators/function", "function expression")
   jsxref("Functions_and_function_scope", "Functions and function scope", "", 1)
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer (SharedArrayBuffer)
   jsxref("ArrayBuffer")
   EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")
   jsxref("SharedArrayBuffer")
   jsxref("ArrayBuffer")
   jsxref("Atomics", "atomic", "", 1)
   jsxref("Operators/new", "new")
   jsxref("TypeError")
   jsxref("SharedArrayBuffer.prototype")
   jsxref("SharedArrayBuffer.prototype")
   **page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Properties')
   **page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Methods')
   SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')
   Spec2('ESDraft')
   SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')
   Spec2('ES8')
   Compat("javascript.builtins.SharedArrayBuffer")
   jsxref("Atomics")
   jsxref("ArrayBuffer")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction (AsyncFunction)
   jsxref("Statements/async_function", "async function")
   jsxref("Statements/async_function", "async function")
   jsxref("Statements/async_function", "async function expression")
   jsxref("Statements/async_function", "async functions")
   jsxref("Global_Objects/eval", "eval")
   jsxref("AsyncFunction.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction/prototype', 'Properties')
   jsxref("AsyncFunction.prototype")
   SpecName('ESDraft', '#sec-async-function-objects', 'AsyncFunction object')
   Spec2('ESDraft')
   Compat("javascript.builtins.AsyncFunction")
   jsxref("Statements/async_function", "async function function")
   jsxref("Operators/async_function", "async function expression")
   jsxref("Global_Objects/Function", "Function")
   jsxref("Statements/function", "function statement")
   jsxref("Operators/function", "function expression")
   jsxref("Functions_and_function_scope", "Functions and function scope", "", 1)
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module (WebAssembly.Module)
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/prototype', 'Properties')
   Spec2('WebAssembly JS')
   Compat("javascript.builtins.WebAssembly.Module")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance (WebAssembly.Instance)
   jsxref("WebAssembly.Module")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/prototype', 'Properties')
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/prototype', 'Methods')
   SpecName('WebAssembly JS', '#webassemblyinstance-objects', 'Instance')
   Spec2('WebAssembly JS')
   Compat("javascript.builtins.WebAssembly.Instance")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global (WebAssembly.Global)
   jsxref("WebAssembly.Module")
   domxref("USVString")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global/prototype', 'Properties')
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global/prototype', 'Methods')
   Spec2('WebAssembly JS')
   Compat("javascript.builtins.WebAssembly.Global")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules (Intl.PluralRules)
   jsxref("Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_negotiation", 1)
   jsxref("PluralRules.prototype", "Intl.PluralRules.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/prototype', 'Methods')
   Spec2('ES Int Draft')
   Compat("javascript.builtins.Intl.PluralRules")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toLocaleString (BigInt.prototype.toLocaleString())
   EmbedInteractiveExample("pages/js/bigint-tolocalestring.html")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat', 'Parameters')
   jsxref("NumberFormat")
   jsxref("NumberFormat.format")
   Compat("javascript.builtins.BigInt.toLocaleString")
**DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat (Intl.RelativeTimeFormat)
   EmbedInteractiveExample("pages/js/intl-relativetimeformat.html")
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("RelativeTimeFormat.prototype", "Intl.RelativeTimeFormat.prototype")
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/prototype', 'Properties')
   **page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/prototype', 'Methods')
   Compat("javascript.builtins.Intl.RelativeTimeFormat")
DOC: /en-US/docs/Web/JavaScript/Reference/Global_Objects/ListFormat (Intl.ListFormat)
   EmbedInteractiveExample("pages/js/intl-listformat.html")
   jsxref("Global_Objects/Intl", "Intl page", "#Locale_identification_and_negotiation", 1)
   jsxref("ListFormat.prototype", "Intl.ListFormat.prototype")
   Compat("javascript.builtins.Intl.ListFormat")
   page('/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl', 'See_also')
DOC: /en-US/docs/Web/JavaScript/New_in_JavaScript/Firefox_JavaScript_changelog (Firefox JavaScript changelog)
   jsSidebar("New_in_JS")
   page('en-US/docs/Mozilla/Firefox/Releases/52','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/51','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/50','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/49','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/48','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/47','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/46','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/45','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/44','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/43','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/42','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/41','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/40','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/39','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/38','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/37','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/36','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/35','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/34','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/33','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/32','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/31','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/30','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/29','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/28','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/27','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/26','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/25','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/24','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/23','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/22','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/21','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/20','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/19','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/18','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/17','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/16','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/15','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/14','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/13','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/12','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/11','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/10','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/9','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/8','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/7','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/6','JavaScript')
   page('en-US/docs/Mozilla/Firefox/Releases/5','JavaScript')
DOC: /en-US/docs/Web/JavaScript/Guide/Introduction (Introduction)
   jsSidebar("JavaScript Guide")
   PreviousNext("Web/JavaScript/Guide", "Web/JavaScript/Guide/Grammar_and_types")
   Glossary("WWW")
   Glossary("HTML")
   page("/en-US/docs/Tools/Web_Console/The_command_line_interpreter", "Multi-line_mode")
   PreviousNext("Web/JavaScript/Guide", "Web/JavaScript/Guide/Grammar_and_types")
DOC: /en-US/docs/Web/JavaScript/Guide/Indexed_collections (Indexed collections)
   jsSidebar("JavaScript Guide")
   PreviousNext("Web/JavaScript/Guide/Regular_Expressions", "Web/JavaScript/Guide/Keyed_Collections")
   jsxref("Array")
   jsxref("TypedArray")
   jsxref("Statements/for...in","for...in")
   jsxref("Array.of")
   jsxref("Statements/for...in","for...in")
   jsxref("Array")
   domxref("window")
   domxref("NodeList")
   jsxref("Functions/arguments","arguments")
   jsxref("Global_Objects/Function/length","length")
   jsxref("Array")
   jsxref("ArrayBuffer")
   jsxref("ArrayBuffer")
   jsxref("DataView")
   page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "TypedArray_objects")
   jsxref("TypedArray")
   PreviousNext("Web/JavaScript/Guide/Regular_Expressions", "Web/JavaScript/Guide/Keyed_Collections")
DOC: /en-US/docs/Web/JavaScript/Guide/Using_promises (Using Promises)
   jsSidebar("JavaScript Guide")
   PreviousNext("Web/JavaScript/Guide/Details_of_the_Object_Model", "Web/JavaScript/Guide/Iterators_and_Generators")
   jsxref("Promise")
   domxref("window")
   domxref("Worker")
   domxref("Window.rejectionhandled_event", "rejectionhandled")
   domxref("Window.unhandledrejection_event", "unhandledrejection")
   domxref("PromiseRejectionEvent")
   domxref("PromiseRejectionEvent.promise", "promise")
   domxref("PromiseRejectionEvent.reason", "reason")
   Glossary("Node.js")
   domxref("Window.unhandledrejection_event", "unhandledrejection")
   jsxref("Promise")
   page("/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide", "Ensuring_ordering_on_conditional_use_of_promises")
   PreviousNext("Web/JavaScript/Guide/Details_of_the_Object_Model", "Web/JavaScript/Guide/Iterators_and_Generators")

@Elchi3
Copy link
Member

Elchi3 commented Jan 7, 2020

There is a lot to unpack for me in here, but I'm not really disagreeing with anything said or discussed. Very nice work, Will!

On the page macro:

But it is used quite extensively in the JS docs to include instance properties and methods from the corresponding Foo/prototype page.

Yes, but I'm planning to get rid of this completely. So, I guess it is "replace" and the implementation of "replace" has been hashed out in London already: mdn/sprints#2571. For the remaining usage of {{page}} (that are not Foo/prototype pages), I think we probably remove or render. Need to see this case by case, but I don't want to support transclusion unnecessarily at this point.

On the EmbedTest262ReportResultsTable macro:

I'd be happy to remove it, but it is very new (mdn/kumascript#1245). As I understand it, it is experimental and I don't know what the status of the experiment is. I think Florian's input is needed here.

We need to get results back from Bocoup and then we need to make a call. I agree with y'all about the questionable usefulness, but I'd like to also give the metrics a chance to speak for themselves first.

On docstatus, index, or any "meta" pages:

Let's remove all this. If needed, we will have to re-invent these tools.

@wbamberg
Copy link
Collaborator Author

wbamberg commented Jan 7, 2020

Thanks for the reviews everyone. I'm going to summarize our choices below and close this issue.


Remove:

  • obsolete_inline
  • Obsolete_Header
  • Note
  • geckoRelease
  • Gecko
  • Index

Render:

  • jsxref
  • domxref
  • bug
  • HTMLElement
  • anch
  • interwiki
  • htmlattrxref
  • HTTPHeader
  • SectionOnPage
  • RFC
  • Glossary
  • page[0]

Replace:

  • jsSidebar
  • JSRef
  • PreviousNext
  • Previous
  • Next
  • js_property_attributes (info_box)
  • EmbedInteractiveExample [1]
  • EmbedLiveSample [1]
  • JSFiddleEmbed (after converting to EmbedLiveSample) [1]
  • Compat [1]
  • SpecName [1]
  • Spec2 [1]
  • ListSubPages [1]
  • jsindex [1]

To do

  • EmbedTest262ReportResultsTable: we need to decide whether to keep this feature or not. If we want to keep the feature we need to replace this macro

[0] many calls to this macro will be removed in the course of mdn/sprints#2571
[1] already supported in stumptown

@wbamberg wbamberg closed this as completed Jan 7, 2020
@wbamberg wbamberg reopened this Feb 3, 2020
@wbamberg
Copy link
Collaborator Author

wbamberg commented Feb 4, 2020

We did some work on this in Berlin, and:

  • removed/rendered some macro calls
  • realised that the linter was missing some
  • reconsidered some of the choices

So I'd like to reopen this issue with an updated proposal:


Retain/replace:

Non-standard_Header [0]
Obsolete_Header [0]
deprecated_header [0]
SeeCompatTable [0]
JSRef
JsSidebar
PreviousNext
Next
Previous
js_property_attributes
EmbedInteractiveExample
EmbedLiveSample
SpecName
Spec2
ListSubPages

Render:

jsxref [1]
bug [1]
Glossary [1]
domxref [1]
page

Remove

Draft
non-standard_inline [2]
Obsolete_inline [2]
ReadOnlyInline [2]
experimental_inline [2]
deprecated_inline [2]
optional_inline [2]
Index

To do:

EmbedTest262ReportResultsTable

Notes

[0] These are all what we sometimes call "banners". They create a banner across the page warning that the item is (for example) deprecated. See e.g. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Expression_closures for a nice pile of these things. We had triaged these as "remove", but Florian pointed out that without them, it would sometimes be hard to notice this important attribute. It should be present in BCD, but the way this is represented in the rendered page makes it very easy to miss. Currently it's a problem that this attribute is recorded in two or more places - the BCD itself and the macro call. Ideally, the attribute would only be recorded in BCD, and the renderer would add the header/banner automatically. So the proposal is to keep these macros in Kuma, and update stumptown so it can automatically set the header based on the BCD. Then the scraper's "replace" algorithm is just to remove the macros.

[1] These are xrefs. Before rendering them, we would like to update the macro so it does not include the title summary.

[2] These are what we sometimes call "badges". They are supposed to convey similar information to banners, but appear next to the link to the page for the item, rather than on the page itself. They are typically rendered as icons like 👎 . I think it would be OK to just remove these - anyone clicking the link will see that the item is deprecated.


@Elchi3 , @ddbeck , comments?

@ddbeck
Copy link
Contributor

ddbeck commented Feb 4, 2020

I'm happy with this update. I'm going to spend some more time this week on improving the linter in the hopes that we'll reliably catch macros (I think I've got an approach that's workable).

@Elchi3
Copy link
Member

Elchi3 commented Feb 4, 2020

Makes sense to me. Thanks Will for capturing this discussion so nicely!

@wbamberg
Copy link
Collaborator Author

wbamberg commented Feb 4, 2020

{{page}} is actually annoying and I think will involve case-by-case work. Very often it seems like it could be replaced with a link. Sometimes (e.g. in https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference$edit ) it should be replaced by some landing page magic. Sometimes probably it should be rendered.

@Elchi3
Copy link
Member

Elchi3 commented Feb 6, 2020

[1] These are xrefs. Before rendering them, we would like to update the macro so it does not include the title summary.

I've filed this as mdn/sprints#2787 now.

@wbamberg
Copy link
Collaborator Author

wbamberg commented Mar 2, 2020

We've discussed this elsewhere, but for the record: optional_inline, and (less so, but for similar reasons) readonlyinline should not be triaged as "remove". Consensus was to render them out, and, at least initially, embedding the rendered HTML in the Markdown.

We might want to remove this as some future cleanup operation. "optional_inline" is called 198 times in the JS docs, and from 689 pages in all our docs (en-US). Which, while it is a lot, seems fewer than we would expect if it were being used consistently.

@wbamberg
Copy link
Collaborator Author

wbamberg commented Mar 3, 2020

Updated triage list, based on changes mentioned in https://github.com/mdn/sprints/issues/2520#issuecomment-593684240:


Retain/replace:

Non-standard_Header
Obsolete_Header
deprecated_header
SeeCompatTable
JSRef
JsSidebar
PreviousNext
Next
Previous
js_property_attributes
EmbedInteractiveExample
EmbedLiveSample
SpecName
Spec2
ListSubPages

Render:

jsxref
bug
Glossary
domxref
page - this macro is gone from the JS docs: mdn/sprints#2798. Thanks Florian!
optional_inline
ReadOnlyInline

Remove

Draft
non-standard_inline
Obsolete_inline
experimental_inline
deprecated_inline
Index

To do:

EmbedTest262ReportResultsTable

@jmswisher
Copy link

Taking this issue out of the Tracy Chapman milestone, so I can close that milestone.

@chrisdavidmills chrisdavidmills transferred this issue from mdn/sprints Feb 8, 2021
@peterbe
Copy link
Contributor

peterbe commented Feb 8, 2021

Regarding the list of "Remove" (above)...
Since #2746 it's now a flaw to use one of the KS macros whose code (.ejs file) includes the line mdn.deprecated(). And it's a fixable flaw so it will automatically remove the KS macro. So, to tackle the KS macros that should be removed, you just need to update the .ejs file to have that line (look at

for an example)
So let's compare that list with what we've got:

  • Draft
  • Non-standard_inline
  • Obsolete_inline
  • experimental_inline
  • deprecated_inline
  • Index

(in other words, at the time of writing, all of these macros render out and are not cleaned up with the flaw-system)

A tricky one is Index. If that macro should be removed what should happen to all the pages whose slug ends with Index. E.g. https://github.com/mdn/content/blob/main/files/en-us/web/api/index/index.html

@peterbe
Copy link
Contributor

peterbe commented Feb 8, 2021

Also, can we not say that this issue is complete and can closed? If Will's comment above is the final verdict, then that answers the issue's title and the next action is to explode this into fresh new smaller atoms of issues that we can work against.

@mirai-anime
This comment has been minimized.
@github-actions github-actions bot added the 🐌 idle Issues and PRs without recent activity. Flagged for maintainer follow-up. label Nov 25, 2021
@Elchi3
Copy link
Member

Elchi3 commented Feb 16, 2022

@schalkneethling asked for input on this. So here are my thoughts.

I think we have less macros these days but not all can be removed yet. (I haven't done a grep on macro usage but suspecting the list above is more or less accurate).

  • Banners (non-standard, deprecated, seeCompatTable) should be driven by BCD (proposal: OWD project: Generate "experimental" banners from BCD openwebdocs/project#81)
  • Sidebars (JSRef, JsSidebar) need a sidebar project (there was once talk to have yaml files drive sidebar generation)
  • Interactive Examples may want to see how it's possibly to embed them without KS?
  • SpecName/Spec2 are 98% gone thanks to the spec project I did last year.
  • Link macros (jsxref, previous, previousnext, glossary, bug) can probably be replaced by plain markdown links.

@schalkneethling schalkneethling added 🚉 platform keeping the platform healthy and removed 🐌 idle Issues and PRs without recent activity. Flagged for maintainer follow-up. labels Feb 16, 2022
@teoli2003
Copy link
Contributor

  • I think that with @sideshowbarker PR (Add support for 'spec-urls' frontmatter key #5284) about spec_url we should be able to deal with most of the remaining SpecName Spec2 entries (special cases like Aria, but also overview pages linking to whole specs).
  • The page macros are little by little replaced by @hamishwillee (mostly).
  • I agree that all link macros could be replaced by plain markdown links nowadays (thank you Markdown): this is likely scriptable.

@SphinxKnight
Copy link
Member

If I may (re: mdn/translated-content)

@wbamberg
Copy link
Collaborator Author

wbamberg commented Feb 16, 2022

Link macros (jsxref, previous, previousnext, glossary, bug) can probably be replaced by plain markdown links.

I've been thinking about this a bit recently. It feels like something changed in Yari that made the syntax for xrefs more complicated. I think there used to be a reasonable argument that xref syntax was simpler even than Markdown links, but often these days I find myself writing something like:

{{jsxref("Operators/await", "await")}}

and wondering in which ways that is better, syntactically, than:

[`await`](/en-US/docs/Web/JavaScript/Reference/Operators/await)

As people have said upthread: given a consensus that we want to do this, it would be quite a mechanical task. According to the KS landscape doc this is the second biggest group of macros (almost certainly the biggest now, since most of the "internal" group should have been removed or be removable).

{{previous}} and {{previousnext}} are different though because they want particular styling, so plain Markdown won't work. Stumptown had an abstraction called a "chapter list" which was intended to enable auto-generation of these types of links: mdn/stumptown-content#265.

@github-actions github-actions bot added the 🐌 idle Issues and PRs without recent activity. Flagged for maintainer follow-up. label Mar 25, 2022
Repository owner moved this from Backlog to Done in Yari Platform Engineering May 27, 2022
@teoli2003
Copy link
Contributor

We have deleted/deprecated a lot of macros since then. But this is still valid, even if {{page}}, {{SpecName}}and {{Spec2}} are now gone from mdn/content. (And many others are now gone).

Dealing with banners would be a contained (and doable) project (on the dev side), to move this project forward, while we continue to remove the use of the long tail of macros.

Sidebars macros depend on the page-type project (adding page-type to the YAML header) and the renaming of the page (which will add another YAML header). Once this is done, we should be mature enough to start a sidebar project.

* Banners (non-standard, deprecated, seeCompatTable) should be driven by BCD (proposal: [OWD project proposal: Generate "experimental" banners from BCD openwebdocs/project#81](https://github.com/openwebdocs/project/issues/81))

* Sidebars (JSRef, JsSidebar) need a sidebar project (there was once talk to have yaml files drive sidebar generation)

* Interactive Examples may want to see how it's possibly to embed them without KS?

* Link macros (jsxref, previous, previousnext, glossary, bug) can probably be replaced by plain markdown links.

@schalkneethling
Copy link

We have deleted/deprecated a lot of macros since then. But this is still valid, even if {{page}}, {{SpecName}}and {{Spec2}} are now gone from mdn/content. (And many others are now gone).

Dealing with banners would be a contained (and doable) project (on the dev side), to move this project forward, while we continue to remove the use of the long tail of macros.

Sidebars macros depend on the page-type project (adding page-type to the YAML header) and the renaming of the page (which will add another YAML header). Once this is done, we should be mature enough to start a sidebar project.

* Banners (non-standard, deprecated, seeCompatTable) should be driven by BCD (proposal: [OWD project proposal: Generate "experimental" banners from BCD openwebdocs/project#81](https://github.com/openwebdocs/project/issues/81))

* Sidebars (JSRef, JsSidebar) need a sidebar project (there was once talk to have yaml files drive sidebar generation)

* Interactive Examples may want to see how it's possibly to embed them without KS?

* Link macros (jsxref, previous, previousnext, glossary, bug) can probably be replaced by plain markdown links.

I have no idea what is going on. There are a LOT of issues being closed by the github-actions bot.

@caugner caugner added p2 We want to address this but may have other higher priority items. macros tracking issues related to kumascript macros labels Nov 30, 2022
@github-actions github-actions bot added the idle label Dec 30, 2022
@caugner
Copy link
Contributor

caugner commented Jun 24, 2024

Most of these macros have already been replaced, and this is obsolete with the rari work, so I'm closing this as resolved.

@caugner caugner closed this as completed Jun 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐌 idle Issues and PRs without recent activity. Flagged for maintainer follow-up. idle macros tracking issues related to kumascript macros p2 We want to address this but may have other higher priority items. 🚉 platform keeping the platform healthy
Projects
Development

No branches or pull requests