@playdrop/playdrop-cli 0.12.41 → 0.13.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.
Files changed (116) hide show
  1. package/config/client-meta.json +2 -2
  2. package/dist/apps/index.d.ts +3 -0
  3. package/dist/apps/index.js +3 -1
  4. package/dist/apps/loadCheck.d.ts +21 -1
  5. package/dist/apps/loadCheck.js +253 -1
  6. package/dist/apps/playtestContract.d.ts +2 -0
  7. package/dist/apps/playtestContract.js +77 -0
  8. package/dist/apps/staticHtml.d.ts +28 -0
  9. package/dist/apps/staticHtml.js +343 -0
  10. package/dist/apps/upload.d.ts +1 -0
  11. package/dist/apps/upload.js +17 -0
  12. package/dist/apps/validate.js +2 -1
  13. package/dist/commands/devServer.js +19 -0
  14. package/dist/commands/feedback.d.ts +2 -0
  15. package/dist/commands/feedback.js +44 -2
  16. package/dist/commands/upload.d.ts +24 -0
  17. package/dist/commands/upload.js +131 -60
  18. package/dist/commands/worker/instrument-evidence.js +1 -1
  19. package/dist/commands/worker/runtime.d.ts +14 -0
  20. package/dist/commands/worker/runtime.js +97 -8
  21. package/dist/commands/worker.d.ts +27 -2
  22. package/dist/commands/worker.js +688 -146
  23. package/dist/index.js +7 -0
  24. package/dist/listingPreflight.js +15 -4
  25. package/node_modules/@playdrop/api-client/dist/client.d.ts +6 -2
  26. package/node_modules/@playdrop/api-client/dist/client.d.ts.map +1 -1
  27. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts +3 -2
  28. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts.map +1 -1
  29. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.js +13 -2
  30. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts +3 -1
  31. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts.map +1 -1
  32. package/node_modules/@playdrop/api-client/dist/domains/apps.js +11 -0
  33. package/node_modules/@playdrop/api-client/dist/domains/me.d.ts +2 -1
  34. package/node_modules/@playdrop/api-client/dist/domains/me.d.ts.map +1 -1
  35. package/node_modules/@playdrop/api-client/dist/domains/me.js +11 -0
  36. package/node_modules/@playdrop/api-client/dist/index.d.ts +6 -3
  37. package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
  38. package/node_modules/@playdrop/api-client/dist/index.js +14 -2
  39. package/node_modules/@playdrop/config/client-meta.json +2 -2
  40. package/node_modules/@playdrop/config/dist/src/constants.d.ts +1 -0
  41. package/node_modules/@playdrop/config/dist/src/constants.d.ts.map +1 -1
  42. package/node_modules/@playdrop/config/dist/src/constants.js +1 -0
  43. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  44. package/node_modules/@playdrop/types/dist/api.d.ts +195 -4
  45. package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
  46. package/node_modules/@playdrop/types/dist/api.js +25 -2
  47. package/node_modules/@playdrop/types/dist/app-playtest-tape.d.ts +4 -0
  48. package/node_modules/@playdrop/types/dist/app-playtest-tape.d.ts.map +1 -1
  49. package/node_modules/@playdrop/types/dist/app-playtest-tape.js +56 -0
  50. package/node_modules/@playdrop/types/dist/version.d.ts +49 -1
  51. package/node_modules/@playdrop/types/dist/version.d.ts.map +1 -1
  52. package/node_modules/entities/decode-codepoint.d.ts +19 -0
  53. package/node_modules/entities/decode-codepoint.d.ts.map +1 -0
  54. package/node_modules/entities/decode-codepoint.js +77 -0
  55. package/node_modules/entities/decode-codepoint.js.map +1 -0
  56. package/node_modules/entities/decode.d.ts +209 -0
  57. package/node_modules/entities/decode.d.ts.map +1 -0
  58. package/node_modules/entities/decode.js +511 -0
  59. package/node_modules/entities/decode.js.map +1 -0
  60. package/node_modules/entities/encode.d.ts +22 -0
  61. package/node_modules/entities/encode.d.ts.map +1 -0
  62. package/node_modules/entities/encode.js +73 -0
  63. package/node_modules/entities/encode.js.map +1 -0
  64. package/node_modules/entities/escape.d.ts +43 -0
  65. package/node_modules/entities/escape.d.ts.map +1 -0
  66. package/node_modules/entities/escape.js +121 -0
  67. package/node_modules/entities/escape.js.map +1 -0
  68. package/node_modules/entities/generated/decode-data-html.d.ts +2 -0
  69. package/node_modules/entities/generated/decode-data-html.d.ts.map +1 -0
  70. package/node_modules/entities/generated/decode-data-html.js +10 -0
  71. package/node_modules/entities/generated/decode-data-html.js.map +1 -0
  72. package/node_modules/entities/generated/decode-data-xml.d.ts +2 -0
  73. package/node_modules/entities/generated/decode-data-xml.d.ts.map +1 -0
  74. package/node_modules/entities/generated/decode-data-xml.js +10 -0
  75. package/node_modules/entities/generated/decode-data-xml.js.map +1 -0
  76. package/node_modules/entities/generated/encode-html.d.ts +8 -0
  77. package/node_modules/entities/generated/encode-html.d.ts.map +1 -0
  78. package/node_modules/entities/generated/encode-html.js +13 -0
  79. package/node_modules/entities/generated/encode-html.js.map +1 -0
  80. package/node_modules/entities/index.d.ts +96 -0
  81. package/node_modules/entities/index.d.ts.map +1 -0
  82. package/node_modules/entities/index.js +131 -0
  83. package/node_modules/entities/index.js.map +1 -0
  84. package/node_modules/entities/package.json +3 -0
  85. package/node_modules/parse5/common/doctype.d.ts +4 -0
  86. package/node_modules/parse5/common/doctype.js +118 -0
  87. package/node_modules/parse5/common/error-codes.d.ts +67 -0
  88. package/node_modules/parse5/common/error-codes.js +66 -0
  89. package/node_modules/parse5/common/foreign-content.d.ts +9 -0
  90. package/node_modules/parse5/common/foreign-content.js +237 -0
  91. package/node_modules/parse5/common/html.d.ts +289 -0
  92. package/node_modules/parse5/common/html.js +528 -0
  93. package/node_modules/parse5/common/token.d.ts +84 -0
  94. package/node_modules/parse5/common/token.js +24 -0
  95. package/node_modules/parse5/common/unicode.d.ts +42 -0
  96. package/node_modules/parse5/common/unicode.js +70 -0
  97. package/node_modules/parse5/index.d.ts +71 -0
  98. package/node_modules/parse5/index.js +54 -0
  99. package/node_modules/parse5/package.json +1 -0
  100. package/node_modules/parse5/parser/formatting-element-list.d.ts +36 -0
  101. package/node_modules/parse5/parser/formatting-element-list.js +114 -0
  102. package/node_modules/parse5/parser/index.d.ts +221 -0
  103. package/node_modules/parse5/parser/index.js +3240 -0
  104. package/node_modules/parse5/parser/open-element-stack.d.ts +53 -0
  105. package/node_modules/parse5/parser/open-element-stack.js +328 -0
  106. package/node_modules/parse5/serializer/index.d.ts +60 -0
  107. package/node_modules/parse5/serializer/index.js +172 -0
  108. package/node_modules/parse5/tokenizer/index.d.ts +247 -0
  109. package/node_modules/parse5/tokenizer/index.js +2714 -0
  110. package/node_modules/parse5/tokenizer/preprocessor.d.ts +36 -0
  111. package/node_modules/parse5/tokenizer/preprocessor.js +200 -0
  112. package/node_modules/parse5/tree-adapters/default.d.ts +84 -0
  113. package/node_modules/parse5/tree-adapters/default.js +176 -0
  114. package/node_modules/parse5/tree-adapters/interface.d.ts +255 -0
  115. package/node_modules/parse5/tree-adapters/interface.js +2 -0
  116. package/package.json +7 -1
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SEQUENCES = exports.CODE_POINTS = exports.REPLACEMENT_CHARACTER = void 0;
4
+ exports.isSurrogate = isSurrogate;
5
+ exports.isSurrogatePair = isSurrogatePair;
6
+ exports.getSurrogatePairCodePoint = getSurrogatePairCodePoint;
7
+ exports.isControlCodePoint = isControlCodePoint;
8
+ exports.isUndefinedCodePoint = isUndefinedCodePoint;
9
+ const UNDEFINED_CODE_POINTS = new Set([
10
+ 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
11
+ 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
12
+ 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574,
13
+ 1048575, 1114110, 1114111,
14
+ ]);
15
+ exports.REPLACEMENT_CHARACTER = '\uFFFD';
16
+ var CODE_POINTS;
17
+ (function (CODE_POINTS) {
18
+ CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF";
19
+ CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL";
20
+ CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION";
21
+ CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN";
22
+ CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED";
23
+ CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED";
24
+ CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE";
25
+ CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK";
26
+ CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK";
27
+ CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND";
28
+ CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE";
29
+ CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS";
30
+ CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS";
31
+ CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0";
32
+ CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9";
33
+ CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON";
34
+ CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN";
35
+ CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN";
36
+ CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN";
37
+ CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK";
38
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A";
39
+ CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z";
40
+ CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET";
41
+ CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT";
42
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A";
43
+ CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z";
44
+ })(CODE_POINTS || (exports.CODE_POINTS = CODE_POINTS = {}));
45
+ exports.SEQUENCES = {
46
+ DASH_DASH: '--',
47
+ CDATA_START: '[CDATA[',
48
+ DOCTYPE: 'doctype',
49
+ SCRIPT: 'script',
50
+ PUBLIC: 'public',
51
+ SYSTEM: 'system',
52
+ };
53
+ //Surrogates
54
+ function isSurrogate(cp) {
55
+ return cp >= 55296 && cp <= 57343;
56
+ }
57
+ function isSurrogatePair(cp) {
58
+ return cp >= 56320 && cp <= 57343;
59
+ }
60
+ function getSurrogatePairCodePoint(cp1, cp2) {
61
+ return (cp1 - 55296) * 1024 + 9216 + cp2;
62
+ }
63
+ //NOTE: excluding NULL and ASCII whitespace
64
+ function isControlCodePoint(cp) {
65
+ return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) ||
66
+ (cp >= 0x7f && cp <= 0x9f));
67
+ }
68
+ function isUndefinedCodePoint(cp) {
69
+ return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp);
70
+ }
@@ -0,0 +1,71 @@
1
+ import { type ParserOptions } from './parser/index.js';
2
+ import type { DefaultTreeAdapterMap } from './tree-adapters/default.js';
3
+ import type { TreeAdapterTypeMap } from './tree-adapters/interface.js';
4
+ export { type DefaultTreeAdapterMap, defaultTreeAdapter } from './tree-adapters/default.js';
5
+ import type * as DefaultTreeAdapter from './tree-adapters/default.js';
6
+ export declare namespace DefaultTreeAdapterTypes {
7
+ type Document = DefaultTreeAdapter.Document;
8
+ type DocumentFragment = DefaultTreeAdapter.DocumentFragment;
9
+ type Element = DefaultTreeAdapter.Element;
10
+ type CommentNode = DefaultTreeAdapter.CommentNode;
11
+ type TextNode = DefaultTreeAdapter.TextNode;
12
+ type Template = DefaultTreeAdapter.Template;
13
+ type DocumentType = DefaultTreeAdapter.DocumentType;
14
+ type ParentNode = DefaultTreeAdapter.ParentNode;
15
+ type ChildNode = DefaultTreeAdapter.ChildNode;
16
+ type Node = DefaultTreeAdapter.Node;
17
+ type DefaultTreeAdapterMap = DefaultTreeAdapter.DefaultTreeAdapterMap;
18
+ }
19
+ export type { TreeAdapter, TreeAdapterTypeMap } from './tree-adapters/interface.js';
20
+ export { type ParserOptions, /** @internal */ Parser } from './parser/index.js';
21
+ export { serialize, serializeOuter, type SerializerOptions } from './serializer/index.js';
22
+ export { ERR as ErrorCodes, type ParserError, type ParserErrorHandler } from './common/error-codes.js';
23
+ /** @internal */
24
+ export * as foreignContent from './common/foreign-content.js';
25
+ export * as html from './common/html.js';
26
+ export * as Token from './common/token.js';
27
+ /** @internal */
28
+ export { Tokenizer, type TokenizerOptions, TokenizerMode, type TokenHandler } from './tokenizer/index.js';
29
+ /**
30
+ * Parses an HTML string.
31
+ *
32
+ * @param html Input HTML string.
33
+ * @param options Parsing options.
34
+ * @returns Document
35
+ *
36
+ * @example
37
+ *
38
+ * ```js
39
+ * const parse5 = require('parse5');
40
+ *
41
+ * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
42
+ *
43
+ * console.log(document.childNodes[1].tagName); //> 'html'
44
+ *```
45
+ */
46
+ export declare function parse<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['document'];
47
+ /**
48
+ * Parses an HTML fragment.
49
+ *
50
+ * @example
51
+ *
52
+ * ```js
53
+ * const parse5 = require('parse5');
54
+ *
55
+ * const documentFragment = parse5.parseFragment('<table></table>');
56
+ *
57
+ * console.log(documentFragment.childNodes[0].tagName); //> 'table'
58
+ *
59
+ * // Parses the html fragment in the context of the parsed <table> element.
60
+ * const trFragment = parse5.parseFragment(documentFragment.childNodes[0], '<tr><td>Shake it, baby</td></tr>');
61
+ *
62
+ * console.log(trFragment.childNodes[0].childNodes[0].tagName); //> 'td'
63
+ * ```
64
+ *
65
+ * @param fragmentContext Parsing context element. If specified, given fragment will be parsed as if it was set to the context element's `innerHTML` property.
66
+ * @param html Input HTML fragment string.
67
+ * @param options Parsing options.
68
+ * @returns DocumentFragment
69
+ */
70
+ export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(fragmentContext: T['parentNode'] | null, html: string, options: ParserOptions<T>): T['documentFragment'];
71
+ export declare function parseFragment<T extends TreeAdapterTypeMap = DefaultTreeAdapterMap>(html: string, options?: ParserOptions<T>): T['documentFragment'];
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenizerMode = exports.Tokenizer = exports.Token = exports.html = exports.foreignContent = exports.ErrorCodes = exports.serializeOuter = exports.serialize = exports.Parser = exports.defaultTreeAdapter = void 0;
4
+ exports.parse = parse;
5
+ exports.parseFragment = parseFragment;
6
+ const index_js_1 = require("./parser/index.js");
7
+ var default_js_1 = require("./tree-adapters/default.js");
8
+ Object.defineProperty(exports, "defaultTreeAdapter", { enumerable: true, get: function () { return default_js_1.defaultTreeAdapter; } });
9
+ var index_js_2 = require("./parser/index.js");
10
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return index_js_2.Parser; } });
11
+ var index_js_3 = require("./serializer/index.js");
12
+ Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return index_js_3.serialize; } });
13
+ Object.defineProperty(exports, "serializeOuter", { enumerable: true, get: function () { return index_js_3.serializeOuter; } });
14
+ var error_codes_js_1 = require("./common/error-codes.js");
15
+ Object.defineProperty(exports, "ErrorCodes", { enumerable: true, get: function () { return error_codes_js_1.ERR; } });
16
+ /** @internal */
17
+ exports.foreignContent = require("./common/foreign-content.js");
18
+ exports.html = require("./common/html.js");
19
+ exports.Token = require("./common/token.js");
20
+ /** @internal */
21
+ var index_js_4 = require("./tokenizer/index.js");
22
+ Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return index_js_4.Tokenizer; } });
23
+ Object.defineProperty(exports, "TokenizerMode", { enumerable: true, get: function () { return index_js_4.TokenizerMode; } });
24
+ // Shorthands
25
+ /**
26
+ * Parses an HTML string.
27
+ *
28
+ * @param html Input HTML string.
29
+ * @param options Parsing options.
30
+ * @returns Document
31
+ *
32
+ * @example
33
+ *
34
+ * ```js
35
+ * const parse5 = require('parse5');
36
+ *
37
+ * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>');
38
+ *
39
+ * console.log(document.childNodes[1].tagName); //> 'html'
40
+ *```
41
+ */
42
+ function parse(html, options) {
43
+ return index_js_1.Parser.parse(html, options);
44
+ }
45
+ function parseFragment(fragmentContext, html, options) {
46
+ if (typeof fragmentContext === 'string') {
47
+ options = html;
48
+ html = fragmentContext;
49
+ fragmentContext = null;
50
+ }
51
+ const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
52
+ parser.tokenizer.write(html, true);
53
+ return parser.getFragment();
54
+ }
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,36 @@
1
+ import type { TagToken } from '../common/token.js';
2
+ import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface.js';
3
+ export declare enum EntryType {
4
+ Marker = 0,
5
+ Element = 1
6
+ }
7
+ interface MarkerEntry {
8
+ type: EntryType.Marker;
9
+ }
10
+ export interface ElementEntry<T extends TreeAdapterTypeMap> {
11
+ type: EntryType.Element;
12
+ element: T['element'];
13
+ token: TagToken;
14
+ }
15
+ export type Entry<T extends TreeAdapterTypeMap> = MarkerEntry | ElementEntry<T>;
16
+ export declare class FormattingElementList<T extends TreeAdapterTypeMap> {
17
+ private treeAdapter;
18
+ entries: Entry<T>[];
19
+ bookmark: Entry<T> | null;
20
+ constructor(treeAdapter: TreeAdapter<T>);
21
+ private _getNoahArkConditionCandidates;
22
+ private _ensureNoahArkCondition;
23
+ insertMarker(): void;
24
+ pushElement(element: T['element'], token: TagToken): void;
25
+ insertElementAfterBookmark(element: T['element'], token: TagToken): void;
26
+ removeEntry(entry: Entry<T>): void;
27
+ /**
28
+ * Clears the list of formatting elements up to the last marker.
29
+ *
30
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
31
+ */
32
+ clearToLastMarker(): void;
33
+ getElementEntryInScopeWithTagName(tagName: string): ElementEntry<T> | null;
34
+ getElementEntry(element: T['element']): ElementEntry<T> | undefined;
35
+ }
36
+ export {};
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormattingElementList = exports.EntryType = void 0;
4
+ //Const
5
+ const NOAH_ARK_CAPACITY = 3;
6
+ var EntryType;
7
+ (function (EntryType) {
8
+ EntryType[EntryType["Marker"] = 0] = "Marker";
9
+ EntryType[EntryType["Element"] = 1] = "Element";
10
+ })(EntryType || (exports.EntryType = EntryType = {}));
11
+ const MARKER = { type: EntryType.Marker };
12
+ //List of formatting elements
13
+ class FormattingElementList {
14
+ constructor(treeAdapter) {
15
+ this.treeAdapter = treeAdapter;
16
+ this.entries = [];
17
+ this.bookmark = null;
18
+ }
19
+ //Noah Ark's condition
20
+ //OPTIMIZATION: at first we try to find possible candidates for exclusion using
21
+ //lightweight heuristics without thorough attributes check.
22
+ _getNoahArkConditionCandidates(newElement, neAttrs) {
23
+ const candidates = [];
24
+ const neAttrsLength = neAttrs.length;
25
+ const neTagName = this.treeAdapter.getTagName(newElement);
26
+ const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
27
+ for (let i = 0; i < this.entries.length; i++) {
28
+ const entry = this.entries[i];
29
+ if (entry.type === EntryType.Marker) {
30
+ break;
31
+ }
32
+ const { element } = entry;
33
+ if (this.treeAdapter.getTagName(element) === neTagName &&
34
+ this.treeAdapter.getNamespaceURI(element) === neNamespaceURI) {
35
+ const elementAttrs = this.treeAdapter.getAttrList(element);
36
+ if (elementAttrs.length === neAttrsLength) {
37
+ candidates.push({ idx: i, attrs: elementAttrs });
38
+ }
39
+ }
40
+ }
41
+ return candidates;
42
+ }
43
+ _ensureNoahArkCondition(newElement) {
44
+ if (this.entries.length < NOAH_ARK_CAPACITY)
45
+ return;
46
+ const neAttrs = this.treeAdapter.getAttrList(newElement);
47
+ const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs);
48
+ if (candidates.length < NOAH_ARK_CAPACITY)
49
+ return;
50
+ //NOTE: build attrs map for the new element, so we can perform fast lookups
51
+ const neAttrsMap = new Map(neAttrs.map((neAttr) => [neAttr.name, neAttr.value]));
52
+ let validCandidates = 0;
53
+ //NOTE: remove bottommost candidates, until Noah's Ark condition will not be met
54
+ for (let i = 0; i < candidates.length; i++) {
55
+ const candidate = candidates[i];
56
+ // We know that `candidate.attrs.length === neAttrs.length`
57
+ if (candidate.attrs.every((cAttr) => neAttrsMap.get(cAttr.name) === cAttr.value)) {
58
+ validCandidates += 1;
59
+ if (validCandidates >= NOAH_ARK_CAPACITY) {
60
+ this.entries.splice(candidate.idx, 1);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ //Mutations
66
+ insertMarker() {
67
+ this.entries.unshift(MARKER);
68
+ }
69
+ pushElement(element, token) {
70
+ this._ensureNoahArkCondition(element);
71
+ this.entries.unshift({
72
+ type: EntryType.Element,
73
+ element,
74
+ token,
75
+ });
76
+ }
77
+ insertElementAfterBookmark(element, token) {
78
+ const bookmarkIdx = this.entries.indexOf(this.bookmark);
79
+ this.entries.splice(bookmarkIdx, 0, {
80
+ type: EntryType.Element,
81
+ element,
82
+ token,
83
+ });
84
+ }
85
+ removeEntry(entry) {
86
+ const entryIndex = this.entries.indexOf(entry);
87
+ if (entryIndex !== -1) {
88
+ this.entries.splice(entryIndex, 1);
89
+ }
90
+ }
91
+ /**
92
+ * Clears the list of formatting elements up to the last marker.
93
+ *
94
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
95
+ */
96
+ clearToLastMarker() {
97
+ const markerIdx = this.entries.indexOf(MARKER);
98
+ if (markerIdx === -1) {
99
+ this.entries.length = 0;
100
+ }
101
+ else {
102
+ this.entries.splice(0, markerIdx + 1);
103
+ }
104
+ }
105
+ //Search
106
+ getElementEntryInScopeWithTagName(tagName) {
107
+ const entry = this.entries.find((entry) => entry.type === EntryType.Marker || this.treeAdapter.getTagName(entry.element) === tagName);
108
+ return entry && entry.type === EntryType.Element ? entry : null;
109
+ }
110
+ getElementEntry(element) {
111
+ return this.entries.find((entry) => entry.type === EntryType.Element && entry.element === element);
112
+ }
113
+ }
114
+ exports.FormattingElementList = FormattingElementList;
@@ -0,0 +1,221 @@
1
+ import { Tokenizer, TokenizerMode, type TokenHandler } from '../tokenizer/index.js';
2
+ import { OpenElementStack, type StackHandler } from './open-element-stack.js';
3
+ import { FormattingElementList } from './formatting-element-list.js';
4
+ import { ERR, type ParserErrorHandler } from '../common/error-codes.js';
5
+ import { TAG_ID as $, NS } from '../common/html.js';
6
+ import type { TreeAdapter, TreeAdapterTypeMap } from '../tree-adapters/interface.js';
7
+ import { type Token, type CommentToken, type CharacterToken, type TagToken, type DoctypeToken, type EOFToken, type LocationWithAttributes } from '../common/token.js';
8
+ declare enum InsertionMode {
9
+ INITIAL = 0,
10
+ BEFORE_HTML = 1,
11
+ BEFORE_HEAD = 2,
12
+ IN_HEAD = 3,
13
+ IN_HEAD_NO_SCRIPT = 4,
14
+ AFTER_HEAD = 5,
15
+ IN_BODY = 6,
16
+ TEXT = 7,
17
+ IN_TABLE = 8,
18
+ IN_TABLE_TEXT = 9,
19
+ IN_CAPTION = 10,
20
+ IN_COLUMN_GROUP = 11,
21
+ IN_TABLE_BODY = 12,
22
+ IN_ROW = 13,
23
+ IN_CELL = 14,
24
+ IN_SELECT = 15,
25
+ IN_SELECT_IN_TABLE = 16,
26
+ IN_TEMPLATE = 17,
27
+ AFTER_BODY = 18,
28
+ IN_FRAMESET = 19,
29
+ AFTER_FRAMESET = 20,
30
+ AFTER_AFTER_BODY = 21,
31
+ AFTER_AFTER_FRAMESET = 22
32
+ }
33
+ export interface ParserOptions<T extends TreeAdapterTypeMap> {
34
+ /**
35
+ * The [scripting flag](https://html.spec.whatwg.org/multipage/parsing.html#scripting-flag). If set
36
+ * to `true`, `noscript` element content will be parsed as text.
37
+ *
38
+ * @default `true`
39
+ */
40
+ scriptingEnabled?: boolean;
41
+ /**
42
+ * Enables source code location information. When enabled, each node (except the root node)
43
+ * will have a `sourceCodeLocation` property. If the node is not an empty element, `sourceCodeLocation` will
44
+ * be a {@link ElementLocation} object, otherwise it will be {@link Location}.
45
+ * If the element was implicitly created by the parser (as part of
46
+ * [tree correction](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)),
47
+ * its `sourceCodeLocation` property will be `undefined`.
48
+ *
49
+ * @default `false`
50
+ */
51
+ sourceCodeLocationInfo?: boolean;
52
+ /**
53
+ * Specifies the resulting tree format.
54
+ *
55
+ * @default `treeAdapters.default`
56
+ */
57
+ treeAdapter?: TreeAdapter<T>;
58
+ /**
59
+ * Callback for parse errors.
60
+ *
61
+ * @default `null`
62
+ */
63
+ onParseError?: ParserErrorHandler | null;
64
+ }
65
+ export declare class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, StackHandler<T> {
66
+ /** @internal */
67
+ fragmentContext: T['element'] | null;
68
+ /** @internal */
69
+ scriptHandler: null | ((pendingScript: T['element']) => void);
70
+ treeAdapter: TreeAdapter<T>;
71
+ /** @internal */
72
+ onParseError: ParserErrorHandler | null;
73
+ protected currentToken: Token | null;
74
+ options: Required<ParserOptions<T>>;
75
+ document: T['document'];
76
+ constructor(options?: ParserOptions<T>, document?: T['document'],
77
+ /** @internal */
78
+ fragmentContext?: T['element'] | null,
79
+ /** @internal */
80
+ scriptHandler?: null | ((pendingScript: T['element']) => void));
81
+ static parse<T extends TreeAdapterTypeMap>(html: string, options?: ParserOptions<T>): T['document'];
82
+ static getFragmentParser<T extends TreeAdapterTypeMap>(fragmentContext?: T['parentNode'] | null, options?: ParserOptions<T>): Parser<T>;
83
+ getFragment(): T['documentFragment'];
84
+ tokenizer: Tokenizer;
85
+ stopped: boolean;
86
+ /** @internal */
87
+ insertionMode: InsertionMode;
88
+ /** @internal */
89
+ originalInsertionMode: InsertionMode;
90
+ /** @internal */
91
+ fragmentContextID: $;
92
+ /** @internal */
93
+ headElement: null | T['element'];
94
+ /** @internal */
95
+ formElement: null | T['element'];
96
+ /** @internal */
97
+ openElements: OpenElementStack<T>;
98
+ /** @internal */
99
+ activeFormattingElements: FormattingElementList<T>;
100
+ /** Indicates that the current node is not an element in the HTML namespace */
101
+ protected currentNotInHTML: boolean;
102
+ /**
103
+ * The template insertion mode stack is maintained from the left.
104
+ * Ie. the topmost element will always have index 0.
105
+ *
106
+ * @internal
107
+ */
108
+ tmplInsertionModeStack: InsertionMode[];
109
+ /** @internal */
110
+ pendingCharacterTokens: CharacterToken[];
111
+ /** @internal */
112
+ hasNonWhitespacePendingCharacterToken: boolean;
113
+ /** @internal */
114
+ framesetOk: boolean;
115
+ /** @internal */
116
+ skipNextNewLine: boolean;
117
+ /** @internal */
118
+ fosterParentingEnabled: boolean;
119
+ /** @internal */
120
+ _err(token: Token, code: ERR, beforeToken?: boolean): void;
121
+ /** @internal */
122
+ onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void;
123
+ /** @internal */
124
+ onItemPop(node: T['parentNode'], isTop: boolean): void;
125
+ protected _setContextModes(current: T['parentNode'] | undefined, tid: number | undefined): void;
126
+ /** @protected */
127
+ _switchToTextParsing(currentToken: TagToken, nextTokenizerState: (typeof TokenizerMode)[keyof typeof TokenizerMode]): void;
128
+ switchToPlaintextParsing(): void;
129
+ /** @protected */
130
+ _getAdjustedCurrentElement(): T['element'];
131
+ /** @protected */
132
+ _findFormInFragmentContext(): void;
133
+ protected _initTokenizerForFragmentParsing(): void;
134
+ /** @protected */
135
+ _setDocumentType(token: DoctypeToken): void;
136
+ /** @protected */
137
+ _attachElementToTree(element: T['element'], location: LocationWithAttributes | null): void;
138
+ /**
139
+ * For self-closing tags. Add an element to the tree, but skip adding it
140
+ * to the stack.
141
+ */
142
+ /** @protected */
143
+ _appendElement(token: TagToken, namespaceURI: NS): void;
144
+ /** @protected */
145
+ _insertElement(token: TagToken, namespaceURI: NS): void;
146
+ /** @protected */
147
+ _insertFakeElement(tagName: string, tagID: $): void;
148
+ /** @protected */
149
+ _insertTemplate(token: TagToken): void;
150
+ /** @protected */
151
+ _insertFakeRootElement(): void;
152
+ /** @protected */
153
+ _appendCommentNode(token: CommentToken, parent: T['parentNode']): void;
154
+ /** @protected */
155
+ _insertCharacters(token: CharacterToken): void;
156
+ /** @protected */
157
+ _adoptNodes(donor: T['parentNode'], recipient: T['parentNode']): void;
158
+ /** @protected */
159
+ _setEndLocation(element: T['element'], closingToken: Token): void;
160
+ protected shouldProcessStartTagTokenInForeignContent(token: TagToken): boolean;
161
+ /** @protected */
162
+ _processToken(token: Token): void;
163
+ /** @protected */
164
+ _isIntegrationPoint(tid: $, element: T['element'], foreignNS?: NS): boolean;
165
+ /** @protected */
166
+ _reconstructActiveFormattingElements(): void;
167
+ /** @protected */
168
+ _closeTableCell(): void;
169
+ /** @protected */
170
+ _closePElement(): void;
171
+ /** @protected */
172
+ _resetInsertionMode(): void;
173
+ /** @protected */
174
+ _resetInsertionModeForSelect(selectIdx: number): void;
175
+ /** @protected */
176
+ _isElementCausesFosterParenting(tn: $): boolean;
177
+ /** @protected */
178
+ _shouldFosterParentOnInsertion(): boolean;
179
+ /** @protected */
180
+ _findFosterParentingLocation(): {
181
+ parent: T['parentNode'];
182
+ beforeElement: T['element'] | null;
183
+ };
184
+ /** @protected */
185
+ _fosterParentElement(element: T['element']): void;
186
+ /** @protected */
187
+ _isSpecialElement(element: T['element'], id: $): boolean;
188
+ /** @internal */
189
+ onCharacter(token: CharacterToken): void;
190
+ /** @internal */
191
+ onNullCharacter(token: CharacterToken): void;
192
+ /** @internal */
193
+ onComment(token: CommentToken): void;
194
+ /** @internal */
195
+ onDoctype(token: DoctypeToken): void;
196
+ /** @internal */
197
+ onStartTag(token: TagToken): void;
198
+ /**
199
+ * Processes a given start tag.
200
+ *
201
+ * `onStartTag` checks if a self-closing tag was recognized. When a token
202
+ * is moved inbetween multiple insertion modes, this check for self-closing
203
+ * could lead to false positives. To avoid this, `_processStartTag` is used
204
+ * for nested calls.
205
+ *
206
+ * @param token The token to process.
207
+ * @protected
208
+ */
209
+ _processStartTag(token: TagToken): void;
210
+ /** @protected */
211
+ _startTagOutsideForeignContent(token: TagToken): void;
212
+ /** @internal */
213
+ onEndTag(token: TagToken): void;
214
+ /** @protected */
215
+ _endTagOutsideForeignContent(token: TagToken): void;
216
+ /** @internal */
217
+ onEof(token: EOFToken): void;
218
+ /** @internal */
219
+ onWhitespaceCharacter(token: CharacterToken): void;
220
+ }
221
+ export {};