summaryrefslogtreecommitdiff
path: root/src/parser/utils
diff options
context:
space:
mode:
authorGravatar Nate Moore <natemoo-re@users.noreply.github.com> 2021-04-30 16:33:35 -0500
committerGravatar GitHub <noreply@github.com> 2021-04-30 16:33:35 -0500
commit4df1347156cf2632ea2f3475d3a5f8f08d197cc3 (patch)
tree9d50de89dfe62827c32a8a4046120af4ab61dc0c /src/parser/utils
parent1d498facc8f78a3ffbfecd05cc6ecd45e8a4a1ae (diff)
downloadastro-4df1347156cf2632ea2f3475d3a5f8f08d197cc3.tar.gz
astro-4df1347156cf2632ea2f3475d3a5f8f08d197cc3.tar.zst
astro-4df1347156cf2632ea2f3475d3a5f8f08d197cc3.zip
Migrate to `yarn` monorepo (#157)
* chore: use monorepo * chore: scaffold astro-scripts * chore: move tests inside packages/astro * chore: refactor tests, add scripts * chore: move parser to own module * chore: move runtime to packages/astro * fix: move parser to own package * test: fix prettier-plugin-astro tests * fix: tests * chore: update package-lock * chore: add changesets * fix: cleanup examples * fix: starter example * chore: update changeset config * chore: update changeset config * chore: setup changeset release workflow * chore: bump lockfiles * chore: prism => astro-prism * fix: tsc --emitDeclarationOnly * chore: final cleanup, switch to yarn * chore: add lerna * chore: update workflows to yarn * chore: update workflows * chore: remove lint workflow * chore: add astro-dev script * chore: add symlinked README
Diffstat (limited to 'src/parser/utils')
-rw-r--r--src/parser/utils/error.ts46
-rw-r--r--src/parser/utils/full_char_code_at.ts11
-rw-r--r--src/parser/utils/fuzzymatch.ts233
-rw-r--r--src/parser/utils/get_code_frame.ts29
-rw-r--r--src/parser/utils/link.ts5
-rw-r--r--src/parser/utils/list.ts5
-rw-r--r--src/parser/utils/names.ts142
-rw-r--r--src/parser/utils/namespaces.ts13
-rw-r--r--src/parser/utils/nodes_match.ts35
-rw-r--r--src/parser/utils/patterns.ts3
-rw-r--r--src/parser/utils/trim.ts17
11 files changed, 0 insertions, 539 deletions
diff --git a/src/parser/utils/error.ts b/src/parser/utils/error.ts
deleted file mode 100644
index 8ebb5b093..000000000
--- a/src/parser/utils/error.ts
+++ /dev/null
@@ -1,46 +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;
- start: { line: number; column: number };
- end: { line: number; column: number };
- pos: number;
- filename: string;
- frame: string;
-
- toString() {
- return `${this.message} (${this.start.line}:${this.start.column})\n${this.frame}`;
- }
-}
-
-/** Throw CompileError */
-export default function error(
- message: string,
- props: {
- name: string;
- code: string;
- source: string;
- filename: string;
- start: number;
- end?: number;
- }
-): never {
- const err = new CompileError(message);
- err.name = props.name;
-
- const start = locate(props.source, props.start, { offsetLine: 1 });
- const end = locate(props.source, props.end || props.start, { offsetLine: 1 });
-
- err.code = props.code;
- err.start = start;
- err.end = end;
- err.pos = props.start;
- err.filename = props.filename;
-
- err.frame = get_code_frame(props.source, start.line - 1, start.column);
-
- throw err;
-}
diff --git a/src/parser/utils/full_char_code_at.ts b/src/parser/utils/full_char_code_at.ts
deleted file mode 100644
index b62b2c77a..000000000
--- a/src/parser/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/src/parser/utils/fuzzymatch.ts b/src/parser/utils/fuzzymatch.ts
deleted file mode 100644
index 4d17aafdf..000000000
--- a/src/parser/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/src/parser/utils/get_code_frame.ts b/src/parser/utils/get_code_frame.ts
deleted file mode 100644
index e4f1834fd..000000000
--- a/src/parser/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/src/parser/utils/link.ts b/src/parser/utils/link.ts
deleted file mode 100644
index 4e2ed662f..000000000
--- a/src/parser/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/src/parser/utils/list.ts b/src/parser/utils/list.ts
deleted file mode 100644
index 9388adb14..000000000
--- a/src/parser/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/src/parser/utils/names.ts b/src/parser/utils/names.ts
deleted file mode 100644
index f041d20ce..000000000
--- a/src/parser/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/src/parser/utils/namespaces.ts b/src/parser/utils/namespaces.ts
deleted file mode 100644
index 5f61beff9..000000000
--- a/src/parser/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/src/parser/utils/nodes_match.ts b/src/parser/utils/nodes_match.ts
deleted file mode 100644
index 7e4093994..000000000
--- a/src/parser/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/src/parser/utils/patterns.ts b/src/parser/utils/patterns.ts
deleted file mode 100644
index 317a7c199..000000000
--- a/src/parser/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/src/parser/utils/trim.ts b/src/parser/utils/trim.ts
deleted file mode 100644
index 480cc99a8..000000000
--- a/src/parser/utils/trim.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { whitespace } from './patterns.js';
-
-/** Trim whitespace from start of string */
-export function trim_start(str: string) {
- let i = 0;
- while (whitespace.test(str[i])) i += 1;
-
- return str.slice(i);
-}
-
-/** Trim whitespace from end of string */
-export function trim_end(str: string) {
- let i = str.length;
- while (whitespace.test(str[i - 1])) i -= 1;
-
- return str.slice(0, i);
-}