summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Juan Martín Seery <me@juanm04.com> 2022-03-21 14:30:23 -0300
committerGravatar GitHub <noreply@github.com> 2022-03-21 12:30:23 -0500
commit41110ebe729d088a3f6b8ea1e42103a171e36a22 (patch)
tree969f985e89f6c739d00471ed8dfa68412595a1a9
parent0c5378b8cf4fcf4a7b4e6c9e33f0ba9c370990f3 (diff)
downloadastro-41110ebe729d088a3f6b8ea1e42103a171e36a22.tar.gz
astro-41110ebe729d088a3f6b8ea1e42103a171e36a22.tar.zst
astro-41110ebe729d088a3f6b8ea1e42103a171e36a22.zip
chore: remove `@astrojs/parser` (#2845)
* Removed parser from astro * Removed parser files * Updated changeset config * Removed from license
-rw-r--r--.changeset/config.json4
-rw-r--r--.changeset/pre.json1
-rw-r--r--LICENSE15
-rw-r--r--packages/astro-parser/CHANGELOG.md121
-rw-r--r--packages/astro-parser/README.md5
-rw-r--r--packages/astro-parser/package.json37
-rw-r--r--packages/astro-parser/src/Stats.ts83
-rw-r--r--packages/astro-parser/src/config.ts1
-rw-r--r--packages/astro-parser/src/index.ts3
-rw-r--r--packages/astro-parser/src/interfaces.ts163
-rw-r--r--packages/astro-parser/src/parse/index.ts262
-rw-r--r--packages/astro-parser/src/parse/read/context.ts72
-rw-r--r--packages/astro-parser/src/parse/read/expression.ts254
-rw-r--r--packages/astro-parser/src/parse/read/script.ts60
-rw-r--r--packages/astro-parser/src/parse/read/style.ts40
-rw-r--r--packages/astro-parser/src/parse/state/codefence.ts38
-rw-r--r--packages/astro-parser/src/parse/state/codespan.ts28
-rw-r--r--packages/astro-parser/src/parse/state/fragment.ts32
-rw-r--r--packages/astro-parser/src/parse/state/mustache.ts412
-rw-r--r--packages/astro-parser/src/parse/state/setup.ts35
-rw-r--r--packages/astro-parser/src/parse/state/tag.ts499
-rw-r--r--packages/astro-parser/src/parse/state/text.ts32
-rw-r--r--packages/astro-parser/src/parse/utils/bracket.ts27
-rw-r--r--packages/astro-parser/src/parse/utils/entities.ts2034
-rw-r--r--packages/astro-parser/src/parse/utils/features.ts1
-rw-r--r--packages/astro-parser/src/parse/utils/html.ts112
-rw-r--r--packages/astro-parser/src/parse/utils/node.ts30
-rw-r--r--packages/astro-parser/src/utils/error.ts44
-rw-r--r--packages/astro-parser/src/utils/full_char_code_at.ts11
-rw-r--r--packages/astro-parser/src/utils/fuzzymatch.ts233
-rw-r--r--packages/astro-parser/src/utils/get_code_frame.ts29
-rw-r--r--packages/astro-parser/src/utils/link.ts5
-rw-r--r--packages/astro-parser/src/utils/list.ts5
-rw-r--r--packages/astro-parser/src/utils/names.ts142
-rw-r--r--packages/astro-parser/src/utils/namespaces.ts13
-rw-r--r--packages/astro-parser/src/utils/nodes_match.ts35
-rw-r--r--packages/astro-parser/src/utils/patterns.ts3
-rw-r--r--packages/astro-parser/tsconfig.json9
-rw-r--r--packages/astro/package.json1
-rw-r--r--packages/astro/src/core/logger.ts29
-rw-r--r--pnpm-lock.yaml23
41 files changed, 5 insertions, 4978 deletions
diff --git a/.changeset/config.json b/.changeset/config.json
index 76c5a08ba..8292fbe07 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -1,8 +1,8 @@
{
- "$schema": "https://unpkg.com/@changesets/config@1.6.0/schema.json",
+ "$schema": "https://unpkg.com/@changesets/config@1.7.0/schema.json",
"changelog": ["@changesets/changelog-github", { "repo": "withastro/astro" }],
"commit": false,
- "linked": [["astro", "@astrojs/parser"]],
+ "linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 389e6f780..c6c33d08f 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -31,7 +31,6 @@
"@example/with-tailwindcss": "0.0.1",
"@example/with-vite-plugin-pwa": "0.0.1",
"astro": "0.24.3",
- "@astrojs/parser": "0.22.2",
"@astrojs/prism": "0.4.0",
"@test/custom-element-renderer": "0.1.0",
"@test/static-build-pkg": "0.0.0",
diff --git a/LICENSE b/LICENSE
index 53be9db53..96b135cf7 100644
--- a/LICENSE
+++ b/LICENSE
@@ -22,21 +22,6 @@ SOFTWARE.
"""
-This license applies to parts of the `packages/astro-parser` subdirectory originating from the
-https://github.com/sveltejs/svelte repository:
-
-
-Copyright (c) 2016-21 [these people](https://github.com/sveltejs/svelte/graphs/contributors)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-"""
-
-
-"""
This license applies to parts of the `packages/create-astro` and `packages/astro` subdirectories originating from the https://github.com/sveltejs/kit repository:
Copyright (c) 2020 [these people](https://github.com/sveltejs/kit/graphs/contributors)
diff --git a/packages/astro-parser/CHANGELOG.md b/packages/astro-parser/CHANGELOG.md
deleted file mode 100644
index 971f1be76..000000000
--- a/packages/astro-parser/CHANGELOG.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# @astrojs/parser
-
-## 0.22.2
-
-## 0.22.1
-
-## 0.22.0
-
-### Minor Changes
-
-- [#2202](https://github.com/withastro/astro/pull/2202) [`45cea6ae`](https://github.com/withastro/astro/commit/45cea6aec5a310fed4cb8da0d96670d6b99a2539) Thanks [@jonathantneal](https://github.com/jonathantneal)! - Officially drop support for Node v12. The minimum supported version is now Node v14.15+,
-
-## 0.20.3
-
-## 0.20.2
-
-### Patch Changes
-
-- 5d2ea578: fixed an issue using namespaced attributes in astro files
-
-## 0.18.6
-
-## 0.18.5
-
-### Patch Changes
-
-- cd2b5df4: Prevents locking up checking for --- inside of the HTML portion
-
-## 0.18.0
-
-### Patch Changes
-
-- a7e6666: compile javascript to target Node v12.x
-- 294a656: Adds support for global style blocks via `<style global>`
-
- Be careful with this escape hatch! This is best reserved for uses like importing styling libraries like Tailwind, or changing global CSS variables.
-
-- b85e68a: Fixes case where custom elements are not handled within JSX expressions
-
-## 0.18.0-next.5
-
-### Patch Changes
-
-- 294a656: Adds support for global style blocks via `<style global>`
-
- Be careful with this escape hatch! This is best reserved for uses like importing styling libraries like Tailwind, or changing global CSS variables.
-
-## 0.18.0-next.2
-
-### Patch Changes
-
-- a7e6666: compile javascript to target Node v12.x
-- b85e68a: Fixes case where custom elements are not handled within JSX expressions
-
-## 0.15.4
-
-### Patch Changes
-
-- 6a660f1: Adds low-level custom element support that renderers can use to enable server side rendering. This will be used in renderers such as a Lit renderer.
-
-## 0.15.0
-
-### Patch Changes
-
-- 47ac2cc: Fix #521, allowing `{...spread}` props to work again
-
-## 0.13.10
-
-### Patch Changes
-
-- 7f8d586: Bugfix: template literals in JSX tags breaking parser
-
-## 0.13.9
-
-### Patch Changes
-
-- f9f2da4: Add repository key to all package.json
-
-## 0.13.8
-
-### Patch Changes
-
-- 490f2be: Add support for Fragments with `<>` and `</>` syntax
-
-## 0.13.3
-
-### Patch Changes
-
-- ab2972b: Update package.json engines for esm support
-
-## 0.12.1
-
-### Patch Changes
-
-- 6de740d: Fix for when there's a parser error with unmatched backticks
-
-## 0.12.0
-
-### Patch Changes
-
-- d2330a5: Improve error display for missing local files
-
-### 0.12.0-next.0
-
-### Patch Changes
-
-- Fixes a few more Markdown issues
-
-## 0.11.0
-
-### Patch Changes
-
-- 9cdada0: Fixes a few edge case bugs with Astro's handling of Markdown content
-
-## 0.1.0
-
-### Minor Changes
-
-- b3886c2: Enhanced **Markdown** support! Markdown processing has been moved from `micromark` to `remark` to prepare Astro for user-provided `remark` plugins _in the future_.
-
- This change also introduces a built-in `<Markdown>` component for embedding Markdown and any Astro-supported component format inside of `.astro` files. [Read more about Astro's Markdown support.](https://docs.astro.build/markdown/)
diff --git a/packages/astro-parser/README.md b/packages/astro-parser/README.md
deleted file mode 100644
index 7223de1cf..000000000
--- a/packages/astro-parser/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# `@astrojs/parser`
-
-> ⚠️ **Notice** `@astrojs/parser` has been deprecated. In previous versions of `astro` it was responsible for parsing `.astro` files. `astro` has since adopted the brand new [`@astrojs/compiler`](https://github.com/withastro/compiler).
-
-This directory is a fork of `svelte/compiler`. It is meant to stay as close to the original source as possible, so that upstream changes are easy to integrate. Everything svelte-specific and unrelated to parsing (compiler, preprocess, etc) has been removed.
diff --git a/packages/astro-parser/package.json b/packages/astro-parser/package.json
deleted file mode 100644
index b26eaf846..000000000
--- a/packages/astro-parser/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "@astrojs/parser",
- "version": "0.22.2",
- "type": "commonjs",
- "author": "withastro",
- "license": "MIT",
- "repository": {
- "type": "git",
- "url": "https://github.com/withastro/astro.git",
- "directory": "packages/astro-parser"
- },
- "bugs": "https://github.com/withastro/astro/issues",
- "homepage": "https://astro.build",
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "files": [
- "dist"
- ],
- "scripts": {
- "prepublish": "pnpm run build",
- "build": "astro-scripts build \"src/**/*.ts\" && tsc -p tsconfig.json",
- "dev": "astro-scripts dev \"src/**/*.ts\""
- },
- "dependencies": {
- "@types/node": "^14.18.12",
- "acorn": "^8.7.0",
- "locate-character": "^2.0.5",
- "magic-string": "^0.25.9"
- },
- "devDependencies": {
- "astro-scripts": "workspace:*"
- },
- "engines": {
- "node": "^14.15.0 || >=16.0.0",
- "npm": ">=6.14.0"
- }
-}
diff --git a/packages/astro-parser/src/Stats.ts b/packages/astro-parser/src/Stats.ts
deleted file mode 100644
index 98f95c595..000000000
--- a/packages/astro-parser/src/Stats.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-// @ts-nocheck
-
-const now =
- typeof process !== 'undefined' && process.hrtime
- ? () => {
- const t = process.hrtime();
- return t[0] * 1e3 + t[1] / 1e6;
- }
- : () => self.performance.now();
-
-interface Timing {
- label: string;
- start: number;
- end: number;
- children: Timing[];
-}
-
-/** Format benchmarks */
-function collapse_timings(timings) {
- const result = {};
- timings.forEach((timing) => {
- result[timing.label] = Object.assign(
- {
- total: timing.end - timing.start,
- },
- timing.children && collapse_timings(timing.children)
- );
- });
- return result;
-}
-
-export default class Stats {
- start_time: number;
- current_timing: Timing;
- current_children: Timing[];
- timings: Timing[];
- stack: Timing[];
-
- constructor() {
- this.start_time = now();
- this.stack = [];
- this.current_children = this.timings = [];
- }
-
- start(label) {
- const timing = {
- label,
- start: now(),
- end: null,
- children: [],
- };
-
- this.current_children.push(timing);
- this.stack.push(timing);
-
- this.current_timing = timing;
- this.current_children = timing.children;
- }
-
- stop(label) {
- if (label !== this.current_timing.label) {
- throw new Error(`Mismatched timing labels (expected ${this.current_timing.label}, got ${label})`);
- }
-
- this.current_timing.end = now();
- this.stack.pop();
- this.current_timing = this.stack[this.stack.length - 1];
- this.current_children = this.current_timing ? this.current_timing.children : this.timings;
- }
-
- render() {
- const timings = Object.assign(
- {
- total: now() - this.start_time,
- },
- collapse_timings(this.timings)
- );
-
- return {
- timings,
- };
- }
-}
diff --git a/packages/astro-parser/src/config.ts b/packages/astro-parser/src/config.ts
deleted file mode 100644
index e6d0f65a7..000000000
--- a/packages/astro-parser/src/config.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const test = typeof process !== 'undefined' && process.env.TEST;
diff --git a/packages/astro-parser/src/index.ts b/packages/astro-parser/src/index.ts
deleted file mode 100644
index cb289fa11..000000000
--- a/packages/astro-parser/src/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './interfaces';
-export * from './parse/utils/features';
-export { default as parse } from './parse/index.js';
diff --git a/packages/astro-parser/src/interfaces.ts b/packages/astro-parser/src/interfaces.ts
deleted file mode 100644
index 6ed19c058..000000000
--- a/packages/astro-parser/src/interfaces.ts
+++ /dev/null
@@ -1,163 +0,0 @@
-import type { SourceMap } from 'magic-string';
-export { CompileError } from './utils/error';
-
-export interface BaseNode {
- start: number;
- end: number;
- type: string;
- children?: TemplateNode[];
- [prop_name: string]: any;
-}
-
-export interface Fragment extends BaseNode {
- type: 'Fragment';
- children: TemplateNode[];
-}
-
-export interface Text extends BaseNode {
- type: 'Text';
- data: string;
- raw: string;
-}
-
-export interface CodeFence extends BaseNode {
- type: 'CodeFence';
- metadata: string;
- data: string;
- raw: string;
-}
-
-export interface CodeSpan extends BaseNode {
- type: 'CodeFence';
- metadata: string;
- data: string;
- raw: string;
-}
-
-export interface Attribute extends BaseNode {
- type: 'Attribute';
- name: string;
- value: Text[];
-}
-
-export interface MustacheTag extends BaseNode {
- type: 'MustacheTag';
- content: string;
-}
-
-export type DirectiveType = 'Action' | 'Animation' | 'Binding' | 'Class' | 'EventHandler' | 'Let' | 'Ref' | 'Transition';
-
-interface BaseDirective extends BaseNode {
- type: DirectiveType;
- expression: null | Node;
- name: string;
- modifiers: string[];
-}
-
-export interface Transition extends BaseDirective {
- type: 'Transition';
- intro: boolean;
- outro: boolean;
-}
-
-export type Directive = BaseDirective | Transition;
-
-export type TemplateNode = Text | CodeSpan | CodeFence | MustacheTag | BaseNode | Directive | Transition;
-
-export interface Expression {
- type: 'Expression';
- start: number;
- end: number;
- codeChunks: string[];
- children: BaseNode[];
-}
-
-export interface Parser {
- readonly template: string;
- readonly filename?: string;
-
- index: number;
- stack: Node[];
-
- html: Node;
- css: Node;
- js: Node;
- meta_tags: Map<string, string>;
-}
-
-export interface Script extends BaseNode {
- type: 'Script';
- context: 'runtime' | 'setup';
- content: string;
-}
-
-export interface Style extends BaseNode {
- type: 'Style';
- attributes: any[]; // TODO
- content: {
- start: number;
- end: number;
- styles: string;
- };
-}
-
-export interface Ast {
- html: TemplateNode;
- css: Style[];
- module: Script;
- // instance: Script;
- meta: {
- features: number;
- };
-}
-
-export interface Warning {
- start?: { line: number; column: number; pos?: number };
- end?: { line: number; column: number };
- pos?: number;
- code: string;
- message: string;
- filename?: string;
- frame?: string;
- toString: () => string;
-}
-
-export type ModuleFormat = 'esm' | 'cjs';
-
-export type CssHashGetter = (args: { name: string; filename: string | undefined; css: string; hash: (input: string) => string }) => string;
-
-export interface Visitor {
- enter: (node: Node) => void;
- leave?: (node: Node) => void;
-}
-
-export interface AppendTarget {
- slots: Record<string, string>;
- slot_stack: string[];
-}
-
-export interface Var {
- name: string;
- export_name?: string; // the `bar` in `export { foo as bar }`
- injected?: boolean;
- module?: boolean;
- mutated?: boolean;
- reassigned?: boolean;
- referenced?: boolean; // referenced from template scope
- referenced_from_script?: boolean; // referenced from script
- writable?: boolean;
-
- // used internally, but not exposed
- global?: boolean;
- internal?: boolean; // event handlers, bindings
- initialised?: boolean;
- hoistable?: boolean;
- subscribable?: boolean;
- is_reactive_dependency?: boolean;
- imported?: boolean;
-}
-
-export interface CssResult {
- code: string;
- map: SourceMap;
-}
diff --git a/packages/astro-parser/src/parse/index.ts b/packages/astro-parser/src/parse/index.ts
deleted file mode 100644
index 0ce259dfb..000000000
--- a/packages/astro-parser/src/parse/index.ts
+++ /dev/null
@@ -1,262 +0,0 @@
-// @ts-nocheck
-
-import { isIdentifierStart, isIdentifierChar } from 'acorn';
-import fragment from './state/fragment.js';
-import { whitespace } from '../utils/patterns.js';
-import { reserved } from '../utils/names.js';
-import full_char_code_at from '../utils/full_char_code_at.js';
-import { TemplateNode, Ast, ParserOptions, Fragment, Style, Script } from '../interfaces.js';
-import error from '../utils/error.js';
-
-type ParserState = (parser: Parser) => ParserState | void;
-
-interface LastAutoClosedTag {
- tag: string;
- reason: string;
- depth: number;
-}
-
-export class Parser {
- readonly template: string;
- readonly filename?: string;
- readonly customElement: boolean;
-
- index = 0;
- stack: TemplateNode[] = [];
-
- html: Fragment;
- css: Style[] = [];
- js: Script[] = [];
- meta_tags = {};
- last_auto_closed_tag?: LastAutoClosedTag;
- feature_flags = 0;
-
- constructor(template: string, options: ParserOptions) {
- if (typeof template !== 'string') {
- throw new TypeError('Template must be a string');
- }
-
- this.template = template.replace(/\s+$/, '');
- this.filename = options.filename;
- this.customElement = options.customElement;
-
- this.html = {
- start: null,
- end: null,
- type: 'Fragment',
- children: [],
- };
-
- this.stack.push(this.html);
-
- let state: ParserState = fragment;
-
- while (this.index < this.template.length) {
- state = state(this) || fragment;
- }
-
- if (this.stack.length > 1) {
- const current = this.current();
-
- const type = current.type === 'Element' ? `<${current.name}>` : 'Block';
- const slug = current.type === 'Element' ? 'element' : 'block';
-
- this.error(
- {
- code: `unclosed-${slug}`,
- message: `${type} was left open`,
- },
- current.start
- );
- }
-
- if (state !== fragment) {
- this.error({
- code: 'unexpected-eof',
- message: 'Unexpected end of input',
- });
- }
-
- if (this.html.children.length) {
- let start = this.html.children[0].start;
- while (whitespace.test(template[start])) start += 1;
-
- let end = this.html.children[this.html.children.length - 1].end;
- while (whitespace.test(template[end - 1])) end -= 1;
-
- this.html.start = start;
- this.html.end = end;
- } else {
- this.html.start = this.html.end = null;
- }
- }
-
- current() {
- return this.stack[this.stack.length - 1];
- }
-
- acorn_error(err: any) {
- this.error(
- {
- code: 'parse-error',
- message: err.message.replace(/ \(\d+:\d+\)$/, ''),
- },
- err.pos
- );
- }
-
- error({ code, message }: { code: string; message: string }, index = this.index) {
- error(this.template, message, {
- name: 'ParseError',
- code,
- source: this.template,
- start: index,
- filename: this.filename,
- });
- }
-
- eat(str: string, required?: boolean, message?: string) {
- if (this.match(str)) {
- this.index += str.length;
- return true;
- }
-
- if (required) {
- this.error({
- code: `unexpected-${this.index === this.template.length ? 'eof' : 'token'}`,
- message: message || `Expected ${str}`,
- });
- }
-
- return false;
- }
-
- match(str: string) {
- return this.template.slice(this.index, this.index + str.length) === str;
- }
-
- match_regex(pattern: RegExp) {
- const match = pattern.exec(this.template.slice(this.index));
- if (!match || match.index !== 0) return null;
-
- return match[0];
- }
-
- allow_whitespace() {
- while (this.index < this.template.length && whitespace.test(this.template[this.index])) {
- this.index++;
- }
- }
-
- read(pattern: RegExp) {
- const result = this.match_regex(pattern);
- if (result) this.index += result.length;
- return result;
- }
-
- read_identifier(allow_reserved = false) {
- const start = this.index;
-
- let i = this.index;
-
- const code = full_char_code_at(this.template, i);
- if (!isIdentifierStart(code, true)) return null;
-
- i += code <= 0xffff ? 1 : 2;
-
- while (i < this.template.length) {
- const code = full_char_code_at(this.template, i);
-
- if (!isIdentifierChar(code, true)) break;
- i += code <= 0xffff ? 1 : 2;
- }
-
- const identifier = this.template.slice(this.index, (this.index = i));
-
- if (!allow_reserved && reserved.has(identifier)) {
- this.error(
- {
- code: 'unexpected-reserved-word',
- message: `'${identifier}' is a reserved word in JavaScript and cannot be used here`,
- },
- start
- );
- }
-
- return identifier;
- }
-
- read_until(pattern: RegExp) {
- if (this.index >= this.template.length) {
- this.error({
- code: 'unexpected-eof',
- message: 'Unexpected end of input',
- });
- }
-
- const start = this.index;
- const match = pattern.exec(this.template.slice(start));
-
- if (match) {
- this.index = start + match.index;
- return this.template.slice(start, this.index);
- }
-
- this.index = this.template.length;
- return this.template.slice(start);
- }
-
- require_whitespace() {
- if (!whitespace.test(this.template[this.index])) {
- this.error({
- code: 'missing-whitespace',
- message: 'Expected whitespace',
- });
- }
-
- this.allow_whitespace();
- }
-}
-
-/**
- * Parse
- * Step 1/3 in Astro SSR.
- * This is the first pass over .astro files and the step at which we convert a string to an AST for us to crawl.
- */
-export default function parse(template: string, options: ParserOptions = {}): Ast {
- const parser = new Parser(template, options);
-
- // const instance_scripts = parser.js.filter((script) => script.context === 'default');
- // const module_scripts = parser.js.filter((script) => script.context === 'module');
- const astro_scripts = parser.js.filter((script) => script.context === 'setup');
-
- if (astro_scripts.length > 1) {
- parser.error(
- {
- code: 'invalid-script',
- message: 'A component can only have one frontmatter (---) script',
- },
- astro_scripts[1].start
- );
- }
-
- // if (module_scripts.length > 1) {
- // parser.error(
- // {
- // code: 'invalid-script',
- // message: 'A component can only have one <script context="module"> element',
- // },
- // module_scripts[1].start
- // );
- // }
-
- return {
- html: parser.html,
- css: parser.css,
- // instance: instance_scripts[0],
- module: astro_scripts[0],
- meta: {
- features: parser.feature_flags,
- },
- };
-}
diff --git a/packages/astro-parser/src/parse/read/context.ts b/packages/astro-parser/src/parse/read/context.ts
deleted file mode 100644
index 4b69c693f..000000000
--- a/packages/astro-parser/src/parse/read/context.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-// @ts-nocheck
-
-import { Parser } from '../index.js';
-import { isIdentifierStart } from 'acorn';
-import full_char_code_at from '../../utils/full_char_code_at.js';
-import { is_bracket_open, is_bracket_close, is_bracket_pair, get_bracket_close } from '../utils/bracket.js';
-import { parse_expression_at } from './expression.js';
-import { Pattern } from 'estree';
-
-export default function read_context(parser: Parser): Pattern & { start: number; end: number } {
- const start = parser.index;
- let i = parser.index;
-
- const code = full_char_code_at(parser.template, i);
- if (isIdentifierStart(code, true)) {
- return {
- type: 'Identifier',
- name: parser.read_identifier(),
- start,
- end: parser.index,
- };
- }
-
- if (!is_bracket_open(code)) {
- parser.error({
- code: 'unexpected-token',
- message: 'Expected identifier or destructure pattern',
- });
- }
-
- const bracket_stack = [code];
- i += code <= 0xffff ? 1 : 2;
-
- while (i < parser.template.length) {
- const code = full_char_code_at(parser.template, i);
- if (is_bracket_open(code)) {
- bracket_stack.push(code);
- } else if (is_bracket_close(code)) {
- if (!is_bracket_pair(bracket_stack[bracket_stack.length - 1], code)) {
- parser.error({
- code: 'unexpected-token',
- message: `Expected ${String.fromCharCode(get_bracket_close(bracket_stack[bracket_stack.length - 1]))}`,
- });
- }
- bracket_stack.pop();
- if (bracket_stack.length === 0) {
- i += code <= 0xffff ? 1 : 2;
- break;
- }
- }
- i += code <= 0xffff ? 1 : 2;
- }
-
- parser.index = i;
-
- const pattern_string = parser.template.slice(start, i);
- try {
- // the length of the `space_with_newline` has to be start - 1
- // because we added a `(` in front of the pattern_string,
- // which shifted the entire string to right by 1
- // so we offset it by removing 1 character in the `space_with_newline`
- // to achieve that, we remove the 1st space encountered,
- // so it will not affect the `column` of the node
- let space_with_newline = parser.template.slice(0, start).replace(/[^\n]/g, ' ');
- const first_space = space_with_newline.indexOf(' ');
- space_with_newline = space_with_newline.slice(0, first_space) + space_with_newline.slice(first_space + 1);
-
- return (parse_expression_at(`${space_with_newline}(${pattern_string} = 1)`, start - 1) as any).left;
- } catch (error) {
- parser.acorn_error(error);
- }
-}
diff --git a/packages/astro-parser/src/parse/read/expression.ts b/packages/astro-parser/src/parse/read/expression.ts
deleted file mode 100644
index 5d4b05c99..000000000
--- a/packages/astro-parser/src/parse/read/expression.ts
+++ /dev/null
@@ -1,254 +0,0 @@
-import type { BaseNode, Expression } from '../../interfaces';
-import { Parser } from '../index.js';
-import parseAstro from '../index.js';
-
-interface ParseState {
- source: string;
- start: number;
- index: number;
- curlyCount: number;
- bracketCount: number;
- root: Expression;
- parser: Parser;
-}
-
-function peek_char(state: ParseState) {
- return state.source[state.index];
-}
-
-function peek_nonwhitespace(state: ParseState) {
- let index = state.index;
- do {
- let char = state.source[index];
- if (!/\s/.test(char)) {
- return char;
- }
- index++;
- } while (index < state.source.length);
-}
-
-function next_char(state: ParseState) {
- return state.source[state.index++];
-}
-
-function in_bounds(state: ParseState) {
- return state.index < state.source.length;
-}
-
-function consume_string(state: ParseState, stringChar: string) {
- let inEscape;
- do {
- const char = next_char(state);
-
- if (inEscape) {
- inEscape = false;
- } else if (char === '\\') {
- inEscape = true;
- } else if (char === stringChar) {
- break;
- }
- } while (in_bounds(state));
-}
-
-function consume_multiline_comment(state: ParseState) {
- do {
- const char = next_char(state);
-
- if (char === '*' && peek_char(state) === '/') {
- break;
- }
- } while (in_bounds(state));
-}
-
-function consume_line_comment(state: ParseState) {
- do {
- const char = next_char(state);
- if (char === '\n') {
- break;
- }
- } while (in_bounds(state));
-}
-
-const voidElements = new Set(['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
-
-function consume_tag(state: ParseState) {
- const start = state.index - 1;
- let tagName = '';
- let inTag = false;
- let inStart = true;
- let selfClosed = false;
- let inClose = false;
-
- let bracketIndex = 1;
- do {
- const char = next_char(state);
-
- switch (char) {
- case "'":
- case '"':
- case '`': {
- consume_string(state, char);
- break;
- }
- case '<': {
- inTag = false;
- tagName = '';
-
- if (peek_nonwhitespace(state) === '/') {
- inClose = true;
- bracketIndex--;
- } else {
- inStart = true;
- bracketIndex++;
- }
- break;
- }
- case '>': {
- // An arrow function, probably
- if (!inStart && !inClose) {
- break;
- }
-
- bracketIndex--;
-
- const addExpectedBrackets =
- // Void elements don't need a closing
- !voidElements.has(tagName.toLowerCase()) &&
- // Self-closing don't need a closing
- !selfClosed &&
- // If we're in a start tag, we expect to find 2 more brackets
- !inClose;
-
- if (addExpectedBrackets) {
- bracketIndex += 2;
- }
-
- inTag = false;
- selfClosed = false;
- inStart = false;
- inClose = false;
- break;
- }
- case ' ': {
- inTag = true;
- break;
- }
- case '/': {
- if (inStart) {
- selfClosed = true;
- }
- break;
- }
- default: {
- if (!inTag) {
- tagName += char;
- }
- break;
- }
- }
-
- // Unclosed tags
- if (state.curlyCount <= 0) {
- break;
- }
-
- if (bracketIndex === 0) {
- break;
- }
- } while (in_bounds(state));
-
- const source = state.source.substring(start, state.index);
-
- const ast = parseAstro(source);
- state.parser.feature_flags |= ast.meta.features;
- const fragment = ast.html;
-
- return fragment;
-}
-
-function consume_expression(parser: Parser, source: string, start: number): Expression {
- const expr: Expression = {
- type: 'Expression',
- start,
- end: Number.NaN,
- codeChunks: [],
- children: [],
- };
-
- let codeStart: number = start;
-
- const state: ParseState = {
- source,
- start,
- index: start,
- curlyCount: 1,
- bracketCount: 0,
- root: expr,
- parser,
- };
-
- do {
- const char = next_char(state);
-
- switch (char) {
- case '{': {
- state.curlyCount++;
- break;
- }
- case '}': {
- state.curlyCount--;
- break;
- }
- case '<': {
- const chunk = source.substring(codeStart, state.index - 1);
- expr.codeChunks.push(chunk);
- const tag = consume_tag(state);
- expr.children.push(tag);
- codeStart = state.index;
- break;
- }
- case "'":
- case '"':
- case '`': {
- consume_string(state, char);
- break;
- }
- case '/': {
- switch (peek_char(state)) {
- case '/': {
- consume_line_comment(state);
- break;
- }
- case '*': {
- consume_multiline_comment(state);
- break;
- }
- }
- }
- }
- } while (in_bounds(state) && state.curlyCount > 0);
-
- expr.end = state.index - 1;
-
- if (expr.children.length || !expr.codeChunks.length) {
- expr.codeChunks.push(source.substring(codeStart, expr.end));
- }
-
- return expr;
-}
-
-export const parse_expression_at = (parser: Parser, source: string, index: number): Expression => {
- const expression = consume_expression(parser, source, index);
-
- return expression;
-};
-
-export default function read_expression(parser: Parser) {
- try {
- const expression = parse_expression_at(parser, parser.template, parser.index);
- parser.index = expression.end;
- return expression;
- } catch (err) {
- parser.acorn_error(err);
- }
-}
diff --git a/packages/astro-parser/src/parse/read/script.ts b/packages/astro-parser/src/parse/read/script.ts
deleted file mode 100644
index 8725f6a8e..000000000
--- a/packages/astro-parser/src/parse/read/script.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-// @ts-nocheck
-
-import type { Node } from 'estree';
-import { Parser } from '../index.js';
-import { Script } from '../../interfaces.js';
-
-const script_closing_tag = '</script>';
-
-function get_context(parser: Parser, attributes: any[], start: number): 'runtime' | 'setup' {
- const context = attributes.find((attribute) => attribute.name === 'astro');
- if (!context) return 'runtime';
- if (context.value === true) return 'setup';
-
- if (context.value.length !== 1 || context.value[0].type !== 'Text') {
- parser.error(
- {
- code: 'invalid-script',
- message: 'astro attribute must be static',
- },
- start
- );
- }
-
- const value = context.value[0].data;
-
- if (value !== 'setup') {
- parser.error(
- {
- code: 'invalid-script',
- message: 'If the "astro" attribute has a value, its value must be "setup"',
- },
- context.start
- );
- }
-
- return value;
-}
-
-export default function read_script(parser: Parser, start: number, attributes: Node[]): Script {
- const script_start = parser.index;
- const script_end = parser.template.indexOf(script_closing_tag, script_start);
-
- if (script_end === -1) {
- parser.error({
- code: 'unclosed-script',
- message: '<script> must have a closing tag',
- });
- }
-
- const source = parser.template.slice(0, script_start).replace(/[^\n]/g, ' ') + parser.template.slice(script_start, script_end);
- parser.index = script_end + script_closing_tag.length;
-
- return {
- type: 'Script',
- start,
- end: parser.index,
- context: get_context(parser, attributes, start),
- content: source,
- };
-}
diff --git a/packages/astro-parser/src/parse/read/style.ts b/packages/astro-parser/src/parse/read/style.ts
deleted file mode 100644
index 05fb4141d..000000000
--- a/packages/astro-parser/src/parse/read/style.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Parser } from '../index.js';
-import { Style } from '../../interfaces.js';
-
-interface Attribute {
- start: number;
- end: number;
- type: 'Attribute';
- name: string;
- value: {
- raw: string;
- data: string;
- }[];
-}
-
-export default function read_style(parser: Parser, start: number, attributes: Attribute[]): Style {
- const content_start = parser.index;
- const styles = parser.read_until(/<\/style>/);
- const content_end = parser.index;
- parser.eat('</style>', true);
- const end = parser.index;
-
- return {
- type: 'Style',
- start,
- end,
- attributes,
- content: {
- start: content_start,
- end: content_end,
- styles,
- },
- };
-}
-
-function is_ref_selector(a: any, b: any) {
- // TODO add CSS node types
- if (!b) return false;
-
- return a.type === 'TypeSelector' && a.name === 'ref' && b.type === 'PseudoClassSelector';
-}
diff --git a/packages/astro-parser/src/parse/state/codefence.ts b/packages/astro-parser/src/parse/state/codefence.ts
deleted file mode 100644
index b8e96b262..000000000
--- a/packages/astro-parser/src/parse/state/codefence.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-// @ts-nocheck
-import { Parser } from '../index.js';
-
-export default function codefence(parser: Parser) {
- const start = parser.index;
- const open = parser.match_regex(/[`~]{3,}/);
- parser.index += open!.length;
-
- let raw = open + '';
-
- while (parser.index < parser.template.length && !parser.match(open)) {
- raw += parser.template[parser.index++];
- }
-
- parser.eat(open, true);
- raw += open;
- const trailingWhitespace = parser.read_until(/\S/);
- const { metadata, data } = extractCodeFence(raw);
-
- const node = {
- start,
- end: parser.index,
- type: 'CodeFence',
- raw: `${raw}` + trailingWhitespace,
- metadata,
- data,
- };
-
- parser.current().children.push(node);
-}
-
-/** Extract attributes on first line */
-function extractCodeFence(str: string) {
- const [_, leadingLine] = str.match(/(^[^\n]*\r?\n)/m) ?? ['', ''];
- const metadata = leadingLine.trim();
- const data = str.slice(leadingLine.length);
- return { metadata, data };
-}
diff --git a/packages/astro-parser/src/parse/state/codespan.ts b/packages/astro-parser/src/parse/state/codespan.ts
deleted file mode 100644
index 42d0ae932..000000000
--- a/packages/astro-parser/src/parse/state/codespan.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// @ts-nocheck
-import { Parser } from '../index.js';
-
-export default function codespan(parser: Parser) {
- const start = parser.index;
- const open = parser.match_regex(/(?<!\\)`{1,2}/);
- parser.index += open!.length;
-
- let raw = open;
- while (parser.index < parser.template.length && !parser.match(open)) {
- raw += parser.template[parser.index++];
- }
- parser.eat(open, true);
- raw += open;
-
- const node = {
- start,
- end: parser.index,
- type: 'CodeSpan',
- raw,
- data: raw
- ?.slice(open?.length, open?.length * -1)
- .replace(/^ /, '')
- .replace(/ $/, ''),
- };
-
- parser.current().children.push(node);
-}
diff --git a/packages/astro-parser/src/parse/state/fragment.ts b/packages/astro-parser/src/parse/state/fragment.ts
deleted file mode 100644
index fc8874a19..000000000
--- a/packages/astro-parser/src/parse/state/fragment.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import tag from './tag.js';
-import setup from './setup.js';
-import mustache from './mustache.js';
-import text from './text.js';
-import codefence from './codefence.js';
-import codespan from './codespan.js';
-import { Parser } from '../index.js';
-
-export default function fragment(parser: Parser) {
- if (parser.html.children.length === 0 && parser.match_regex(/^---/m)) {
- return setup;
- }
-
- // Fenced code blocks are pretty complex in the GFM spec
- // https://github.github.com/gfm/#fenced-code-blocks
- if (parser.match_regex(/[`~]{3,}/)) {
- return codefence;
- }
- if (parser.match_regex(/(?<!\\)`{1,2}/)) {
- return codespan;
- }
-
- if (parser.match('<')) {
- return tag;
- }
-
- if (parser.match('{')) {
- return mustache;
- }
-
- return text;
-}
diff --git a/packages/astro-parser/src/parse/state/mustache.ts b/packages/astro-parser/src/parse/state/mustache.ts
deleted file mode 100644
index 9300627e1..000000000
--- a/packages/astro-parser/src/parse/state/mustache.ts
+++ /dev/null
@@ -1,412 +0,0 @@
-import read_context from '../read/context.js';
-import read_expression from '../read/expression.js';
-import { closing_tag_omitted } from '../utils/html.js';
-import { whitespace } from '../../utils/patterns.js';
-import { to_string } from '../utils/node.js';
-import { Parser } from '../index.js';
-import { TemplateNode } from '../../interfaces.js';
-
-type TODO = any;
-
-function trim_whitespace(block: TemplateNode, trim_before: boolean, trim_after: boolean) {
- if (!block.children || block.children.length === 0) return; // AwaitBlock
-
- const first_child = block.children[0];
- const last_child = block.children[block.children.length - 1];
-
- if (first_child.type === 'Text' && trim_before) {
- first_child.data = first_child.data.trimStart();
- if (!first_child.data) block.children.shift();
- }
-
- if (last_child.type === 'Text' && trim_after) {
- last_child.data = last_child.data.trimEnd();
- if (!last_child.data) block.children.pop();
- }
-
- if (block.else) {
- trim_whitespace(block.else, trim_before, trim_after);
- }
-
- if (first_child.elseif) {
- trim_whitespace(first_child, trim_before, trim_after);
- }
-}
-
-export default function mustache(parser: Parser) {
- const start = parser.index;
- parser.index += 1;
-
- parser.allow_whitespace();
-
- // {/if}, {/each}, {/await} or {/key}
- if (parser.eat('/')) {
- let block = parser.current();
- let expected: TODO;
-
- if (closing_tag_omitted(block.name)) {
- block.end = start;
- parser.stack.pop();
- block = parser.current();
- }
-
- if (block.type === 'ElseBlock' || block.type === 'PendingBlock' || block.type === 'ThenBlock' || block.type === 'CatchBlock') {
- block.end = start;
- parser.stack.pop();
- block = parser.current();
-
- expected = 'await';
- }
-
- if (block.type === 'IfBlock') {
- expected = 'if';
- } else if (block.type === 'EachBlock') {
- expected = 'each';
- } else if (block.type === 'AwaitBlock') {
- expected = 'await';
- } else if (block.type === 'KeyBlock') {
- expected = 'key';
- } else {
- parser.error({
- code: 'unexpected-block-close',
- message: 'Unexpected block closing tag',
- });
- }
-
- parser.eat(expected, true);
- parser.allow_whitespace();
- parser.eat('}', true);
-
- while (block.elseif) {
- block.end = parser.index;
- parser.stack.pop();
- block = parser.current();
-
- if (block.else) {
- block.else.end = start;
- }
- }
-
- // strip leading/trailing whitespace as necessary
- const char_before = parser.template[block.start - 1];
- const char_after = parser.template[parser.index];
- const trim_before = !char_before || whitespace.test(char_before);
- const trim_after = !char_after || whitespace.test(char_after);
-
- trim_whitespace(block, trim_before, trim_after);
-
- block.end = parser.index;
- parser.stack.pop();
- } else if (parser.eat(':else')) {
- if (parser.eat('if')) {
- parser.error({
- code: 'invalid-elseif',
- message: "'elseif' should be 'else if'",
- });
- }
-
- parser.allow_whitespace();
-
- // :else if
- if (parser.eat('if')) {
- const block = parser.current();
- if (block.type !== 'IfBlock') {
- parser.error({
- code: 'invalid-elseif-placement',
- message: parser.stack.some((block) => block.type === 'IfBlock')
- ? `Expected to close ${to_string(block)} before seeing {:else if ...} block`
- : 'Cannot have an {:else if ...} block outside an {#if ...} block',
- });
- }
-
- parser.require_whitespace();
-
- const expression = read_expression(parser);
-
- parser.allow_whitespace();
- parser.eat('}', true);
-
- block.else = {
- start: parser.index,
- end: null,
- type: 'ElseBlock',
- children: [
- {
- start: parser.index,
- end: null,
- type: 'IfBlock',
- elseif: true,
- expression,
- children: [],
- },
- ],
- };
-
- parser.stack.push(block.else.children[0]);
- } else {
- // :else
- const block = parser.current();
- if (block.type !== 'IfBlock' && block.type !== 'EachBlock') {
- parser.error({
- code: 'invalid-else-placement',
- message: parser.stack.some((block) => block.type === 'IfBlock' || block.type === 'EachBlock')
- ? `Expected to close ${to_string(block)} before seeing {:else} block`
- : 'Cannot have an {:else} block outside an {#if ...} or {#each ...} block',
- });
- }
-
- parser.allow_whitespace();
- parser.eat('}', true);
-
- block.else = {
- start: parser.index,
- end: null,
- type: 'ElseBlock',
- children: [],
- };
-
- parser.stack.push(block.else);
- }
- } else if (parser.match(':then') || parser.match(':catch')) {
- const block = parser.current();
- const is_then = parser.eat(':then') || !parser.eat(':catch');
-
- if (is_then) {
- if (block.type !== 'PendingBlock') {
- parser.error({
- code: 'invalid-then-placement',
- message: parser.stack.some((block) => block.type === 'PendingBlock')
- ? `Expected to close ${to_string(block)} before seeing {:then} block`
- : 'Cannot have an {:then} block outside an {#await ...} block',
- });
- }
- } else {
- if (block.type !== 'ThenBlock' && block.type !== 'PendingBlock') {
- parser.error({
- code: 'invalid-catch-placement',
- message: parser.stack.some((block) => block.type === 'ThenBlock' || block.type === 'PendingBlock')
- ? `Expected to close ${to_string(block)} before seeing {:catch} block`
- : 'Cannot have an {:catch} block outside an {#await ...} block',
- });
- }
- }
-
- block.end = start;
- parser.stack.pop();
- const await_block = parser.current();
-
- if (!parser.eat('}')) {
- parser.require_whitespace();
- await_block[is_then ? 'value' : 'error'] = read_context(parser);
- parser.allow_whitespace();
- parser.eat('}', true);
- }
-
- const new_block: TemplateNode = {
- start,
- // @ts-ignore
- end: null,
- type: is_then ? 'ThenBlock' : 'CatchBlock',
- children: [],
- skip: false,
- };
-
- await_block[is_then ? 'then' : 'catch'] = new_block;
- parser.stack.push(new_block);
- } else if (parser.eat('#')) {
- // {#if foo}, {#each foo} or {#await foo}
- let type;
-
- if (parser.eat('if')) {
- type = 'IfBlock';
- } else if (parser.eat('each')) {
- type = 'EachBlock';
- } else if (parser.eat('await')) {
- type = 'AwaitBlock';
- } else if (parser.eat('key')) {
- type = 'KeyBlock';
- } else {
- parser.error({
- code: 'expected-block-type',
- message: 'Expected if, each, await or key',
- });
- }
-
- parser.require_whitespace();
-
- const expression = read_expression(parser);
-
- // @ts-ignore
- const block: TemplateNode =
- type === 'AwaitBlock'
- ? {
- start,
- end: null,
- type,
- expression,
- value: null,
- error: null,
- pending: {
- start: null,
- end: null,
- type: 'PendingBlock',
- children: [],
- skip: true,
- },
- then: {
- start: null,
- end: null,
- type: 'ThenBlock',
- children: [],
- skip: true,
- },
- catch: {
- start: null,
- end: null,
- type: 'CatchBlock',
- children: [],
- skip: true,
- },
- }
- : {
- start,
- end: null,
- type,
- expression,
- children: [],
- };
-
- parser.allow_whitespace();
-
- // {#each} blocks must declare a context – {#each list as item}
- if (type === 'EachBlock') {
- parser.eat('as', true);
- parser.require_whitespace();
-
- block.context = read_context(parser);
-
- parser.allow_whitespace();
-
- if (parser.eat(',')) {
- parser.allow_whitespace();
- block.index = parser.read_identifier();
- if (!block.index) {
- parser.error({
- code: 'expected-name',
- message: 'Expected name',
- });
- }
-
- parser.allow_whitespace();
- }
-
- if (parser.eat('(')) {
- parser.allow_whitespace();
-
- block.key = read_expression(parser);
- parser.allow_whitespace();
- parser.eat(')', true);
- parser.allow_whitespace();
- }
- }
-
- const await_block_shorthand = type === 'AwaitBlock' && parser.eat('then');
- if (await_block_shorthand) {
- parser.require_whitespace();
- block.value = read_context(parser);
- parser.allow_whitespace();
- }
-
- const await_block_catch_shorthand = !await_block_shorthand && type === 'AwaitBlock' && parser.eat('catch');
- if (await_block_catch_shorthand) {
- parser.require_whitespace();
- block.error = read_context(parser);
- parser.allow_whitespace();
- }
-
- parser.eat('}', true);
-
- // @ts-ignore
- parser.current().children.push(block);
- parser.stack.push(block);
-
- if (type === 'AwaitBlock') {
- let child_block;
- if (await_block_shorthand) {
- block.then.skip = false;
- child_block = block.then;
- } else if (await_block_catch_shorthand) {
- block.catch.skip = false;
- child_block = block.catch;
- } else {
- block.pending.skip = false;
- child_block = block.pending;
- }
-
- child_block.start = parser.index;
- parser.stack.push(child_block);
- }
- } else if (parser.eat('@html')) {
- // {@html content} tag
- parser.require_whitespace();
-
- const expression = read_expression(parser);
-
- parser.allow_whitespace();
- parser.eat('}', true);
-
- // @ts-ignore
- parser.current().children.push({
- start,
- end: parser.index,
- type: 'RawMustacheTag',
- expression,
- });
- } else if (parser.eat('@debug')) {
- // let identifiers;
-
- // // Implies {@debug} which indicates "debug all"
- // if (parser.read(/\s*}/)) {
- // identifiers = [];
- // } else {
- // const expression = read_expression(parser);
-
- // identifiers = expression.type === 'SequenceExpression'
- // ? expression.expressions
- // : [expression];
-
- // identifiers.forEach(node => {
- // if (node.type !== 'Identifier') {
- // parser.error({
- // code: 'invalid-debug-args',
- // message: '{@debug ...} arguments must be identifiers, not arbitrary expressions'
- // }, node.start);
- // }
- // });
-
- // parser.allow_whitespace();
- // parser.eat('}', true);
- // }
-
- // parser.current().children.push({
- // start,
- // end: parser.index,
- // type: 'DebugTag',
- // identifiers
- // });
- throw new Error('@debug not yet supported');
- } else {
- const expression = read_expression(parser);
-
- parser.allow_whitespace();
- parser.eat('}', true);
-
- // @ts-ignore
- parser.current().children.push({
- start,
- end: parser.index,
- type: 'MustacheTag',
- expression,
- });
- }
-}
diff --git a/packages/astro-parser/src/parse/state/setup.ts b/packages/astro-parser/src/parse/state/setup.ts
deleted file mode 100644
index cb23860ad..000000000
--- a/packages/astro-parser/src/parse/state/setup.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-// @ts-nocheck
-
-import { Parser } from '../index.js';
-
-export default function setup(parser: Parser): void {
- // TODO: Error if not at top of file? currently, we ignore / just treat as text.
- // if (parser.html.children.length > 0) {
- // parser.error({
- // code: 'unexpected-token',
- // message: 'Frontmatter scripts only supported at the top of file.',
- // });
- // }
-
- const start = parser.index;
- parser.index += 3;
- const content_start = parser.index;
- const setupScriptContent = parser.read_until(/^---/m);
- const content_end = parser.index;
- parser.eat('---', true);
- const end = parser.index;
- parser.js.push({
- type: 'Script',
- context: 'setup',
- start,
- end,
- content: setupScriptContent,
- // attributes,
- // content: {
- // start: content_start,
- // end: content_end,
- // styles,
- // },
- });
- return;
-}
diff --git a/packages/astro-parser/src/parse/state/tag.ts b/packages/astro-parser/src/parse/state/tag.ts
deleted file mode 100644
index 8f940cbc3..000000000
--- a/packages/astro-parser/src/parse/state/tag.ts
+++ /dev/null
@@ -1,499 +0,0 @@
-// @ts-nocheck
-
-import read_expression from '../read/expression.js';
-import read_style from '../read/style.js';
-import { decode_character_references, closing_tag_omitted } from '../utils/html.js';
-import { is_void } from '../../utils/names.js';
-import { Parser } from '../index.js';
-import { TemplateNode, Text } from '../../interfaces.js';
-import fuzzymatch from '../../utils/fuzzymatch.js';
-import list from '../../utils/list.js';
-import { FEATURE_CUSTOM_ELEMENT } from '../utils/features.js';
-
-const valid_tag_name = /^\!?[a-zA-Z]{1,}:?[a-zA-Z0-9\-]*/;
-
-const meta_tags = new Map([
- ['astro:head', 'Head'],
- ['', 'SlotTemplate'],
- // ['astro:options', 'Options'],
- // ['astro:window', 'Window'],
- // ['astro:body', 'Body'],
-]);
-
-const valid_meta_tags = Array.from(meta_tags.keys()); //.concat('astro:self', 'astro:component', 'astro:fragment');
-
-const specials = new Map([
- // Now handled as "setup" in setup.ts
- // [
- // 'script',
- // {
- // read: read_script,
- // property: 'js',
- // },
- // ],
- [
- 'style',
- {
- read: read_style,
- property: 'css',
- },
- ],
-]);
-
-const SELF = /^astro:self(?=[\s/>])/;
-const COMPONENT = /^astro:component(?=[\s/>])/;
-const SLOT = /^astro:fragment(?=[\s/>])/;
-const HEAD = /^head(?=[\s/>])/;
-const CUSTOM_ELEMENT = /-/;
-
-function parent_is_head(stack) {
- let i = stack.length;
- while (i--) {
- const { type } = stack[i];
- if (type === 'Head') return true;
- if (type === 'Element' || type === 'InlineComponent') return false;
- }
- return false;
-}
-
-export default function tag(parser: Parser) {
- const start = parser.index++;
-
- let parent = parser.current();
-
- if (parser.eat('!--')) {
- const data = parser.read_until(/-->/);
- parser.eat('-->', true, 'comment was left open, expected -->');
-
- parser.current().children.push({
- start,
- end: parser.index,
- type: 'Comment',
- data,
- });
-
- return;
- }
-
- const is_closing_tag = parser.eat('/');
-
- const name = read_tag_name(parser);
-
- if (CUSTOM_ELEMENT.test(name)) {
- parser.feature_flags |= FEATURE_CUSTOM_ELEMENT;
- }
-
- if (meta_tags.has(name)) {
- const slug = meta_tags.get(name).toLowerCase();
- if (is_closing_tag) {
- if ((name === 'astro:window' || name === 'astro:body') && parser.current().children.length) {
- parser.error(
- {
- code: `invalid-${slug}-content`,
- message: `<${name}> cannot have children`,
- },
- parser.current().children[0].start
- );
- }
- } else {
- if (name in parser.meta_tags) {
- parser.error(
- {
- code: `duplicate-${slug}`,
- message: `A component can only have one <${name}> tag`,
- },
- start
- );
- }
-
- if (parser.stack.length > 1) {
- parser.error(
- {
- code: `invalid-${slug}-placement`,
- message: `<${name}> tags cannot be inside elements or blocks`,
- },
- start
- );
- }
-
- parser.meta_tags[name] = true;
- }
- }
-
- const type = meta_tags.has(name)
- ? meta_tags.get(name)
- : /[A-Z]/.test(name[0]) || name === 'astro:self' || name === 'astro:component'
- ? 'InlineComponent'
- : name === ''
- ? 'SlotTemplate'
- : name === 'title' && parent_is_head(parser.stack)
- ? 'Title'
- : name === 'slot' && !parser.customElement
- ? 'Slot'
- : 'Element';
-
- const element: TemplateNode = {
- start,
- end: null, // filled in later
- type,
- name,
- attributes: [],
- children: [],
- };
-
- parser.allow_whitespace();
-
- if (is_closing_tag) {
- if (is_void(name)) {
- parser.error(
- {
- code: 'invalid-void-content',
- message: `<${name}> is a void element and cannot have children, or a closing tag`,
- },
- start
- );
- }
-
- parser.eat('>', true);
-
- // close any elements that don't have their own closing tags, e.g. <div><p></div>
- while (parent.name !== name) {
- if (parent.type !== 'Element') {
- const message =
- parser.last_auto_closed_tag && parser.last_auto_closed_tag.tag === name
- ? `</${name}> attempted to close <${name}> that was already automatically closed by <${parser.last_auto_closed_tag.reason}>`
- : `</${name}> attempted to close an element that was not open`;
- parser.error(
- {
- code: 'invalid-closing-tag',
- message,
- },
- start
- );
- }
-
- parent.end = start;
- parser.stack.pop();
-
- parent = parser.current();
- }
-
- parent.end = parser.index;
- parser.stack.pop();
-
- if (parser.last_auto_closed_tag && parser.stack.length < parser.last_auto_closed_tag.depth) {
- parser.last_auto_closed_tag = null;
- }
-
- return;
- } else if (closing_tag_omitted(parent.name, name)) {
- parent.end = start;
- parser.stack.pop();
- parser.last_auto_closed_tag = {
- tag: parent.name,
- reason: name,
- depth: parser.stack.length,
- };
- }
-
- const unique_names: Set<string> = new Set();
-
- let attribute;
- while ((attribute = read_attribute(parser, unique_names))) {
- element.attributes.push(attribute);
- parser.allow_whitespace();
- }
-
- if (name === 'astro:component') {
- const index = element.attributes.findIndex((attr) => attr.type === 'Attribute' && attr.name === 'this');
- if (!~index) {
- parser.error(
- {
- code: 'missing-component-definition',
- message: "<astro:component> must have a 'this' attribute",
- },
- start
- );
- }
-
- const definition = element.attributes.splice(index, 1)[0];
- if (definition.value === true || definition.value.length !== 1 || definition.value[0].type === 'Text') {
- parser.error(
- {
- code: 'invalid-component-definition',
- message: 'invalid component definition',
- },
- definition.start
- );
- }
-
- element.expression = definition.value[0].expression;
- }
-
- // special cases – top-level <script> and <style>
- if (specials.has(name) && parser.stack.length === 1) {
- const special = specials.get(name);
-
- parser.eat('>', true);
- const content = special.read(parser, start, element.attributes);
- if (content) parser[special.property].push(content);
- return;
- }
-
- parser.current().children.push(element);
-
- const self_closing = parser.eat('/') || is_void(name);
-
- parser.eat('>', true);
-
- if (self_closing) {
- // don't push self-closing elements onto the stack
- element.end = parser.index;
- } else if (name === 'textarea') {
- // special case
- element.children = read_sequence(parser, () => parser.template.slice(parser.index, parser.index + 11) === '</textarea>');
- parser.read(/<\/textarea>/);
- element.end = parser.index;
- } else if (name === 'script' || name === 'style') {
- // special case
- const start = parser.index;
- const data = parser.read_until(new RegExp(`</${name}>`));
- const end = parser.index;
- element.children.push({ start, end, type: 'Text', data });
- parser.eat(`</${name}>`, true);
- element.end = parser.index;
- } else {
- parser.stack.push(element);
- }
-}
-
-function read_tag_name(parser: Parser) {
- const start = parser.index;
-
- if (parser.read(SELF)) {
- // check we're inside a block, otherwise this
- // will cause infinite recursion
- let i = parser.stack.length;
- let legal = false;
-
- while (i--) {
- const fragment = parser.stack[i];
- if (fragment.type === 'IfBlock' || fragment.type === 'EachBlock' || fragment.type === 'InlineComponent') {
- legal = true;
- break;
- }
- }
-
- if (!legal) {
- parser.error(
- {
- code: 'invalid-self-placement',
- message: '<astro:self> components can only exist inside {#if} blocks, {#each} blocks, or slots passed to components',
- },
- start
- );
- }
-
- return 'astro:self';
- }
-
- if (parser.read(COMPONENT)) return 'astro:component';
-
- if (parser.read(SLOT)) return 'astro:fragment';
-
- if (parser.read(HEAD)) return 'head';
-
- const name = parser.read_until(/(\s|\/|>)/);
-
- if (meta_tags.has(name)) return name;
-
- if (name.startsWith('astro:')) {
- const match = fuzzymatch(name.slice(7), valid_meta_tags);
-
- let message = `Valid <astro:...> tag names are ${list(valid_meta_tags)}`;
- if (match) message += ` (did you mean '${match}'?)`;
-
- parser.error(
- {
- code: 'invalid-tag-name',
- message,
- },
- start
- );
- }
-
- if (!valid_tag_name.test(name)) {
- parser.error(
- {
- code: 'invalid-tag-name',
- message: 'Expected valid tag name',
- },
- start
- );
- }
-
- return name;
-}
-
-function read_attribute(parser: Parser, unique_names: Set<string>) {
- const start = parser.index;
-
- function check_unique(name: string) {
- if (unique_names.has(name)) {
- parser.error(
- {
- code: 'duplicate-attribute',
- message: 'Attributes need to be unique',
- },
- start
- );
- }
- unique_names.add(name);
- }
-
- if (parser.eat('{')) {
- parser.allow_whitespace();
-
- if (parser.eat('...')) {
- const expression = read_expression(parser);
- parser.allow_whitespace();
- parser.eat('}', true);
-
- return {
- start,
- end: parser.index,
- type: 'Spread',
- expression,
- };
- } else {
- const value_start = parser.index;
-
- const name = parser.read_identifier();
- parser.allow_whitespace();
- parser.eat('}', true);
-
- check_unique(name);
-
- return {
- start,
- end: parser.index,
- type: 'Attribute',
- name,
- value: [
- {
- start: value_start,
- end: value_start + name.length,
- type: 'AttributeShorthand',
- expression: {
- start: value_start,
- end: value_start + name.length,
- type: 'Identifier',
- name,
- },
- },
- ],
- };
- }
- }
-
- const name = parser.read_until(/[\s=\/>"']/);
- if (!name) return null;
-
- let end = parser.index;
-
- parser.allow_whitespace();
-
- let value: any[] | true = true;
- if (parser.eat('=')) {
- parser.allow_whitespace();
- value = read_attribute_value(parser);
- end = parser.index;
- } else if (parser.match_regex(/["']/)) {
- parser.error(
- {
- code: 'unexpected-token',
- message: 'Expected =',
- },
- parser.index
- );
- }
-
- check_unique(name);
-
- return {
- start,
- end,
- type: 'Attribute',
- name,
- value,
- };
-}
-
-function read_attribute_value(parser: Parser) {
- const quote_mark = parser.eat("'") ? "'" : parser.eat('"') ? '"' : null;
-
- const regex = quote_mark === "'" ? /'/ : quote_mark === '"' ? /"/ : /(\/>|[\s"'=<>`])/;
-
- const value = read_sequence(parser, () => !!parser.match_regex(regex));
-
- if (quote_mark) parser.index += 1;
- return value;
-}
-
-export function read_sequence(parser: Parser, done: () => boolean): TemplateNode[] {
- let current_chunk: Text = {
- start: parser.index,
- end: null,
- type: 'Text',
- raw: '',
- data: null,
- };
-
- function flush() {
- if (current_chunk.raw) {
- current_chunk.data = decode_character_references(current_chunk.raw);
- current_chunk.end = parser.index;
- chunks.push(current_chunk);
- }
- }
-
- const chunks: TemplateNode[] = [];
-
- while (parser.index < parser.template.length) {
- const index = parser.index;
-
- if (done()) {
- flush();
- return chunks;
- } else if (parser.eat('{')) {
- flush();
-
- parser.allow_whitespace();
- const expression = read_expression(parser);
- parser.allow_whitespace();
- parser.eat('}', true);
-
- chunks.push({
- start: index,
- end: parser.index,
- type: 'MustacheTag',
- expression,
- });
-
- current_chunk = {
- start: parser.index,
- end: null,
- type: 'Text',
- raw: '',
- data: null,
- };
- } else {
- current_chunk.raw += parser.template[parser.index++];
- }
- }
-
- parser.error({
- code: 'unexpected-eof',
- message: 'Unexpected end of input',
- });
-}
diff --git a/packages/astro-parser/src/parse/state/text.ts b/packages/astro-parser/src/parse/state/text.ts
deleted file mode 100644
index 2bd87e37c..000000000
--- a/packages/astro-parser/src/parse/state/text.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// @ts-nocheck
-
-import { decode_character_references } from '../utils/html.js';
-import { Parser } from '../index.js';
-
-export default function text(parser: Parser) {
- const start = parser.index;
-
- let data = '';
-
- const shouldContinue = () => {
- // Special case 'code' content to avoid tripping up on user code
- if (parser.current().name === 'code') {
- return !parser.match('<') && !parser.match('{');
- }
- return !parser.match('<') && !parser.match('{') && !parser.match('`');
- };
-
- while (parser.index < parser.template.length && shouldContinue()) {
- data += parser.template[parser.index++];
- }
-
- const node = {
- start,
- end: parser.index,
- type: 'Text',
- raw: data,
- data: decode_character_references(data),
- };
-
- parser.current().children.push(node);
-}
diff --git a/packages/astro-parser/src/parse/utils/bracket.ts b/packages/astro-parser/src/parse/utils/bracket.ts
deleted file mode 100644
index a265e9f3d..000000000
--- a/packages/astro-parser/src/parse/utils/bracket.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// @ts-nocheck
-
-const SQUARE_BRACKET_OPEN = '['.charCodeAt(0);
-const SQUARE_BRACKET_CLOSE = ']'.charCodeAt(0);
-const CURLY_BRACKET_OPEN = '{'.charCodeAt(0);
-const CURLY_BRACKET_CLOSE = '}'.charCodeAt(0);
-
-export function is_bracket_open(code) {
- return code === SQUARE_BRACKET_OPEN || code === CURLY_BRACKET_OPEN;
-}
-
-export function is_bracket_close(code) {
- return code === SQUARE_BRACKET_CLOSE || code === CURLY_BRACKET_CLOSE;
-}
-
-export function is_bracket_pair(open, close) {
- return (open === SQUARE_BRACKET_OPEN && close === SQUARE_BRACKET_CLOSE) || (open === CURLY_BRACKET_OPEN && close === CURLY_BRACKET_CLOSE);
-}
-
-export function get_bracket_close(open) {
- if (open === SQUARE_BRACKET_OPEN) {
- return SQUARE_BRACKET_CLOSE;
- }
- if (open === CURLY_BRACKET_OPEN) {
- return CURLY_BRACKET_CLOSE;
- }
-}
diff --git a/packages/astro-parser/src/parse/utils/entities.ts b/packages/astro-parser/src/parse/utils/entities.ts
deleted file mode 100644
index 91689c5f3..000000000
--- a/packages/astro-parser/src/parse/utils/entities.ts
+++ /dev/null
@@ -1,2034 +0,0 @@
-// https://dev.w3.org/html5/html-author/charref
-export default {
- CounterClockwiseContourIntegral: 8755,
- ClockwiseContourIntegral: 8754,
- DoubleLongLeftRightArrow: 10234,
- DiacriticalDoubleAcute: 733,
- NotSquareSupersetEqual: 8931,
- CloseCurlyDoubleQuote: 8221,
- DoubleContourIntegral: 8751,
- FilledVerySmallSquare: 9642,
- NegativeVeryThinSpace: 8203,
- NotPrecedesSlantEqual: 8928,
- NotRightTriangleEqual: 8941,
- NotSucceedsSlantEqual: 8929,
- CapitalDifferentialD: 8517,
- DoubleLeftRightArrow: 8660,
- DoubleLongRightArrow: 10233,
- EmptyVerySmallSquare: 9643,
- NestedGreaterGreater: 8811,
- NotDoubleVerticalBar: 8742,
- NotLeftTriangleEqual: 8940,
- NotSquareSubsetEqual: 8930,
- OpenCurlyDoubleQuote: 8220,
- ReverseUpEquilibrium: 10607,
- DoubleLongLeftArrow: 10232,
- DownLeftRightVector: 10576,
- LeftArrowRightArrow: 8646,
- NegativeMediumSpace: 8203,
- RightArrowLeftArrow: 8644,
- SquareSupersetEqual: 8850,
- leftrightsquigarrow: 8621,
- DownRightTeeVector: 10591,
- DownRightVectorBar: 10583,
- LongLeftRightArrow: 10231,
- Longleftrightarrow: 10234,
- NegativeThickSpace: 8203,
- PrecedesSlantEqual: 8828,
- ReverseEquilibrium: 8651,
- RightDoubleBracket: 10215,
- RightDownTeeVector: 10589,
- RightDownVectorBar: 10581,
- RightTriangleEqual: 8885,
- SquareIntersection: 8851,
- SucceedsSlantEqual: 8829,
- blacktriangleright: 9656,
- longleftrightarrow: 10231,
- DoubleUpDownArrow: 8661,
- DoubleVerticalBar: 8741,
- DownLeftTeeVector: 10590,
- DownLeftVectorBar: 10582,
- FilledSmallSquare: 9724,
- GreaterSlantEqual: 10878,
- LeftDoubleBracket: 10214,
- LeftDownTeeVector: 10593,
- LeftDownVectorBar: 10585,
- LeftTriangleEqual: 8884,
- NegativeThinSpace: 8203,
- NotReverseElement: 8716,
- NotTildeFullEqual: 8775,
- RightAngleBracket: 10217,
- RightUpDownVector: 10575,
- SquareSubsetEqual: 8849,
- VerticalSeparator: 10072,
- blacktriangledown: 9662,
- blacktriangleleft: 9666,
- leftrightharpoons: 8651,
- rightleftharpoons: 8652,
- twoheadrightarrow: 8608,
- DiacriticalAcute: 180,
- DiacriticalGrave: 96,
- DiacriticalTilde: 732,
- DoubleRightArrow: 8658,
- DownArrowUpArrow: 8693,
- EmptySmallSquare: 9723,
- GreaterEqualLess: 8923,
- GreaterFullEqual: 8807,
- LeftAngleBracket: 10216,
- LeftUpDownVector: 10577,
- LessEqualGreater: 8922,
- NonBreakingSpace: 160,
- NotRightTriangle: 8939,
- NotSupersetEqual: 8841,
- RightTriangleBar: 10704,
- RightUpTeeVector: 10588,
- RightUpVectorBar: 10580,
- UnderParenthesis: 9181,
- UpArrowDownArrow: 8645,
- circlearrowright: 8635,
- downharpoonright: 8642,
- ntrianglerighteq: 8941,
- rightharpoondown: 8641,
- rightrightarrows: 8649,
- twoheadleftarrow: 8606,
- vartriangleright: 8883,
- CloseCurlyQuote: 8217,
- ContourIntegral: 8750,
- DoubleDownArrow: 8659,
- DoubleLeftArrow: 8656,
- DownRightVector: 8641,
- LeftRightVector: 10574,
- LeftTriangleBar: 10703,
- LeftUpTeeVector: 10592,
- LeftUpVectorBar: 10584,
- LowerRightArrow: 8600,
- NotGreaterEqual: 8817,
- NotGreaterTilde: 8821,
- NotLeftTriangle: 8938,
- OverParenthesis: 9180,
- RightDownVector: 8642,
- ShortRightArrow: 8594,
- UpperRightArrow: 8599,
- bigtriangledown: 9661,
- circlearrowleft: 8634,
- curvearrowright: 8631,
- downharpoonleft: 8643,
- leftharpoondown: 8637,
- leftrightarrows: 8646,
- nLeftrightarrow: 8654,
- nleftrightarrow: 8622,
- ntrianglelefteq: 8940,
- rightleftarrows: 8644,
- rightsquigarrow: 8605,
- rightthreetimes: 8908,
- straightepsilon: 1013,
- trianglerighteq: 8885,
- vartriangleleft: 8882,
- DiacriticalDot: 729,
- DoubleRightTee: 8872,
- DownLeftVector: 8637,
- GreaterGreater: 10914,
- HorizontalLine: 9472,
- InvisibleComma: 8291,
- InvisibleTimes: 8290,
- LeftDownVector: 8643,
- LeftRightArrow: 8596,
- Leftrightarrow: 8660,
- LessSlantEqual: 10877,
- LongRightArrow: 10230,
- Longrightarrow: 10233,
- LowerLeftArrow: 8601,
- NestedLessLess: 8810,
- NotGreaterLess: 8825,
- NotLessGreater: 8824,
- NotSubsetEqual: 8840,
- NotVerticalBar: 8740,
- OpenCurlyQuote: 8216,
- ReverseElement: 8715,
- RightTeeVector: 10587,
- RightVectorBar: 10579,
- ShortDownArrow: 8595,
- ShortLeftArrow: 8592,
- SquareSuperset: 8848,
- TildeFullEqual: 8773,
- UpperLeftArrow: 8598,
- ZeroWidthSpace: 8203,
- curvearrowleft: 8630,
- doublebarwedge: 8966,
- downdownarrows: 8650,
- hookrightarrow: 8618,
- leftleftarrows: 8647,
- leftrightarrow: 8596,
- leftthreetimes: 8907,
- longrightarrow: 10230,
- looparrowright: 8620,
- nshortparallel: 8742,
- ntriangleright: 8939,
- rightarrowtail: 8611,
- rightharpoonup: 8640,
- trianglelefteq: 8884,
- upharpoonright: 8638,
- ApplyFunction: 8289,
- DifferentialD: 8518,
- DoubleLeftTee: 10980,
- DoubleUpArrow: 8657,
- LeftTeeVector: 10586,
- LeftVectorBar: 10578,
- LessFullEqual: 8806,
- LongLeftArrow: 10229,
- Longleftarrow: 10232,
- NotTildeEqual: 8772,
- NotTildeTilde: 8777,
- Poincareplane: 8460,
- PrecedesEqual: 10927,
- PrecedesTilde: 8830,
- RightArrowBar: 8677,
- RightTeeArrow: 8614,
- RightTriangle: 8883,
- RightUpVector: 8638,
- SucceedsEqual: 10928,
- SucceedsTilde: 8831,
- SupersetEqual: 8839,
- UpEquilibrium: 10606,
- VerticalTilde: 8768,
- VeryThinSpace: 8202,
- bigtriangleup: 9651,
- blacktriangle: 9652,
- divideontimes: 8903,
- fallingdotseq: 8786,
- hookleftarrow: 8617,
- leftarrowtail: 8610,
- leftharpoonup: 8636,
- longleftarrow: 10229,
- looparrowleft: 8619,
- measuredangle: 8737,
- ntriangleleft: 8938,
- shortparallel: 8741,
- smallsetminus: 8726,
- triangleright: 9657,
- upharpoonleft: 8639,
- DownArrowBar: 10515,
- DownTeeArrow: 8615,
- ExponentialE: 8519,
- GreaterEqual: 8805,
- GreaterTilde: 8819,
- HilbertSpace: 8459,
- HumpDownHump: 8782,
- Intersection: 8898,
- LeftArrowBar: 8676,
- LeftTeeArrow: 8612,
- LeftTriangle: 8882,
- LeftUpVector: 8639,
- NotCongruent: 8802,
- NotLessEqual: 8816,
- NotLessTilde: 8820,
- Proportional: 8733,
- RightCeiling: 8969,
- RoundImplies: 10608,
- ShortUpArrow: 8593,
- SquareSubset: 8847,
- UnderBracket: 9141,
- VerticalLine: 124,
- blacklozenge: 10731,
- exponentiale: 8519,
- risingdotseq: 8787,
- triangledown: 9663,
- triangleleft: 9667,
- CircleMinus: 8854,
- CircleTimes: 8855,
- Equilibrium: 8652,
- GreaterLess: 8823,
- LeftCeiling: 8968,
- LessGreater: 8822,
- MediumSpace: 8287,
- NotPrecedes: 8832,
- NotSucceeds: 8833,
- OverBracket: 9140,
- RightVector: 8640,
- Rrightarrow: 8667,
- RuleDelayed: 10740,
- SmallCircle: 8728,
- SquareUnion: 8852,
- SubsetEqual: 8838,
- UpDownArrow: 8597,
- Updownarrow: 8661,
- VerticalBar: 8739,
- backepsilon: 1014,
- blacksquare: 9642,
- circledcirc: 8858,
- circleddash: 8861,
- curlyeqprec: 8926,
- curlyeqsucc: 8927,
- diamondsuit: 9830,
- eqslantless: 10901,
- expectation: 8496,
- nRightarrow: 8655,
- nrightarrow: 8603,
- preccurlyeq: 8828,
- precnapprox: 10937,
- quaternions: 8461,
- straightphi: 981,
- succcurlyeq: 8829,
- succnapprox: 10938,
- thickapprox: 8776,
- updownarrow: 8597,
- Bernoullis: 8492,
- CirclePlus: 8853,
- EqualTilde: 8770,
- Fouriertrf: 8497,
- ImaginaryI: 8520,
- Laplacetrf: 8466,
- LeftVector: 8636,
- Lleftarrow: 8666,
- NotElement: 8713,
- NotGreater: 8815,
- Proportion: 8759,
- RightArrow: 8594,
- RightFloor: 8971,
- Rightarrow: 8658,
- TildeEqual: 8771,
- TildeTilde: 8776,
- UnderBrace: 9183,
- UpArrowBar: 10514,
- UpTeeArrow: 8613,
- circledast: 8859,
- complement: 8705,
- curlywedge: 8911,
- eqslantgtr: 10902,
- gtreqqless: 10892,
- lessapprox: 10885,
- lesseqqgtr: 10891,
- lmoustache: 9136,
- longmapsto: 10236,
- mapstodown: 8615,
- mapstoleft: 8612,
- nLeftarrow: 8653,
- nleftarrow: 8602,
- precapprox: 10935,
- rightarrow: 8594,
- rmoustache: 9137,
- sqsubseteq: 8849,
- sqsupseteq: 8850,
- subsetneqq: 10955,
- succapprox: 10936,
- supsetneqq: 10956,
- upuparrows: 8648,
- varepsilon: 949,
- varnothing: 8709,
- Backslash: 8726,
- CenterDot: 183,
- CircleDot: 8857,
- Congruent: 8801,
- Coproduct: 8720,
- DoubleDot: 168,
- DownArrow: 8595,
- DownBreve: 785,
- Downarrow: 8659,
- HumpEqual: 8783,
- LeftArrow: 8592,
- LeftFloor: 8970,
- Leftarrow: 8656,
- LessTilde: 8818,
- Mellintrf: 8499,
- MinusPlus: 8723,
- NotCupCap: 8813,
- NotExists: 8708,
- OverBrace: 9182,
- PlusMinus: 177,
- Therefore: 8756,
- ThinSpace: 8201,
- TripleDot: 8411,
- UnionPlus: 8846,
- backprime: 8245,
- backsimeq: 8909,
- bigotimes: 10754,
- centerdot: 183,
- checkmark: 10003,
- complexes: 8450,
- dotsquare: 8865,
- downarrow: 8595,
- gtrapprox: 10886,
- gtreqless: 8923,
- heartsuit: 9829,
- leftarrow: 8592,
- lesseqgtr: 8922,
- nparallel: 8742,
- nshortmid: 8740,
- nsubseteq: 8840,
- nsupseteq: 8841,
- pitchfork: 8916,
- rationals: 8474,
- spadesuit: 9824,
- subseteqq: 10949,
- subsetneq: 8842,
- supseteqq: 10950,
- supsetneq: 8843,
- therefore: 8756,
- triangleq: 8796,
- varpropto: 8733,
- DDotrahd: 10513,
- DotEqual: 8784,
- Integral: 8747,
- LessLess: 10913,
- NotEqual: 8800,
- NotTilde: 8769,
- PartialD: 8706,
- Precedes: 8826,
- RightTee: 8866,
- Succeeds: 8827,
- SuchThat: 8715,
- Superset: 8835,
- Uarrocir: 10569,
- UnderBar: 818,
- andslope: 10840,
- angmsdaa: 10664,
- angmsdab: 10665,
- angmsdac: 10666,
- angmsdad: 10667,
- angmsdae: 10668,
- angmsdaf: 10669,
- angmsdag: 10670,
- angmsdah: 10671,
- angrtvbd: 10653,
- approxeq: 8778,
- awconint: 8755,
- backcong: 8780,
- barwedge: 8965,
- bbrktbrk: 9142,
- bigoplus: 10753,
- bigsqcup: 10758,
- biguplus: 10756,
- bigwedge: 8896,
- boxminus: 8863,
- boxtimes: 8864,
- capbrcup: 10825,
- circledR: 174,
- circledS: 9416,
- cirfnint: 10768,
- clubsuit: 9827,
- cupbrcap: 10824,
- curlyvee: 8910,
- cwconint: 8754,
- doteqdot: 8785,
- dotminus: 8760,
- drbkarow: 10512,
- dzigrarr: 10239,
- elinters: 9191,
- emptyset: 8709,
- eqvparsl: 10725,
- fpartint: 10765,
- geqslant: 10878,
- gesdotol: 10884,
- gnapprox: 10890,
- hksearow: 10533,
- hkswarow: 10534,
- imagline: 8464,
- imagpart: 8465,
- infintie: 10717,
- integers: 8484,
- intercal: 8890,
- intlarhk: 10775,
- laemptyv: 10676,
- ldrushar: 10571,
- leqslant: 10877,
- lesdotor: 10883,
- llcorner: 8990,
- lnapprox: 10889,
- lrcorner: 8991,
- lurdshar: 10570,
- mapstoup: 8613,
- multimap: 8888,
- naturals: 8469,
- otimesas: 10806,
- parallel: 8741,
- plusacir: 10787,
- pointint: 10773,
- precneqq: 10933,
- precnsim: 8936,
- profalar: 9006,
- profline: 8978,
- profsurf: 8979,
- raemptyv: 10675,
- realpart: 8476,
- rppolint: 10770,
- rtriltri: 10702,
- scpolint: 10771,
- setminus: 8726,
- shortmid: 8739,
- smeparsl: 10724,
- sqsubset: 8847,
- sqsupset: 8848,
- subseteq: 8838,
- succneqq: 10934,
- succnsim: 8937,
- supseteq: 8839,
- thetasym: 977,
- thicksim: 8764,
- timesbar: 10801,
- triangle: 9653,
- triminus: 10810,
- trpezium: 9186,
- ulcorner: 8988,
- urcorner: 8989,
- varkappa: 1008,
- varsigma: 962,
- vartheta: 977,
- Because: 8757,
- Cayleys: 8493,
- Cconint: 8752,
- Cedilla: 184,
- Diamond: 8900,
- DownTee: 8868,
- Element: 8712,
- Epsilon: 917,
- Implies: 8658,
- LeftTee: 8867,
- NewLine: 10,
- NoBreak: 8288,
- NotLess: 8814,
- Omicron: 927,
- OverBar: 175,
- Product: 8719,
- UpArrow: 8593,
- Uparrow: 8657,
- Upsilon: 933,
- alefsym: 8501,
- angrtvb: 8894,
- angzarr: 9084,
- asympeq: 8781,
- backsim: 8765,
- because: 8757,
- bemptyv: 10672,
- between: 8812,
- bigcirc: 9711,
- bigodot: 10752,
- bigstar: 9733,
- boxplus: 8862,
- ccupssm: 10832,
- cemptyv: 10674,
- cirscir: 10690,
- coloneq: 8788,
- congdot: 10861,
- cudarrl: 10552,
- cudarrr: 10549,
- cularrp: 10557,
- curarrm: 10556,
- dbkarow: 10511,
- ddagger: 8225,
- ddotseq: 10871,
- demptyv: 10673,
- diamond: 8900,
- digamma: 989,
- dotplus: 8724,
- dwangle: 10662,
- epsilon: 949,
- eqcolon: 8789,
- equivDD: 10872,
- gesdoto: 10882,
- gtquest: 10876,
- gtrless: 8823,
- harrcir: 10568,
- intprod: 10812,
- isindot: 8949,
- larrbfs: 10527,
- larrsim: 10611,
- lbrksld: 10639,
- lbrkslu: 10637,
- ldrdhar: 10599,
- lesdoto: 10881,
- lessdot: 8918,
- lessgtr: 8822,
- lesssim: 8818,
- lotimes: 10804,
- lozenge: 9674,
- ltquest: 10875,
- luruhar: 10598,
- maltese: 10016,
- minusdu: 10794,
- napprox: 8777,
- natural: 9838,
- nearrow: 8599,
- nexists: 8708,
- notinva: 8713,
- notinvb: 8951,
- notinvc: 8950,
- notniva: 8716,
- notnivb: 8958,
- notnivc: 8957,
- npolint: 10772,
- nsqsube: 8930,
- nsqsupe: 8931,
- nvinfin: 10718,
- nwarrow: 8598,
- olcross: 10683,
- omicron: 959,
- orderof: 8500,
- orslope: 10839,
- pertenk: 8241,
- planckh: 8462,
- pluscir: 10786,
- plussim: 10790,
- plustwo: 10791,
- precsim: 8830,
- quatint: 10774,
- questeq: 8799,
- rarrbfs: 10528,
- rarrsim: 10612,
- rbrksld: 10638,
- rbrkslu: 10640,
- rdldhar: 10601,
- realine: 8475,
- rotimes: 10805,
- ruluhar: 10600,
- searrow: 8600,
- simplus: 10788,
- simrarr: 10610,
- subedot: 10947,
- submult: 10945,
- subplus: 10943,
- subrarr: 10617,
- succsim: 8831,
- supdsub: 10968,
- supedot: 10948,
- suphsub: 10967,
- suplarr: 10619,
- supmult: 10946,
- supplus: 10944,
- swarrow: 8601,
- topfork: 10970,
- triplus: 10809,
- tritime: 10811,
- uparrow: 8593,
- upsilon: 965,
- uwangle: 10663,
- vzigzag: 10650,
- zigrarr: 8669,
- Aacute: 193,
- Abreve: 258,
- Agrave: 192,
- Assign: 8788,
- Atilde: 195,
- Barwed: 8966,
- Bumpeq: 8782,
- Cacute: 262,
- Ccaron: 268,
- Ccedil: 199,
- Colone: 10868,
- Conint: 8751,
- CupCap: 8781,
- Dagger: 8225,
- Dcaron: 270,
- DotDot: 8412,
- Dstrok: 272,
- Eacute: 201,
- Ecaron: 282,
- Egrave: 200,
- Exists: 8707,
- ForAll: 8704,
- Gammad: 988,
- Gbreve: 286,
- Gcedil: 290,
- HARDcy: 1066,
- Hstrok: 294,
- Iacute: 205,
- Igrave: 204,
- Itilde: 296,
- Jsercy: 1032,
- Kcedil: 310,
- Lacute: 313,
- Lambda: 923,
- Lcaron: 317,
- Lcedil: 315,
- Lmidot: 319,
- Lstrok: 321,
- Nacute: 323,
- Ncaron: 327,
- Ncedil: 325,
- Ntilde: 209,
- Oacute: 211,
- Odblac: 336,
- Ograve: 210,
- Oslash: 216,
- Otilde: 213,
- Otimes: 10807,
- Racute: 340,
- Rarrtl: 10518,
- Rcaron: 344,
- Rcedil: 342,
- SHCHcy: 1065,
- SOFTcy: 1068,
- Sacute: 346,
- Scaron: 352,
- Scedil: 350,
- Square: 9633,
- Subset: 8912,
- Supset: 8913,
- Tcaron: 356,
- Tcedil: 354,
- Tstrok: 358,
- Uacute: 218,
- Ubreve: 364,
- Udblac: 368,
- Ugrave: 217,
- Utilde: 360,
- Vdashl: 10982,
- Verbar: 8214,
- Vvdash: 8874,
- Yacute: 221,
- Zacute: 377,
- Zcaron: 381,
- aacute: 225,
- abreve: 259,
- agrave: 224,
- andand: 10837,
- angmsd: 8737,
- angsph: 8738,
- apacir: 10863,
- approx: 8776,
- atilde: 227,
- barvee: 8893,
- barwed: 8965,
- becaus: 8757,
- bernou: 8492,
- bigcap: 8898,
- bigcup: 8899,
- bigvee: 8897,
- bkarow: 10509,
- bottom: 8869,
- bowtie: 8904,
- boxbox: 10697,
- bprime: 8245,
- brvbar: 166,
- bullet: 8226,
- bumpeq: 8783,
- cacute: 263,
- capand: 10820,
- capcap: 10827,
- capcup: 10823,
- capdot: 10816,
- ccaron: 269,
- ccedil: 231,
- circeq: 8791,
- cirmid: 10991,
- colone: 8788,
- commat: 64,
- compfn: 8728,
- conint: 8750,
- coprod: 8720,
- copysr: 8471,
- cularr: 8630,
- cupcap: 10822,
- cupcup: 10826,
- cupdot: 8845,
- curarr: 8631,
- curren: 164,
- cylcty: 9005,
- dagger: 8224,
- daleth: 8504,
- dcaron: 271,
- dfisht: 10623,
- divide: 247,
- divonx: 8903,
- dlcorn: 8990,
- dlcrop: 8973,
- dollar: 36,
- drcorn: 8991,
- drcrop: 8972,
- dstrok: 273,
- eacute: 233,
- easter: 10862,
- ecaron: 283,
- ecolon: 8789,
- egrave: 232,
- egsdot: 10904,
- elsdot: 10903,
- emptyv: 8709,
- emsp13: 8196,
- emsp14: 8197,
- eparsl: 10723,
- eqcirc: 8790,
- equals: 61,
- equest: 8799,
- female: 9792,
- ffilig: 64259,
- ffllig: 64260,
- forall: 8704,
- frac12: 189,
- frac13: 8531,
- frac14: 188,
- frac15: 8533,
- frac16: 8537,
- frac18: 8539,
- frac23: 8532,
- frac25: 8534,
- frac34: 190,
- frac35: 8535,
- frac38: 8540,
- frac45: 8536,
- frac56: 8538,
- frac58: 8541,
- frac78: 8542,
- gacute: 501,
- gammad: 989,
- gbreve: 287,
- gesdot: 10880,
- gesles: 10900,
- gtlPar: 10645,
- gtrarr: 10616,
- gtrdot: 8919,
- gtrsim: 8819,
- hairsp: 8202,
- hamilt: 8459,
- hardcy: 1098,
- hearts: 9829,
- hellip: 8230,
- hercon: 8889,
- homtht: 8763,
- horbar: 8213,
- hslash: 8463,
- hstrok: 295,
- hybull: 8259,
- hyphen: 8208,
- iacute: 237,
- igrave: 236,
- iiiint: 10764,
- iinfin: 10716,
- incare: 8453,
- inodot: 305,
- intcal: 8890,
- iquest: 191,
- isinsv: 8947,
- itilde: 297,
- jsercy: 1112,
- kappav: 1008,
- kcedil: 311,
- kgreen: 312,
- lAtail: 10523,
- lacute: 314,
- lagran: 8466,
- lambda: 955,
- langle: 10216,
- larrfs: 10525,
- larrhk: 8617,
- larrlp: 8619,
- larrpl: 10553,
- larrtl: 8610,
- latail: 10521,
- lbrace: 123,
- lbrack: 91,
- lcaron: 318,
- lcedil: 316,
- ldquor: 8222,
- lesdot: 10879,
- lesges: 10899,
- lfisht: 10620,
- lfloor: 8970,
- lharul: 10602,
- llhard: 10603,
- lmidot: 320,
- lmoust: 9136,
- loplus: 10797,
- lowast: 8727,
- lowbar: 95,
- lparlt: 10643,
- lrhard: 10605,
- lsaquo: 8249,
- lsquor: 8218,
- lstrok: 322,
- lthree: 8907,
- ltimes: 8905,
- ltlarr: 10614,
- ltrPar: 10646,
- mapsto: 8614,
- marker: 9646,
- mcomma: 10793,
- midast: 42,
- midcir: 10992,
- middot: 183,
- minusb: 8863,
- minusd: 8760,
- mnplus: 8723,
- models: 8871,
- mstpos: 8766,
- nVDash: 8879,
- nVdash: 8878,
- nacute: 324,
- ncaron: 328,
- ncedil: 326,
- nearhk: 10532,
- nequiv: 8802,
- nesear: 10536,
- nexist: 8708,
- nltrie: 8940,
- nprcue: 8928,
- nrtrie: 8941,
- nsccue: 8929,
- nsimeq: 8772,
- ntilde: 241,
- numero: 8470,
- nvDash: 8877,
- nvHarr: 10500,
- nvdash: 8876,
- nvlArr: 10498,
- nvrArr: 10499,
- nwarhk: 10531,
- nwnear: 10535,
- oacute: 243,
- odblac: 337,
- odsold: 10684,
- ograve: 242,
- ominus: 8854,
- origof: 8886,
- oslash: 248,
- otilde: 245,
- otimes: 8855,
- parsim: 10995,
- percnt: 37,
- period: 46,
- permil: 8240,
- phmmat: 8499,
- planck: 8463,
- plankv: 8463,
- plusdo: 8724,
- plusdu: 10789,
- plusmn: 177,
- preceq: 10927,
- primes: 8473,
- prnsim: 8936,
- propto: 8733,
- prurel: 8880,
- puncsp: 8200,
- qprime: 8279,
- rAtail: 10524,
- racute: 341,
- rangle: 10217,
- rarrap: 10613,
- rarrfs: 10526,
- rarrhk: 8618,
- rarrlp: 8620,
- rarrpl: 10565,
- rarrtl: 8611,
- ratail: 10522,
- rbrace: 125,
- rbrack: 93,
- rcaron: 345,
- rcedil: 343,
- rdquor: 8221,
- rfisht: 10621,
- rfloor: 8971,
- rharul: 10604,
- rmoust: 9137,
- roplus: 10798,
- rpargt: 10644,
- rsaquo: 8250,
- rsquor: 8217,
- rthree: 8908,
- rtimes: 8906,
- sacute: 347,
- scaron: 353,
- scedil: 351,
- scnsim: 8937,
- searhk: 10533,
- seswar: 10537,
- sfrown: 8994,
- shchcy: 1097,
- sigmaf: 962,
- sigmav: 962,
- simdot: 10858,
- smashp: 10803,
- softcy: 1100,
- solbar: 9023,
- spades: 9824,
- sqsube: 8849,
- sqsupe: 8850,
- square: 9633,
- squarf: 9642,
- ssetmn: 8726,
- ssmile: 8995,
- sstarf: 8902,
- subdot: 10941,
- subset: 8834,
- subsim: 10951,
- subsub: 10965,
- subsup: 10963,
- succeq: 10928,
- supdot: 10942,
- supset: 8835,
- supsim: 10952,
- supsub: 10964,
- supsup: 10966,
- swarhk: 10534,
- swnwar: 10538,
- target: 8982,
- tcaron: 357,
- tcedil: 355,
- telrec: 8981,
- there4: 8756,
- thetav: 977,
- thinsp: 8201,
- thksim: 8764,
- timesb: 8864,
- timesd: 10800,
- topbot: 9014,
- topcir: 10993,
- tprime: 8244,
- tridot: 9708,
- tstrok: 359,
- uacute: 250,
- ubreve: 365,
- udblac: 369,
- ufisht: 10622,
- ugrave: 249,
- ulcorn: 8988,
- ulcrop: 8975,
- urcorn: 8989,
- urcrop: 8974,
- utilde: 361,
- vangrt: 10652,
- varphi: 966,
- varrho: 1009,
- veebar: 8891,
- vellip: 8942,
- verbar: 124,
- wedbar: 10847,
- wedgeq: 8793,
- weierp: 8472,
- wreath: 8768,
- xoplus: 10753,
- xotime: 10754,
- xsqcup: 10758,
- xuplus: 10756,
- xwedge: 8896,
- yacute: 253,
- zacute: 378,
- zcaron: 382,
- zeetrf: 8488,
- AElig: 198,
- Acirc: 194,
- Alpha: 913,
- Amacr: 256,
- Aogon: 260,
- Aring: 197,
- Breve: 728,
- Ccirc: 264,
- Colon: 8759,
- Cross: 10799,
- Dashv: 10980,
- Delta: 916,
- Ecirc: 202,
- Emacr: 274,
- Eogon: 280,
- Equal: 10869,
- Gamma: 915,
- Gcirc: 284,
- Hacek: 711,
- Hcirc: 292,
- IJlig: 306,
- Icirc: 206,
- Imacr: 298,
- Iogon: 302,
- Iukcy: 1030,
- Jcirc: 308,
- Jukcy: 1028,
- Kappa: 922,
- OElig: 338,
- Ocirc: 212,
- Omacr: 332,
- Omega: 937,
- Prime: 8243,
- RBarr: 10512,
- Scirc: 348,
- Sigma: 931,
- THORN: 222,
- TRADE: 8482,
- TSHcy: 1035,
- Theta: 920,
- Tilde: 8764,
- Ubrcy: 1038,
- Ucirc: 219,
- Umacr: 362,
- Union: 8899,
- Uogon: 370,
- UpTee: 8869,
- Uring: 366,
- VDash: 8875,
- Vdash: 8873,
- Wcirc: 372,
- Wedge: 8896,
- Ycirc: 374,
- acirc: 226,
- acute: 180,
- aelig: 230,
- aleph: 8501,
- alpha: 945,
- amacr: 257,
- amalg: 10815,
- angle: 8736,
- angrt: 8735,
- angst: 8491,
- aogon: 261,
- aring: 229,
- asymp: 8776,
- awint: 10769,
- bcong: 8780,
- bdquo: 8222,
- bepsi: 1014,
- blank: 9251,
- blk12: 9618,
- blk14: 9617,
- blk34: 9619,
- block: 9608,
- boxDL: 9559,
- boxDR: 9556,
- boxDl: 9558,
- boxDr: 9555,
- boxHD: 9574,
- boxHU: 9577,
- boxHd: 9572,
- boxHu: 9575,
- boxUL: 9565,
- boxUR: 9562,
- boxUl: 9564,
- boxUr: 9561,
- boxVH: 9580,
- boxVL: 9571,
- boxVR: 9568,
- boxVh: 9579,
- boxVl: 9570,
- boxVr: 9567,
- boxdL: 9557,
- boxdR: 9554,
- boxdl: 9488,
- boxdr: 9484,
- boxhD: 9573,
- boxhU: 9576,
- boxhd: 9516,
- boxhu: 9524,
- boxuL: 9563,
- boxuR: 9560,
- boxul: 9496,
- boxur: 9492,
- boxvH: 9578,
- boxvL: 9569,
- boxvR: 9566,
- boxvh: 9532,
- boxvl: 9508,
- boxvr: 9500,
- breve: 728,
- bsemi: 8271,
- bsime: 8909,
- bsolb: 10693,
- bumpE: 10926,
- bumpe: 8783,
- caret: 8257,
- caron: 711,
- ccaps: 10829,
- ccirc: 265,
- ccups: 10828,
- cedil: 184,
- check: 10003,
- clubs: 9827,
- colon: 58,
- comma: 44,
- crarr: 8629,
- cross: 10007,
- csube: 10961,
- csupe: 10962,
- ctdot: 8943,
- cuepr: 8926,
- cuesc: 8927,
- cupor: 10821,
- cuvee: 8910,
- cuwed: 8911,
- cwint: 8753,
- dashv: 8867,
- dblac: 733,
- ddarr: 8650,
- delta: 948,
- dharl: 8643,
- dharr: 8642,
- diams: 9830,
- disin: 8946,
- doteq: 8784,
- dtdot: 8945,
- dtrif: 9662,
- duarr: 8693,
- duhar: 10607,
- eDDot: 10871,
- ecirc: 234,
- efDot: 8786,
- emacr: 275,
- empty: 8709,
- eogon: 281,
- eplus: 10865,
- epsiv: 949,
- eqsim: 8770,
- equiv: 8801,
- erDot: 8787,
- erarr: 10609,
- esdot: 8784,
- exist: 8707,
- fflig: 64256,
- filig: 64257,
- fllig: 64258,
- fltns: 9649,
- forkv: 10969,
- frasl: 8260,
- frown: 8994,
- gamma: 947,
- gcirc: 285,
- gescc: 10921,
- gimel: 8503,
- gneqq: 8809,
- gnsim: 8935,
- grave: 96,
- gsime: 10894,
- gsiml: 10896,
- gtcir: 10874,
- gtdot: 8919,
- harrw: 8621,
- hcirc: 293,
- hoarr: 8703,
- icirc: 238,
- iexcl: 161,
- iiint: 8749,
- iiota: 8489,
- ijlig: 307,
- imacr: 299,
- image: 8465,
- imath: 305,
- imped: 437,
- infin: 8734,
- iogon: 303,
- iprod: 10812,
- isinE: 8953,
- isins: 8948,
- isinv: 8712,
- iukcy: 1110,
- jcirc: 309,
- jmath: 567,
- jukcy: 1108,
- kappa: 954,
- lAarr: 8666,
- lBarr: 10510,
- langd: 10641,
- laquo: 171,
- larrb: 8676,
- lbarr: 10508,
- lbbrk: 10098,
- lbrke: 10635,
- lceil: 8968,
- ldquo: 8220,
- lescc: 10920,
- lhard: 8637,
- lharu: 8636,
- lhblk: 9604,
- llarr: 8647,
- lltri: 9722,
- lneqq: 8808,
- lnsim: 8934,
- loang: 10220,
- loarr: 8701,
- lobrk: 10214,
- lopar: 10629,
- lrarr: 8646,
- lrhar: 8651,
- lrtri: 8895,
- lsime: 10893,
- lsimg: 10895,
- lsquo: 8216,
- ltcir: 10873,
- ltdot: 8918,
- ltrie: 8884,
- ltrif: 9666,
- mDDot: 8762,
- mdash: 8212,
- micro: 181,
- minus: 8722,
- mumap: 8888,
- nabla: 8711,
- napos: 329,
- natur: 9838,
- ncong: 8775,
- ndash: 8211,
- neArr: 8663,
- nearr: 8599,
- ngsim: 8821,
- nhArr: 8654,
- nharr: 8622,
- nhpar: 10994,
- nlArr: 8653,
- nlarr: 8602,
- nless: 8814,
- nlsim: 8820,
- nltri: 8938,
- notin: 8713,
- notni: 8716,
- nprec: 8832,
- nrArr: 8655,
- nrarr: 8603,
- nrtri: 8939,
- nsime: 8772,
- nsmid: 8740,
- nspar: 8742,
- nsube: 8840,
- nsucc: 8833,
- nsupe: 8841,
- numsp: 8199,
- nwArr: 8662,
- nwarr: 8598,
- ocirc: 244,
- odash: 8861,
- oelig: 339,
- ofcir: 10687,
- ohbar: 10677,
- olarr: 8634,
- olcir: 10686,
- oline: 8254,
- omacr: 333,
- omega: 969,
- operp: 10681,
- oplus: 8853,
- orarr: 8635,
- order: 8500,
- ovbar: 9021,
- parsl: 11005,
- phone: 9742,
- plusb: 8862,
- pluse: 10866,
- pound: 163,
- prcue: 8828,
- prime: 8242,
- prnap: 10937,
- prsim: 8830,
- quest: 63,
- rAarr: 8667,
- rBarr: 10511,
- radic: 8730,
- rangd: 10642,
- range: 10661,
- raquo: 187,
- rarrb: 8677,
- rarrc: 10547,
- rarrw: 8605,
- ratio: 8758,
- rbarr: 10509,
- rbbrk: 10099,
- rbrke: 10636,
- rceil: 8969,
- rdquo: 8221,
- reals: 8477,
- rhard: 8641,
- rharu: 8640,
- rlarr: 8644,
- rlhar: 8652,
- rnmid: 10990,
- roang: 10221,
- roarr: 8702,
- robrk: 10215,
- ropar: 10630,
- rrarr: 8649,
- rsquo: 8217,
- rtrie: 8885,
- rtrif: 9656,
- sbquo: 8218,
- sccue: 8829,
- scirc: 349,
- scnap: 10938,
- scsim: 8831,
- sdotb: 8865,
- sdote: 10854,
- seArr: 8664,
- searr: 8600,
- setmn: 8726,
- sharp: 9839,
- sigma: 963,
- simeq: 8771,
- simgE: 10912,
- simlE: 10911,
- simne: 8774,
- slarr: 8592,
- smile: 8995,
- sqcap: 8851,
- sqcup: 8852,
- sqsub: 8847,
- sqsup: 8848,
- srarr: 8594,
- starf: 9733,
- strns: 175,
- subnE: 10955,
- subne: 8842,
- supnE: 10956,
- supne: 8843,
- swArr: 8665,
- swarr: 8601,
- szlig: 223,
- theta: 952,
- thkap: 8776,
- thorn: 254,
- tilde: 732,
- times: 215,
- trade: 8482,
- trisb: 10701,
- tshcy: 1115,
- twixt: 8812,
- ubrcy: 1118,
- ucirc: 251,
- udarr: 8645,
- udhar: 10606,
- uharl: 8639,
- uharr: 8638,
- uhblk: 9600,
- ultri: 9720,
- umacr: 363,
- uogon: 371,
- uplus: 8846,
- upsih: 978,
- uring: 367,
- urtri: 9721,
- utdot: 8944,
- utrif: 9652,
- uuarr: 8648,
- vBarv: 10985,
- vDash: 8872,
- varpi: 982,
- vdash: 8866,
- veeeq: 8794,
- vltri: 8882,
- vprop: 8733,
- vrtri: 8883,
- wcirc: 373,
- wedge: 8743,
- xcirc: 9711,
- xdtri: 9661,
- xhArr: 10234,
- xharr: 10231,
- xlArr: 10232,
- xlarr: 10229,
- xodot: 10752,
- xrArr: 10233,
- xrarr: 10230,
- xutri: 9651,
- ycirc: 375,
- Aopf: 120120,
- Ascr: 119964,
- Auml: 196,
- Barv: 10983,
- Beta: 914,
- Bopf: 120121,
- Bscr: 8492,
- CHcy: 1063,
- COPY: 169,
- Cdot: 266,
- Copf: 8450,
- Cscr: 119966,
- DJcy: 1026,
- DScy: 1029,
- DZcy: 1039,
- Darr: 8609,
- Dopf: 120123,
- Dscr: 119967,
- Edot: 278,
- Eopf: 120124,
- Escr: 8496,
- Esim: 10867,
- Euml: 203,
- Fopf: 120125,
- Fscr: 8497,
- GJcy: 1027,
- Gdot: 288,
- Gopf: 120126,
- Gscr: 119970,
- Hopf: 8461,
- Hscr: 8459,
- IEcy: 1045,
- IOcy: 1025,
- Idot: 304,
- Iopf: 120128,
- Iota: 921,
- Iscr: 8464,
- Iuml: 207,
- Jopf: 120129,
- Jscr: 119973,
- KHcy: 1061,
- KJcy: 1036,
- Kopf: 120130,
- Kscr: 119974,
- LJcy: 1033,
- Lang: 10218,
- Larr: 8606,
- Lopf: 120131,
- Lscr: 8466,
- Mopf: 120132,
- Mscr: 8499,
- NJcy: 1034,
- Nopf: 8469,
- Nscr: 119977,
- Oopf: 120134,
- Oscr: 119978,
- Ouml: 214,
- Popf: 8473,
- Pscr: 119979,
- QUOT: 34,
- Qopf: 8474,
- Qscr: 119980,
- Rang: 10219,
- Rarr: 8608,
- Ropf: 8477,
- Rscr: 8475,
- SHcy: 1064,
- Sopf: 120138,
- Sqrt: 8730,
- Sscr: 119982,
- Star: 8902,
- TScy: 1062,
- Topf: 120139,
- Tscr: 119983,
- Uarr: 8607,
- Uopf: 120140,
- Upsi: 978,
- Uscr: 119984,
- Uuml: 220,
- Vbar: 10987,
- Vert: 8214,
- Vopf: 120141,
- Vscr: 119985,
- Wopf: 120142,
- Wscr: 119986,
- Xopf: 120143,
- Xscr: 119987,
- YAcy: 1071,
- YIcy: 1031,
- YUcy: 1070,
- Yopf: 120144,
- Yscr: 119988,
- Yuml: 376,
- ZHcy: 1046,
- Zdot: 379,
- Zeta: 918,
- Zopf: 8484,
- Zscr: 119989,
- andd: 10844,
- andv: 10842,
- ange: 10660,
- aopf: 120146,
- apid: 8779,
- apos: 39,
- ascr: 119990,
- auml: 228,
- bNot: 10989,
- bbrk: 9141,
- beta: 946,
- beth: 8502,
- bnot: 8976,
- bopf: 120147,
- boxH: 9552,
- boxV: 9553,
- boxh: 9472,
- boxv: 9474,
- bscr: 119991,
- bsim: 8765,
- bsol: 92,
- bull: 8226,
- bump: 8782,
- cdot: 267,
- cent: 162,
- chcy: 1095,
- cirE: 10691,
- circ: 710,
- cire: 8791,
- comp: 8705,
- cong: 8773,
- copf: 120148,
- copy: 169,
- cscr: 119992,
- csub: 10959,
- csup: 10960,
- dArr: 8659,
- dHar: 10597,
- darr: 8595,
- dash: 8208,
- diam: 8900,
- djcy: 1106,
- dopf: 120149,
- dscr: 119993,
- dscy: 1109,
- dsol: 10742,
- dtri: 9663,
- dzcy: 1119,
- eDot: 8785,
- ecir: 8790,
- edot: 279,
- emsp: 8195,
- ensp: 8194,
- eopf: 120150,
- epar: 8917,
- epsi: 1013,
- escr: 8495,
- esim: 8770,
- euml: 235,
- euro: 8364,
- excl: 33,
- flat: 9837,
- fnof: 402,
- fopf: 120151,
- fork: 8916,
- fscr: 119995,
- gdot: 289,
- geqq: 8807,
- gjcy: 1107,
- gnap: 10890,
- gneq: 10888,
- gopf: 120152,
- gscr: 8458,
- gsim: 8819,
- gtcc: 10919,
- hArr: 8660,
- half: 189,
- harr: 8596,
- hbar: 8463,
- hopf: 120153,
- hscr: 119997,
- iecy: 1077,
- imof: 8887,
- iocy: 1105,
- iopf: 120154,
- iota: 953,
- iscr: 119998,
- isin: 8712,
- iuml: 239,
- jopf: 120155,
- jscr: 119999,
- khcy: 1093,
- kjcy: 1116,
- kopf: 120156,
- kscr: 120000,
- lArr: 8656,
- lHar: 10594,
- lang: 10216,
- larr: 8592,
- late: 10925,
- lcub: 123,
- ldca: 10550,
- ldsh: 8626,
- leqq: 8806,
- ljcy: 1113,
- lnap: 10889,
- lneq: 10887,
- lopf: 120157,
- lozf: 10731,
- lpar: 40,
- lscr: 120001,
- lsim: 8818,
- lsqb: 91,
- ltcc: 10918,
- ltri: 9667,
- macr: 175,
- male: 9794,
- malt: 10016,
- mlcp: 10971,
- mldr: 8230,
- mopf: 120158,
- mscr: 120002,
- nbsp: 160,
- ncap: 10819,
- ncup: 10818,
- ngeq: 8817,
- ngtr: 8815,
- nisd: 8954,
- njcy: 1114,
- nldr: 8229,
- nleq: 8816,
- nmid: 8740,
- nopf: 120159,
- npar: 8742,
- nscr: 120003,
- nsim: 8769,
- nsub: 8836,
- nsup: 8837,
- ntgl: 8825,
- ntlg: 8824,
- oast: 8859,
- ocir: 8858,
- odiv: 10808,
- odot: 8857,
- ogon: 731,
- oint: 8750,
- omid: 10678,
- oopf: 120160,
- opar: 10679,
- ordf: 170,
- ordm: 186,
- oror: 10838,
- oscr: 8500,
- osol: 8856,
- ouml: 246,
- para: 182,
- part: 8706,
- perp: 8869,
- phiv: 966,
- plus: 43,
- popf: 120161,
- prap: 10935,
- prec: 8826,
- prnE: 10933,
- prod: 8719,
- prop: 8733,
- pscr: 120005,
- qint: 10764,
- qopf: 120162,
- qscr: 120006,
- quot: 34,
- rArr: 8658,
- rHar: 10596,
- race: 10714,
- rang: 10217,
- rarr: 8594,
- rcub: 125,
- rdca: 10551,
- rdsh: 8627,
- real: 8476,
- rect: 9645,
- rhov: 1009,
- ring: 730,
- ropf: 120163,
- rpar: 41,
- rscr: 120007,
- rsqb: 93,
- rtri: 9657,
- scap: 10936,
- scnE: 10934,
- sdot: 8901,
- sect: 167,
- semi: 59,
- sext: 10038,
- shcy: 1096,
- sime: 8771,
- simg: 10910,
- siml: 10909,
- smid: 8739,
- smte: 10924,
- solb: 10692,
- sopf: 120164,
- spar: 8741,
- squf: 9642,
- sscr: 120008,
- star: 9734,
- subE: 10949,
- sube: 8838,
- succ: 8827,
- sung: 9834,
- sup1: 185,
- sup2: 178,
- sup3: 179,
- supE: 10950,
- supe: 8839,
- tbrk: 9140,
- tdot: 8411,
- tint: 8749,
- toea: 10536,
- topf: 120165,
- tosa: 10537,
- trie: 8796,
- tscr: 120009,
- tscy: 1094,
- uArr: 8657,
- uHar: 10595,
- uarr: 8593,
- uopf: 120166,
- upsi: 965,
- uscr: 120010,
- utri: 9653,
- uuml: 252,
- vArr: 8661,
- vBar: 10984,
- varr: 8597,
- vert: 124,
- vopf: 120167,
- vscr: 120011,
- wopf: 120168,
- wscr: 120012,
- xcap: 8898,
- xcup: 8899,
- xmap: 10236,
- xnis: 8955,
- xopf: 120169,
- xscr: 120013,
- xvee: 8897,
- yacy: 1103,
- yicy: 1111,
- yopf: 120170,
- yscr: 120014,
- yucy: 1102,
- yuml: 255,
- zdot: 380,
- zeta: 950,
- zhcy: 1078,
- zopf: 120171,
- zscr: 120015,
- zwnj: 8204,
- AMP: 38,
- Acy: 1040,
- Afr: 120068,
- And: 10835,
- Bcy: 1041,
- Bfr: 120069,
- Cap: 8914,
- Cfr: 8493,
- Chi: 935,
- Cup: 8915,
- Dcy: 1044,
- Del: 8711,
- Dfr: 120071,
- Dot: 168,
- ENG: 330,
- ETH: 208,
- Ecy: 1069,
- Efr: 120072,
- Eta: 919,
- Fcy: 1060,
- Ffr: 120073,
- Gcy: 1043,
- Gfr: 120074,
- Hat: 94,
- Hfr: 8460,
- Icy: 1048,
- Ifr: 8465,
- Int: 8748,
- Jcy: 1049,
- Jfr: 120077,
- Kcy: 1050,
- Kfr: 120078,
- Lcy: 1051,
- Lfr: 120079,
- Lsh: 8624,
- Map: 10501,
- Mcy: 1052,
- Mfr: 120080,
- Ncy: 1053,
- Nfr: 120081,
- Not: 10988,
- Ocy: 1054,
- Ofr: 120082,
- Pcy: 1055,
- Pfr: 120083,
- Phi: 934,
- Psi: 936,
- Qfr: 120084,
- REG: 174,
- Rcy: 1056,
- Rfr: 8476,
- Rho: 929,
- Rsh: 8625,
- Scy: 1057,
- Sfr: 120086,
- Sub: 8912,
- Sum: 8721,
- Sup: 8913,
- Tab: 9,
- Tau: 932,
- Tcy: 1058,
- Tfr: 120087,
- Ucy: 1059,
- Ufr: 120088,
- Vcy: 1042,
- Vee: 8897,
- Vfr: 120089,
- Wfr: 120090,
- Xfr: 120091,
- Ycy: 1067,
- Yfr: 120092,
- Zcy: 1047,
- Zfr: 8488,
- acd: 8767,
- acy: 1072,
- afr: 120094,
- amp: 38,
- and: 8743,
- ang: 8736,
- apE: 10864,
- ape: 8778,
- ast: 42,
- bcy: 1073,
- bfr: 120095,
- bot: 8869,
- cap: 8745,
- cfr: 120096,
- chi: 967,
- cir: 9675,
- cup: 8746,
- dcy: 1076,
- deg: 176,
- dfr: 120097,
- die: 168,
- div: 247,
- dot: 729,
- ecy: 1101,
- efr: 120098,
- egs: 10902,
- ell: 8467,
- els: 10901,
- eng: 331,
- eta: 951,
- eth: 240,
- fcy: 1092,
- ffr: 120099,
- gEl: 10892,
- gap: 10886,
- gcy: 1075,
- gel: 8923,
- geq: 8805,
- ges: 10878,
- gfr: 120100,
- ggg: 8921,
- glE: 10898,
- gla: 10917,
- glj: 10916,
- gnE: 8809,
- gne: 10888,
- hfr: 120101,
- icy: 1080,
- iff: 8660,
- ifr: 120102,
- int: 8747,
- jcy: 1081,
- jfr: 120103,
- kcy: 1082,
- kfr: 120104,
- lEg: 10891,
- lap: 10885,
- lat: 10923,
- lcy: 1083,
- leg: 8922,
- leq: 8804,
- les: 10877,
- lfr: 120105,
- lgE: 10897,
- lnE: 8808,
- lne: 10887,
- loz: 9674,
- lrm: 8206,
- lsh: 8624,
- map: 8614,
- mcy: 1084,
- mfr: 120106,
- mho: 8487,
- mid: 8739,
- nap: 8777,
- ncy: 1085,
- nfr: 120107,
- nge: 8817,
- ngt: 8815,
- nis: 8956,
- niv: 8715,
- nle: 8816,
- nlt: 8814,
- not: 172,
- npr: 8832,
- nsc: 8833,
- num: 35,
- ocy: 1086,
- ofr: 120108,
- ogt: 10689,
- ohm: 8486,
- olt: 10688,
- ord: 10845,
- orv: 10843,
- par: 8741,
- pcy: 1087,
- pfr: 120109,
- phi: 966,
- piv: 982,
- prE: 10931,
- pre: 10927,
- psi: 968,
- qfr: 120110,
- rcy: 1088,
- reg: 174,
- rfr: 120111,
- rho: 961,
- rlm: 8207,
- rsh: 8625,
- scE: 10932,
- sce: 10928,
- scy: 1089,
- sfr: 120112,
- shy: 173,
- sim: 8764,
- smt: 10922,
- sol: 47,
- squ: 9633,
- sub: 8834,
- sum: 8721,
- sup: 8835,
- tau: 964,
- tcy: 1090,
- tfr: 120113,
- top: 8868,
- ucy: 1091,
- ufr: 120114,
- uml: 168,
- vcy: 1074,
- vee: 8744,
- vfr: 120115,
- wfr: 120116,
- xfr: 120117,
- ycy: 1099,
- yen: 165,
- yfr: 120118,
- zcy: 1079,
- zfr: 120119,
- zwj: 8205,
- DD: 8517,
- GT: 62,
- Gg: 8921,
- Gt: 8811,
- Im: 8465,
- LT: 60,
- Ll: 8920,
- Lt: 8810,
- Mu: 924,
- Nu: 925,
- Or: 10836,
- Pi: 928,
- Pr: 10939,
- Re: 8476,
- Sc: 10940,
- Xi: 926,
- ac: 8766,
- af: 8289,
- ap: 8776,
- dd: 8518,
- ee: 8519,
- eg: 10906,
- el: 10905,
- gE: 8807,
- ge: 8805,
- gg: 8811,
- gl: 8823,
- gt: 62,
- ic: 8291,
- ii: 8520,
- in: 8712,
- it: 8290,
- lE: 8806,
- le: 8804,
- lg: 8822,
- ll: 8810,
- lt: 60,
- mp: 8723,
- mu: 956,
- ne: 8800,
- ni: 8715,
- nu: 957,
- oS: 9416,
- or: 8744,
- pi: 960,
- pm: 177,
- pr: 8826,
- rx: 8478,
- sc: 8827,
- wp: 8472,
- wr: 8768,
- xi: 958,
-};
diff --git a/packages/astro-parser/src/parse/utils/features.ts b/packages/astro-parser/src/parse/utils/features.ts
deleted file mode 100644
index c64c75c71..000000000
--- a/packages/astro-parser/src/parse/utils/features.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const FEATURE_CUSTOM_ELEMENT = 1 << 0;
diff --git a/packages/astro-parser/src/parse/utils/html.ts b/packages/astro-parser/src/parse/utils/html.ts
deleted file mode 100644
index 7b9e35bc6..000000000
--- a/packages/astro-parser/src/parse/utils/html.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-// @ts-nocheck
-
-import entities from './entities.js';
-
-const windows_1252 = [
- 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, 382, 376,
-];
-
-const entity_pattern = new RegExp(`&(#?(?:x[\\w\\d]+|\\d+|${Object.keys(entities).join('|')}))(?:;|\\b)`, 'g');
-
-export function decode_character_references(html: string) {
- return html.replace(entity_pattern, (match, entity) => {
- let code;
-
- // Handle named entities
- if (entity[0] !== '#') {
- code = entities[entity];
- } else if (entity[1] === 'x') {
- code = parseInt(entity.substring(2), 16);
- } else {
- code = parseInt(entity.substring(1), 10);
- }
-
- if (!code) {
- return match;
- }
-
- return String.fromCodePoint(validate_code(code));
- });
-}
-
-const NUL = 0;
-
-// some code points are verboten. If we were inserting HTML, the browser would replace the illegal
-// code points with alternatives in some cases - since we're bypassing that mechanism, we need
-// to replace them ourselves
-//
-// Source: http://en.wikipedia.org/wiki/Character_encodings_in_HTML#Illegal_characters
-function validate_code(code: number) {
- // line feed becomes generic whitespace
- if (code === 10) {
- return 32;
- }
-
- // ASCII range. (Why someone would use HTML entities for ASCII characters I don't know, but...)
- if (code < 128) {
- return code;
- }
-
- // code points 128-159 are dealt with leniently by browsers, but they're incorrect. We need
- // to correct the mistake or we'll end up with missing € signs and so on
- if (code <= 159) {
- return windows_1252[code - 128];
- }
-
- // basic multilingual plane
- if (code < 55296) {
- return code;
- }
-
- // UTF-16 surrogate halves
- if (code <= 57343) {
- return NUL;
- }
-
- // rest of the basic multilingual plane
- if (code <= 65535) {
- return code;
- }
-
- // supplementary multilingual plane 0x10000 - 0x1ffff
- if (code >= 65536 && code <= 131071) {
- return code;
- }
-
- // supplementary ideographic plane 0x20000 - 0x2ffff
- if (code >= 131072 && code <= 196607) {
- return code;
- }
-
- return NUL;
-}
-
-// based on http://developers.whatwg.org/syntax.html#syntax-tag-omission
-const disallowed_contents = new Map([
- ['li', new Set(['li'])],
- ['dt', new Set(['dt', 'dd'])],
- ['dd', new Set(['dt', 'dd'])],
- ['p', new Set('address article aside blockquote div dl fieldset footer form h1 h2 h3 h4 h5 h6 header hgroup hr main menu nav ol p pre section table ul'.split(' '))],
- ['rt', new Set(['rt', 'rp'])],
- ['rp', new Set(['rt', 'rp'])],
- ['optgroup', new Set(['optgroup'])],
- ['option', new Set(['option', 'optgroup'])],
- ['thead', new Set(['tbody', 'tfoot'])],
- ['tbody', new Set(['tbody', 'tfoot'])],
- ['tfoot', new Set(['tbody'])],
- ['tr', new Set(['tr', 'tbody'])],
- ['td', new Set(['td', 'th', 'tr'])],
- ['th', new Set(['td', 'th', 'tr'])],
-]);
-
-// can this be a child of the parent element, or does it implicitly
-// close it, like `<li>one<li>two`?
-export function closing_tag_omitted(current: string, next?: string) {
- if (disallowed_contents.has(current)) {
- if (!next || disallowed_contents.get(current).has(next)) {
- return true;
- }
- }
-
- return false;
-}
diff --git a/packages/astro-parser/src/parse/utils/node.ts b/packages/astro-parser/src/parse/utils/node.ts
deleted file mode 100644
index 27891d6f3..000000000
--- a/packages/astro-parser/src/parse/utils/node.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { TemplateNode } from '../../interfaces.js';
-
-export function to_string(node: TemplateNode) {
- switch (node.type) {
- case 'IfBlock':
- return '{#if} block';
- case 'ThenBlock':
- return '{:then} block';
- case 'ElseBlock':
- return '{:else} block';
- case 'PendingBlock':
- case 'AwaitBlock':
- return '{#await} block';
- case 'CatchBlock':
- return '{:catch} block';
- case 'EachBlock':
- return '{#each} block';
- case 'RawMustacheTag':
- return '{@html} block';
- case 'DebugTag':
- return '{@debug} block';
- case 'Element':
- case 'InlineComponent':
- case 'Slot':
- case 'Title':
- return `<${node.name}> tag`;
- default:
- return node.type;
- }
-}
diff --git a/packages/astro-parser/src/utils/error.ts b/packages/astro-parser/src/utils/error.ts
deleted file mode 100644
index bb71db1c7..000000000
--- a/packages/astro-parser/src/utils/error.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-// @ts-nocheck
-
-import { locate } from 'locate-character';
-import get_code_frame from './get_code_frame.js';
-
-export class CompileError extends Error {
- code: string;
- end: { line: number; column: number };
- filename: string;
- frame: string;
- start: { line: number; column: number };
-
- constructor({ code, filename, start, end, message }: { code: string; filename: string; start: number; message: string; end?: number }) {
- super(message);
-
- this.start = locate(code, start, { offsetLine: 1 });
- this.end = locate(code, end || start, { offsetLine: 1 });
- this.filename = filename;
- this.message = message;
- this.frame = get_code_frame(code, this.start.line - 1, this.start.column);
- }
-
- toString() {
- return `${this.filename}:${this.start.line}:${this.start.column}\n\t${this.message}\n${this.frame}`;
- }
-}
-
-/** Throw CompileError */
-export default function error(
- code: string,
- message: string,
- props: {
- name: string;
- source: string;
- filename: string;
- start: number;
- end?: number;
- }
-): never {
- const err = new CompileError({ code, message, start: props.start, end: props.end, filename: props.filename });
- err.name = props.name;
-
- throw err;
-}
diff --git a/packages/astro-parser/src/utils/full_char_code_at.ts b/packages/astro-parser/src/utils/full_char_code_at.ts
deleted file mode 100644
index 701070201..000000000
--- a/packages/astro-parser/src/utils/full_char_code_at.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-// Adapted from https://github.com/acornjs/acorn/blob/6584815dca7440e00de841d1dad152302fdd7ca5/src/tokenize.js
-// Reproduced under MIT License https://github.com/acornjs/acorn/blob/master/LICENSE
-
-/** @url https://github.com/acornjs/acorn/blob/6584815dca7440e00de841d1dad152302fdd7ca5/src/tokenize.js */
-export default function full_char_code_at(str: string, i: number): number {
- const code = str.charCodeAt(i);
- if (code <= 0xd7ff || code >= 0xe000) return code;
-
- const next = str.charCodeAt(i + 1);
- return (code << 10) + next - 0x35fdc00;
-}
diff --git a/packages/astro-parser/src/utils/fuzzymatch.ts b/packages/astro-parser/src/utils/fuzzymatch.ts
deleted file mode 100644
index 278c57014..000000000
--- a/packages/astro-parser/src/utils/fuzzymatch.ts
+++ /dev/null
@@ -1,233 +0,0 @@
-// @ts-nocheck
-
-/** Utility for accessing FuzzySet */
-export default function fuzzymatch(name: string, names: string[]) {
- const set = new FuzzySet(names);
- const matches = set.get(name);
-
- return matches && matches[0] && matches[0][0] > 0.7 ? matches[0][1] : null;
-}
-
-// adapted from https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js
-// BSD Licensed
-
-const GRAM_SIZE_LOWER = 2;
-const GRAM_SIZE_UPPER = 3;
-
-/** Return an edit distance from 0 to 1 */
-function _distance(str1: string, str2: string) {
- if (str1 === null && str2 === null) {
- throw 'Trying to compare two null values';
- }
- if (str1 === null || str2 === null) return 0;
- str1 = String(str1);
- str2 = String(str2);
-
- const distance = levenshtein(str1, str2);
- if (str1.length > str2.length) {
- return 1 - distance / str1.length;
- } else {
- return 1 - distance / str2.length;
- }
-}
-
-/** @url https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js#L18 */
-function levenshtein(str1: string, str2: string) {
- const current: number[] = [];
- let prev;
- let value;
-
- for (let i = 0; i <= str2.length; i++) {
- for (let j = 0; j <= str1.length; j++) {
- if (i && j) {
- if (str1.charAt(j - 1) === str2.charAt(i - 1)) {
- value = prev;
- } else {
- value = Math.min(current[j], current[j - 1], prev) + 1;
- }
- } else {
- value = i + j;
- }
-
- prev = current[j];
- current[j] = value;
- }
- }
-
- return current.pop();
-}
-
-const non_word_regex = /[^\w, ]+/;
-
-/** @url https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js#L53 */
-function iterate_grams(value: string, gram_size = 2) {
- const simplified = '-' + value.toLowerCase().replace(non_word_regex, '') + '-';
- const len_diff = gram_size - simplified.length;
- const results = [];
-
- if (len_diff > 0) {
- for (let i = 0; i < len_diff; ++i) {
- value += '-';
- }
- }
- for (let i = 0; i < simplified.length - gram_size + 1; ++i) {
- results.push(simplified.slice(i, i + gram_size));
- }
- return results;
-}
-
-/** @url https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js#L69 */
-function gram_counter(value: string, gram_size = 2) {
- // return an object where key=gram, value=number of occurrences
- const result = {};
- const grams = iterate_grams(value, gram_size);
- let i = 0;
-
- for (i; i < grams.length; ++i) {
- if (grams[i] in result) {
- result[grams[i]] += 1;
- } else {
- result[grams[i]] = 1;
- }
- }
- return result;
-}
-
-/** @url https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js#L158 */
-function sort_descending(a, b) {
- return b[0] - a[0];
-}
-
-class FuzzySet {
- exact_set = {};
- match_dict = {};
- items = {};
-
- constructor(arr: string[]) {
- // initialization
- for (let i = GRAM_SIZE_LOWER; i < GRAM_SIZE_UPPER + 1; ++i) {
- this.items[i] = [];
- }
-
- // add all the items to the set
- for (let i = 0; i < arr.length; ++i) {
- this.add(arr[i]);
- }
- }
-
- add(value: string) {
- const normalized_value = value.toLowerCase();
- if (normalized_value in this.exact_set) {
- return false;
- }
-
- let i = GRAM_SIZE_LOWER;
- for (i; i < GRAM_SIZE_UPPER + 1; ++i) {
- this._add(value, i);
- }
- }
-
- _add(value: string, gram_size: number) {
- const normalized_value = value.toLowerCase();
- const items = this.items[gram_size] || [];
- const index = items.length;
-
- items.push(0);
- const gram_counts = gram_counter(normalized_value, gram_size);
- let sum_of_square_gram_counts = 0;
- let gram;
- let gram_count;
-
- for (gram in gram_counts) {
- gram_count = gram_counts[gram];
- sum_of_square_gram_counts += Math.pow(gram_count, 2);
- if (gram in this.match_dict) {
- this.match_dict[gram].push([index, gram_count]);
- } else {
- this.match_dict[gram] = [[index, gram_count]];
- }
- }
- const vector_normal = Math.sqrt(sum_of_square_gram_counts);
- items[index] = [vector_normal, normalized_value];
- this.items[gram_size] = items;
- this.exact_set[normalized_value] = value;
- }
-
- get(value: string) {
- const normalized_value = value.toLowerCase();
- const result = this.exact_set[normalized_value];
-
- if (result) {
- return [[1, result]];
- }
-
- let results = [];
- // start with high gram size and if there are no results, go to lower gram sizes
- for (let gram_size = GRAM_SIZE_UPPER; gram_size >= GRAM_SIZE_LOWER; --gram_size) {
- results = this.__get(value, gram_size);
- if (results) {
- return results;
- }
- }
- return null;
- }
-
- __get(value: string, gram_size: number) {
- const normalized_value = value.toLowerCase();
- const matches = {};
- const gram_counts = gram_counter(normalized_value, gram_size);
- const items = this.items[gram_size];
- let sum_of_square_gram_counts = 0;
- let gram;
- let gram_count;
- let i;
- let index;
- let other_gram_count;
-
- for (gram in gram_counts) {
- gram_count = gram_counts[gram];
- sum_of_square_gram_counts += Math.pow(gram_count, 2);
- if (gram in this.match_dict) {
- for (i = 0; i < this.match_dict[gram].length; ++i) {
- index = this.match_dict[gram][i][0];
- other_gram_count = this.match_dict[gram][i][1];
- if (index in matches) {
- matches[index] += gram_count * other_gram_count;
- } else {
- matches[index] = gram_count * other_gram_count;
- }
- }
- }
- }
-
- const vector_normal = Math.sqrt(sum_of_square_gram_counts);
- let results = [];
- let match_score;
-
- // build a results list of [score, str]
- for (const match_index in matches) {
- match_score = matches[match_index];
- results.push([match_score / (vector_normal * items[match_index][0]), items[match_index][1]]);
- }
-
- results.sort(sort_descending);
-
- let new_results = [];
- const end_index = Math.min(50, results.length);
- // truncate somewhat arbitrarily to 50
- for (let j = 0; j < end_index; ++j) {
- new_results.push([_distance(results[j][1], normalized_value), results[j][1]]);
- }
- results = new_results;
- results.sort(sort_descending);
-
- new_results = [];
- for (let j = 0; j < results.length; ++j) {
- if (results[j][0] == results[0][0]) {
- new_results.push([results[j][0], this.exact_set[results[j][1]]]);
- }
- }
-
- return new_results;
- }
-}
diff --git a/packages/astro-parser/src/utils/get_code_frame.ts b/packages/astro-parser/src/utils/get_code_frame.ts
deleted file mode 100644
index 098d5ad77..000000000
--- a/packages/astro-parser/src/utils/get_code_frame.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/** Die you stupid tabs */
-function tabs_to_spaces(str: string) {
- return str.replace(/^\t+/, (match) => match.split('\t').join(' '));
-}
-
-/** Display syntax error in pretty format in logs */
-export default function get_code_frame(source: string, line: number, column: number) {
- const lines = source.split('\n');
-
- const frame_start = Math.max(0, line - 2);
- const frame_end = Math.min(line + 3, lines.length);
-
- const digits = String(frame_end + 1).length;
-
- return lines
- .slice(frame_start, frame_end)
- .map((str, i) => {
- const isErrorLine = frame_start + i === line;
- const line_num = String(i + frame_start + 1).padStart(digits, ' ');
-
- if (isErrorLine) {
- const indicator = ' '.repeat(digits + 2 + tabs_to_spaces(str.slice(0, column)).length) + '^';
- return `${line_num}: ${tabs_to_spaces(str)}\n${indicator}`;
- }
-
- return `${line_num}: ${tabs_to_spaces(str)}`;
- })
- .join('\n');
-}
diff --git a/packages/astro-parser/src/utils/link.ts b/packages/astro-parser/src/utils/link.ts
deleted file mode 100644
index 855152514..000000000
--- a/packages/astro-parser/src/utils/link.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-/** Linked list */
-export function link<T extends { next?: T; prev?: T }>(next: T, prev: T) {
- prev.next = next;
- if (next) next.prev = prev;
-}
diff --git a/packages/astro-parser/src/utils/list.ts b/packages/astro-parser/src/utils/list.ts
deleted file mode 100644
index 671311a23..000000000
--- a/packages/astro-parser/src/utils/list.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-/** Display an array of strings in a human-readable format */
-export default function list(items: string[], conjunction = 'or') {
- if (items.length === 1) return items[0];
- return `${items.slice(0, -1).join(', ')} ${conjunction} ${items[items.length - 1]}`;
-}
diff --git a/packages/astro-parser/src/utils/names.ts b/packages/astro-parser/src/utils/names.ts
deleted file mode 100644
index 38e1ec2e8..000000000
--- a/packages/astro-parser/src/utils/names.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import { isIdentifierStart, isIdentifierChar } from 'acorn';
-import full_char_code_at from './full_char_code_at.js';
-
-export const globals = new Set([
- 'alert',
- 'Array',
- 'Boolean',
- 'clearInterval',
- 'clearTimeout',
- 'confirm',
- 'console',
- 'Date',
- 'decodeURI',
- 'decodeURIComponent',
- 'document',
- 'Element',
- 'encodeURI',
- 'encodeURIComponent',
- 'Error',
- 'EvalError',
- 'Event',
- 'EventSource',
- 'fetch',
- 'global',
- 'globalThis',
- 'history',
- 'Infinity',
- 'InternalError',
- 'Intl',
- 'isFinite',
- 'isNaN',
- 'JSON',
- 'localStorage',
- 'location',
- 'Map',
- 'Math',
- 'NaN',
- 'navigator',
- 'Number',
- 'Node',
- 'Object',
- 'parseFloat',
- 'parseInt',
- 'process',
- 'Promise',
- 'prompt',
- 'RangeError',
- 'ReferenceError',
- 'RegExp',
- 'sessionStorage',
- 'Set',
- 'setInterval',
- 'setTimeout',
- 'String',
- 'SyntaxError',
- 'TypeError',
- 'undefined',
- 'URIError',
- 'URL',
- 'window',
-]);
-
-export const reserved = new Set([
- 'arguments',
- 'await',
- 'break',
- 'case',
- 'catch',
- 'class',
- 'const',
- 'continue',
- 'debugger',
- 'default',
- 'delete',
- 'do',
- 'else',
- 'enum',
- 'eval',
- 'export',
- 'extends',
- 'false',
- 'finally',
- 'for',
- 'function',
- 'if',
- 'implements',
- 'import',
- 'in',
- 'instanceof',
- 'interface',
- 'let',
- 'new',
- 'null',
- 'package',
- 'private',
- 'protected',
- 'public',
- 'return',
- 'static',
- 'super',
- 'switch',
- 'this',
- 'throw',
- 'true',
- 'try',
- 'typeof',
- 'var',
- 'void',
- 'while',
- 'with',
- 'yield',
-]);
-
-const void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;
-
-/** Is this a void HTML element? */
-export function is_void(name: string) {
- return void_element_names.test(name) || name.toLowerCase() === '!doctype';
-}
-
-/** Is this a valid HTML element? */
-export function is_valid(str: string): boolean {
- let i = 0;
-
- while (i < str.length) {
- const code = full_char_code_at(str, i);
- if (!(i === 0 ? isIdentifierStart : isIdentifierChar)(code, true)) return false;
-
- i += code <= 0xffff ? 1 : 2;
- }
-
- return true;
-}
-
-/** Utility to normalize HTML */
-export function sanitize(name: string) {
- return name
- .replace(/[^a-zA-Z0-9_]+/g, '_')
- .replace(/^_/, '')
- .replace(/_$/, '')
- .replace(/^[0-9]/, '_$&');
-}
diff --git a/packages/astro-parser/src/utils/namespaces.ts b/packages/astro-parser/src/utils/namespaces.ts
deleted file mode 100644
index 5f61beff9..000000000
--- a/packages/astro-parser/src/utils/namespaces.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// The `foreign` namespace covers all DOM implementations that aren't HTML5.
-// It opts out of HTML5-specific a11y checks and case-insensitive attribute names.
-export const foreign = 'https://svelte.dev/docs#svelte_options';
-export const html = 'http://www.w3.org/1999/xhtml';
-export const mathml = 'http://www.w3.org/1998/Math/MathML';
-export const svg = 'http://www.w3.org/2000/svg';
-export const xlink = 'http://www.w3.org/1999/xlink';
-export const xml = 'http://www.w3.org/XML/1998/namespace';
-export const xmlns = 'http://www.w3.org/2000/xmlns';
-
-export const valid_namespaces = ['foreign', 'html', 'mathml', 'svg', 'xlink', 'xml', 'xmlns', foreign, html, mathml, svg, xlink, xml, xmlns];
-
-export const namespaces: Record<string, string> = { foreign, html, mathml, svg, xlink, xml, xmlns };
diff --git a/packages/astro-parser/src/utils/nodes_match.ts b/packages/astro-parser/src/utils/nodes_match.ts
deleted file mode 100644
index 941025f52..000000000
--- a/packages/astro-parser/src/utils/nodes_match.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-// @ts-nocheck
-
-/** Compare two TemplateNodes to determine if they are equivalent */
-export function nodes_match(a, b) {
- if (!!a !== !!b) return false;
- if (Array.isArray(a) !== Array.isArray(b)) return false;
-
- if (a && typeof a === 'object') {
- if (Array.isArray(a)) {
- if (a.length !== b.length) return false;
- return a.every((child, i) => nodes_match(child, b[i]));
- }
-
- const a_keys = Object.keys(a).sort();
- const b_keys = Object.keys(b).sort();
-
- if (a_keys.length !== b_keys.length) return false;
-
- let i = a_keys.length;
- while (i--) {
- const key = a_keys[i];
- if (b_keys[i] !== key) return false;
-
- if (key === 'start' || key === 'end') continue;
-
- if (!nodes_match(a[key], b[key])) {
- return false;
- }
- }
-
- return true;
- }
-
- return a === b;
-}
diff --git a/packages/astro-parser/src/utils/patterns.ts b/packages/astro-parser/src/utils/patterns.ts
deleted file mode 100644
index 317a7c199..000000000
--- a/packages/astro-parser/src/utils/patterns.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const whitespace = /[ \t\r\n]/;
-
-export const dimensions = /^(?:offset|client)(?:Width|Height)$/;
diff --git a/packages/astro-parser/tsconfig.json b/packages/astro-parser/tsconfig.json
deleted file mode 100644
index 7456703e4..000000000
--- a/packages/astro-parser/tsconfig.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "include": ["src"],
- "compilerOptions": {
- "target": "ES2020",
- "module": "CommonJS",
- "outDir": "./dist"
- }
-}
diff --git a/packages/astro/package.json b/packages/astro/package.json
index ad0c8a0ac..3664d9035 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -112,7 +112,6 @@
"zod": "^3.14.2"
},
"devDependencies": {
- "@astrojs/parser": "^0.22.2",
"@babel/types": "^7.17.0",
"@types/babel__core": "^7.1.19",
"@types/babel__traverse": "^7.14.2",
diff --git a/packages/astro/src/core/logger.ts b/packages/astro/src/core/logger.ts
index 44b06834b..19f07316a 100644
--- a/packages/astro/src/core/logger.ts
+++ b/packages/astro/src/core/logger.ts
@@ -1,6 +1,4 @@
-import type { CompileError } from '@astrojs/parser';
-
-import { bold, cyan, dim, red, grey, underline, yellow, reset } from 'kleur/colors';
+import { bold, cyan, dim, red, yellow, reset } from 'kleur/colors';
import { performance } from 'perf_hooks';
import { Writable } from 'stream';
import stringWidth from 'string-width';
@@ -182,31 +180,6 @@ export function table(opts: LogOptions, columns: number[]) {
};
}
-/** Pretty format error for display */
-export function parseError(opts: LogOptions, err: CompileError) {
- if (!err.frame) {
- return error(opts, 'parse-error', err.message || err);
- }
-
- let frame = err.frame
- // Switch colons for pipes
- .replace(/^([0-9]+)(:)/gm, `${bold('$1')} │`)
- // Make the caret red.
- .replace(/(?<=^\s+)(\^)/gm, bold(red(' ^')))
- // Add identation
- .replace(/^/gm, ' ');
-
- error(
- opts,
- 'parse-error',
- `
- ${underline(bold(grey(`${err.filename || ''}:${err.start.line}:${err.start.column}`)))}
- ${bold(red(`𝘅 ${err.message}`))}
-${frame}
-`
- );
-}
-
// A default logger for when too lazy to pass LogOptions around.
export const logger = {
info: info.bind(null, defaultLogOptions),
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 162f10fd5..92e7b34c6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -443,7 +443,6 @@ importers:
'@astrojs/compiler': ^0.13.0
'@astrojs/language-server': ^0.8.10
'@astrojs/markdown-remark': ^0.7.0-next.0
- '@astrojs/parser': ^0.22.2
'@astrojs/prism': 0.4.0
'@astrojs/webapi': ^0.11.0
'@babel/core': ^7.17.8
@@ -563,7 +562,6 @@ importers:
yargs-parser: 21.0.1
zod: 3.14.2
devDependencies:
- '@astrojs/parser': link:../astro-parser
'@babel/types': 7.17.0
'@types/babel__core': 7.1.19
'@types/babel__traverse': 7.14.2
@@ -587,21 +585,6 @@ importers:
mocha: 9.2.2
sass: 1.49.9
- packages/astro-parser:
- specifiers:
- '@types/node': ^14.18.12
- acorn: ^8.7.0
- astro-scripts: workspace:*
- locate-character: ^2.0.5
- magic-string: ^0.25.9
- dependencies:
- '@types/node': 14.18.12
- acorn: 8.7.0
- locate-character: 2.0.5
- magic-string: 0.25.9
- devDependencies:
- astro-scripts: link:../../scripts
-
packages/astro-prism:
specifiers:
prismjs: ^1.27.0
@@ -3893,6 +3876,7 @@ packages:
/@types/node/14.18.12:
resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==}
+ dev: true
/@types/node/16.11.26:
resolution: {integrity: sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==}
@@ -4374,6 +4358,7 @@ packages:
resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==}
engines: {node: '>=0.4.0'}
hasBin: true
+ dev: true
/adm-zip/0.5.9:
resolution: {integrity: sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==}
@@ -7235,10 +7220,6 @@ packages:
engines: {node: '>=14'}
dev: true
- /locate-character/2.0.5:
- resolution: {integrity: sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg==}
- dev: false
-
/locate-path/5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}