mdrefine 0.2.0-rc.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +577 -0
- package/CODE_OF_CONDUCT.md +30 -0
- package/CONTRIBUTING.md +189 -16
- package/README.md +100 -154
- package/SECURITY.md +15 -13
- package/config.schema.json +91 -0
- package/dist/cli/diff.d.ts +10 -0
- package/dist/cli/diff.js +247 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/main.js +270 -150
- package/dist/cli/main.js.map +1 -1
- package/dist/config/load.js +67 -6
- package/dist/config/load.js.map +1 -1
- package/dist/config/problems.d.ts +7 -0
- package/dist/config/problems.js +208 -0
- package/dist/config/problems.js.map +1 -0
- package/dist/config/resolve.d.ts +42 -109
- package/dist/config/resolve.js +193 -52
- package/dist/config/resolve.js.map +1 -1
- package/dist/core/directives.d.ts +7 -0
- package/dist/core/directives.js +25 -13
- package/dist/core/directives.js.map +1 -1
- package/dist/core/engine.d.ts +42 -4
- package/dist/core/engine.js +518 -79
- package/dist/core/engine.js.map +1 -1
- package/dist/core/frozen.d.ts +6 -0
- package/dist/core/frozen.js +15 -0
- package/dist/core/frozen.js.map +1 -0
- package/dist/core/scope.d.ts +30 -0
- package/dist/core/scope.js +122 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/core/types.d.ts +202 -23
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +3 -0
- package/dist/node.js +4 -0
- package/dist/node.js.map +1 -0
- package/dist/rules/blocks.d.ts +34 -0
- package/dist/rules/blocks.js +550 -0
- package/dist/rules/blocks.js.map +1 -0
- package/dist/rules/content.d.ts +2 -0
- package/dist/rules/content.js +85 -0
- package/dist/rules/content.js.map +1 -0
- package/dist/rules/dialects.js +10 -6
- package/dist/rules/dialects.js.map +1 -1
- package/dist/rules/links.js +302 -6
- package/dist/rules/links.js.map +1 -1
- package/dist/rules/lists.d.ts +2 -0
- package/dist/rules/lists.js +924 -0
- package/dist/rules/lists.js.map +1 -0
- package/dist/rules/structure.js +127 -1
- package/dist/rules/structure.js.map +1 -1
- package/dist/rules/style.d.ts +8 -2
- package/dist/rules/style.js +1137 -165
- package/dist/rules/style.js.map +1 -1
- package/dist/syntax/block-identifier.d.ts +18 -0
- package/dist/syntax/block-identifier.js +24 -0
- package/dist/syntax/block-identifier.js.map +1 -0
- package/dist/syntax/obsidian.d.ts +29 -11
- package/dist/syntax/obsidian.js +9 -10
- package/dist/syntax/obsidian.js.map +1 -1
- package/dist/syntax/parse.d.ts +87 -3
- package/dist/syntax/parse.js +247 -19
- package/dist/syntax/parse.js.map +1 -1
- package/dist/workspace/access.d.ts +12 -3
- package/dist/workspace/access.js +33 -5
- package/dist/workspace/access.js.map +1 -1
- package/dist/workspace/discovery.d.ts +85 -0
- package/dist/workspace/discovery.js +155 -0
- package/dist/workspace/discovery.js.map +1 -0
- package/dist/workspace/encoding.d.ts +24 -0
- package/dist/workspace/encoding.js +113 -0
- package/dist/workspace/encoding.js.map +1 -0
- package/dist/workspace/files.d.ts +92 -6
- package/dist/workspace/files.js +715 -59
- package/dist/workspace/files.js.map +1 -1
- package/dist/workspace/git.d.ts +54 -0
- package/dist/workspace/git.js +198 -0
- package/dist/workspace/git.js.map +1 -0
- package/dist/workspace/index.d.ts +58 -3
- package/dist/workspace/index.js +136 -37
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/selection.d.ts +2 -2
- package/dist/workspace/selection.js +3 -3
- package/dist/workspace/selection.js.map +1 -1
- package/dist/workspace/slug.js +8 -1
- package/dist/workspace/slug.js.map +1 -1
- package/dist/workspace/vault.js +3 -1
- package/dist/workspace/vault.js.map +1 -1
- package/docs/api.md +239 -0
- package/docs/benchmarks.md +140 -200
- package/docs/changelog.md +1 -0
- package/docs/cli.md +281 -89
- package/docs/configuration.md +193 -480
- package/docs/design.md +163 -284
- package/docs/dialects.md +169 -0
- package/docs/examples.md +151 -109
- package/docs/index.md +21 -37
- package/docs/integrations.md +144 -0
- package/docs/obsidian.md +91 -115
- package/docs/plugins.md +147 -212
- package/docs/quick-start.md +68 -74
- package/docs/rules.md +1237 -0
- package/docs/versions.md +56 -0
- package/examples/README.md +17 -14
- package/examples/automation/summarize-report.mjs +5 -2
- package/examples/library/lint-folder.mjs +5 -4
- package/examples/library/lint-workspace.mjs +32 -0
- package/examples/plugin/notes/release-checklist.md +2 -2
- package/examples/plugin/rules.mjs +17 -23
- package/examples/workspaces/obsidian-vault/after/mdtools.config.jsonc +2 -2
- package/examples/workspaces/obsidian-vault/before/mdtools.config.jsonc +2 -2
- package/examples/workspaces/repository-docs/after/README.md +2 -2
- package/examples/workspaces/repository-docs/after/mdtools.config.jsonc +0 -2
- package/examples/workspaces/repository-docs/before/README.md +2 -2
- package/examples/workspaces/repository-docs/before/docs/guide.md +7 -7
- package/examples/workspaces/repository-docs/before/docs/reference.md +3 -1
- package/examples/workspaces/repository-docs/before/mdtools.config.jsonc +0 -2
- package/package.json +38 -12
- package/docs/contributing.md +0 -218
- package/docs/releases/0.1.0-beta.1.md +0 -39
- package/docs/releases/0.1.0-beta.2.md +0 -83
- package/docs/releases/0.1.0-beta.3.md +0 -61
- package/docs/releases/0.1.0-beta.4.md +0 -50
- package/docs/releases/0.1.0-rc.1.md +0 -99
- package/docs/releases/0.2.0-rc.1.md +0 -141
- package/docs/releases/0.2.0-rc.2.md +0 -225
- package/docs/releases.md +0 -144
- package/docs/testing.md +0 -93
package/dist/core/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv } from \"ajv\";\nimport type { Nodes } from \"mdast\";\nimport { resolveConfig, setting } from \"../config/resolve.js\";\nimport { parse, range } from \"../syntax/parse.js\";\nimport { styleRules } from \"../rules/style.js\";\nimport { dialectRules } from \"../rules/dialects.js\";\nimport { structureRules } from \"../rules/structure.js\";\nimport { linkRules } from \"../rules/links.js\";\nimport { headingAnchorSource, headingAttributeSource } from \"../workspace/heading-attributes.js\";\nimport { suppressions } from \"./directives.js\";\nimport type {\n Diagnostic,\n Document,\n Edit,\n Finding,\n FormatResult,\n Plugin,\n ProcessOptions,\n ResolvedConfig,\n Rule,\n Workspace,\n} from \"./types.js\";\n\nexport const builtInRules: Record<string, Rule> = {\n ...styleRules,\n ...dialectRules,\n ...linkRules,\n ...structureRules,\n};\nexport function ruleRegistry(plugins: Plugin[] = []): Record<string, Rule> {\n const rules = { ...builtInRules };\n const names = new Set<string>();\n for (const plugin of plugins) {\n if (!/^[a-z][a-z\\d-]*$/.test(plugin.name) || names.has(plugin.name))\n throw new Error(`Invalid or duplicate plugin name: ${plugin.name}`);\n names.add(plugin.name);\n for (const [name, rule] of Object.entries(plugin.rules ?? {})) {\n const id = `${plugin.name}/${name}`;\n if (rules[id]) throw new Error(`Duplicate rule: ${id}`);\n rules[id] = rule;\n }\n }\n return rules;\n}\nconst ruleValidator = new Ajv({ allErrors: true });\nconst builtInSchemas = new Set(Object.values(builtInRules).map((rule) => rule.schema));\nfunction prepare(options: ProcessOptions) {\n const config = resolveConfig(\n options.config,\n options.path,\n options.plugins,\n options.defaultDialect,\n );\n const rules = ruleRegistry(options.plugins);\n let pluginValidator: Ajv | undefined;\n for (const [name, value] of Object.entries(config.rules)) {\n const rule = rules[name];\n if (!rule) throw new Error(`Unknown rule: ${name}`);\n const enabled = setting(value);\n if (rule.schema && enabled.severity !== \"off\") {\n // Plugin schema IDs are scoped to this call; distinct plugin instances\n // may legitimately reuse the same ID with different schemas.\n const validator = builtInSchemas.has(rule.schema)\n ? ruleValidator\n : (pluginValidator ??= new Ajv({ allErrors: true }));\n const validate = validator.compile(rule.schema);\n if (!validate(enabled.options))\n throw new Error(`Invalid options for ${name}: ${validator.errorsText(validate.errors)}`);\n }\n }\n return { config, rules };\n}\n/** Offsets where each line starts, computed once per source so findings locate in O(log lines). */\nfunction lineStarts(source: string): number[] {\n const starts = [0];\n for (let at = source.indexOf(\"\\n\"); at >= 0; at = source.indexOf(\"\\n\", at + 1))\n starts.push(at + 1);\n return starts;\n}\nfunction diagnostic(\n starts: number[],\n rule: string,\n severity: \"warn\" | \"error\",\n finding: Finding,\n): Diagnostic {\n let low = 0;\n let high = starts.length - 1;\n while (low < high) {\n const middle = (low + high + 1) >> 1;\n if (starts[middle]! <= finding.start) low = middle;\n else high = middle - 1;\n }\n return { ...finding, rule, severity, line: low + 1, column: finding.start - starts[low]! + 1 };\n}\nconst sortDiagnostics = (a: Diagnostic, b: Diagnostic) =>\n a.start - b.start || a.rule.localeCompare(b.rule);\nfunction inspect(\n document: Document,\n config: ResolvedConfig,\n rules: Record<string, Rule>,\n workspace?: Workspace,\n include: (rule: Rule) => boolean = () => true,\n): Diagnostic[] {\n const result: Diagnostic[] = [];\n const suppressed = suppressions(document);\n const starts = lineStarts(document.source);\n for (const [name, value] of Object.entries(config.rules)) {\n const enabled = setting(value);\n const rule = rules[name]!;\n if (enabled.severity === \"off\" || !include(rule)) continue;\n const findings = rule.check({\n document,\n options: enabled.options,\n ...(workspace ? { workspace } : {}),\n });\n for (const finding of findings)\n if (!suppressed(name, finding))\n result.push(diagnostic(starts, name, enabled.severity, finding));\n }\n return result.sort(sortDiagnostics);\n}\nexport function lint(source: string, options: ProcessOptions = {}): Diagnostic[] {\n const { config, rules } = prepare(options);\n const document = parse(source, config.dialect, options.path, options.plugins);\n return inspect(document, config, rules, options.workspace);\n}\nexport function applyEdits(source: string, edits: Edit[]): string {\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previous: Edit | undefined;\n const accepted: Edit[] = [];\n for (const edit of sorted) {\n if (\n !Number.isInteger(edit.start) ||\n !Number.isInteger(edit.end) ||\n edit.start < 0 ||\n edit.end < edit.start ||\n edit.end > source.length\n )\n throw new Error(\"Rule returned an invalid edit range.\");\n if (\n previous &&\n edit.start === previous.start &&\n edit.end === previous.end &&\n edit.text === previous.text\n )\n continue;\n if (previous && (edit.start < previous.end || edit.start === previous.start))\n throw new Error(\n \"Enabled rules proposed overlapping edits; disable one of the conflicting rules.\",\n );\n accepted.push(edit);\n previous = edit;\n }\n // Assemble the result in one pass; rebuilding the string per edit is quadratic.\n const parts: string[] = [];\n let cursor = 0;\n for (const edit of accepted) {\n parts.push(source.slice(cursor, edit.start), edit.text);\n cursor = edit.end;\n }\n parts.push(source.slice(cursor));\n return parts.join(\"\");\n}\n/** Compare semantic trees, with link identity supplied by the selected renderer's resolver. */\nexport function semanticFingerprint(document: Document, workspace?: Workspace): string {\n const canonicalUrl = (url: string, wiki = false) => {\n const resolution = workspace?.resolve(document.path, url, document.dialect, wiki);\n // A target that is uncertain, because a directory could not be read, is not\n // an identity: only the same spelling is known to name the same note.\n return resolution?.status === \"resolved\" && !resolution.unreadable\n ? `${resolution.target}#${resolution.fragment ?? \"\"}`\n : url;\n };\n // Keys are emitted in sorted order so the JSON text is canonical without a replacer.\n function normalize(node: Nodes, calloutHeader = false): unknown {\n if (node.type === \"wikiLink\") {\n if (node.embed)\n return { label: node.label, type: \"embed\", url: canonicalUrl(node.target ?? \"\", true) };\n return {\n children: [{ type: \"text\", value: node.label ?? node.target }],\n title: null,\n type: \"link\",\n url: canonicalUrl(node.target ?? \"\", true),\n };\n }\n const result: Record<string, unknown> = {};\n // Forgejo and Gitea read a heading's trailing `{...}` block as attributes,\n // character for character, where the tree holds ordinary inline content,\n // and generate the anchor from the heading's last line as written.\n if (node.type === \"heading\") {\n const attributes = headingAttributeSource(document, node);\n if (attributes !== undefined) result.attributes = attributes;\n const anchors = headingAnchorSource(document, node);\n if (anchors !== undefined) result.anchors = anchors;\n }\n if (calloutHeader && document.dialect === \"obsidian\" && node.type === \"paragraph\") {\n const [start, end] = range(node);\n const header = document.source.slice(start, end).split(/\\r?\\n/, 1)[0]!;\n if (/^\\[![\\w-]+\\]/.test(header)) {\n // CommonMark merges title and body into one paragraph. Preserve their boundary too.\n const title = header.replace(\n /^\\[!([\\w-]+)\\]/,\n (_, marker: string) => `[!${marker.toLowerCase()}]`,\n );\n result.calloutTitle = normalize(parse(title, document.dialect, document.path).tree);\n }\n }\n for (const key of Object.keys(node).sort()) {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (key === \"position\" || key === \"data\") continue;\n if (key === \"children\" && \"children\" in node) {\n result.children = node.children.map((child, index) =>\n normalize(child, index === 0 && (node.type === \"blockquote\" || calloutHeader)),\n );\n } else if (key === \"url\" && typeof value === \"string\") result[key] = canonicalUrl(value);\n else if (key === \"value\" && node.type === \"text\") {\n let text = node.value.replace(/[ \\t\\r\\n]+/g, \" \");\n if (calloutHeader && document.dialect !== \"commonmark\")\n text = text.replace(\n /^\\[!([\\w-]+)\\]/,\n (_, marker: string) => `[!${marker.toLowerCase()}]`,\n );\n result[key] = text;\n } else if (key === \"value\" && node.type === \"inlineCode\")\n result[key] = node.value.replace(/\\r\\n|\\r|\\n/g, \" \");\n else result[key] = value;\n }\n return result;\n }\n return JSON.stringify(normalize(document.tree));\n}\nexport function format(source: string, options: ProcessOptions = {}): FormatResult {\n const { config, rules } = prepare(options);\n let output = source;\n let document = parse(source, config.dialect, options.path, options.plugins);\n // The original fingerprint is only needed once an edit produces a candidate.\n let fingerprint: string | undefined;\n const seen = new Set([source]);\n try {\n for (let pass = 0; pass < 8; pass++) {\n const before = output;\n const findings: Diagnostic[] = [];\n for (const phase of [\"inline\", \"block\", \"document\"]) {\n const diagnostics = inspect(\n document,\n config,\n rules,\n options.workspace,\n (rule) => rule.kind === \"style\" && (rule.phase ?? \"inline\") === phase,\n );\n findings.push(...diagnostics);\n const edits = diagnostics.flatMap((item) => (item.edit ? [item.edit] : []));\n if (!edits.length) continue;\n const candidate = applyEdits(output, edits);\n if (candidate === output) continue;\n const candidateDocument = parse(candidate, config.dialect, options.path, options.plugins);\n fingerprint ??= semanticFingerprint(document, options.workspace);\n if (semanticFingerprint(candidateDocument, options.workspace) !== fingerprint)\n throw new Error(\n `Formatting in the ${phase} phase would change parsed meaning; the document was left unchanged.`,\n );\n output = candidate;\n // Rules consume the document without mutating it. Reuse the validated\n // tree until another phase changes its source, including final diagnostics.\n document = candidateDocument;\n }\n if (output === before) {\n // No phase changed the document, so every style finding of this pass\n // describes the final document; only the non-style rules still need to run.\n const remaining = inspect(\n document,\n config,\n rules,\n options.workspace,\n (rule) => rule.kind !== \"style\",\n );\n return {\n output,\n changed: output !== source,\n diagnostics: [...findings, ...remaining].sort(sortDiagnostics),\n };\n }\n if (seen.has(output))\n throw new Error(\"Formatting rules oscillate; the document was left unchanged.\");\n seen.add(output);\n }\n throw new Error(\n \"Formatting did not converge in eight passes; the document was left unchanged.\",\n );\n } catch (error) {\n return {\n output: source,\n changed: false,\n diagnostics: [\n diagnostic([0], \"engine/unsafe-format\", \"error\", {\n start: 0,\n message: error instanceof Error ? error.message : String(error),\n }),\n ],\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv } from \"ajv\";\nimport type { AnySchema, ValidateFunction } from \"ajv\";\nimport { deepFreeze } from \"./frozen.js\";\nimport type { Nodes } from \"mdast\";\nimport { resolveConfig, setting } from \"../config/resolve.js\";\nimport { optionErrors, shown } from \"../config/problems.js\";\nimport {\n codeSpanText,\n frontMatterReading,\n parse,\n range,\n splitByteOrderMark,\n startsWithMarker,\n} from \"../syntax/parse.js\";\nimport { styleRules } from \"../rules/style.js\";\nimport { blockRules } from \"../rules/blocks.js\";\nimport { dialectRules } from \"../rules/dialects.js\";\nimport { structureRules } from \"../rules/structure.js\";\nimport { linkRules } from \"../rules/links.js\";\nimport { contentRules } from \"../rules/content.js\";\nimport { listRules } from \"../rules/lists.js\";\nimport { headingAnchorSource, headingAttributeSource } from \"../workspace/heading-attributes.js\";\nimport { suppressions } from \"./directives.js\";\nimport { checkRanges, covers, holds, moved, shifted, widen } from \"./scope.js\";\nimport type {\n Diagnostic,\n Document,\n Edit,\n Finding,\n FormatResult,\n JsonSchema,\n Plugin,\n ProcessOptions,\n ResolvedConfig,\n Rule,\n SourceRange,\n Workspace,\n} from \"./types.js\";\n\n/**\n * The built-in rules by rule ID. The table and the rules in it are frozen, so\n * that no caller can change what another one runs.\n */\nexport const builtInRules: Readonly<Record<string, Readonly<Rule>>> = deepFreeze({\n ...styleRules,\n ...blockRules,\n ...dialectRules,\n ...linkRules,\n ...structureRules,\n ...contentRules,\n ...listRules,\n});\nconst phases = [\"inline\", \"block\", \"document\"] as const;\n/** What is wrong with a plugin's rule, or undefined when it has the shape of a `Rule`. */\nfunction ruleProblem(rule: unknown): string | undefined {\n if (!rule || typeof rule !== \"object\") return `it is ${shown(rule)}, not an object`;\n const { check, kind, phase, description, schema } = rule as Record<string, unknown>;\n if (typeof check !== \"function\") return `its check is ${shown(check)}, not a function`;\n if (kind !== \"style\" && kind !== \"problem\")\n return `its kind is ${shown(kind)}, not \"style\" or \"problem\"`;\n if (phase !== undefined && !(phases as readonly unknown[]).includes(phase))\n return `its phase is ${shown(phase)}, not \"inline\", \"block\", or \"document\"`;\n if (typeof description !== \"string\")\n return `its description is ${shown(description)}, not a string`;\n if (\n schema !== undefined &&\n typeof schema !== \"boolean\" &&\n (!schema || typeof schema !== \"object\" || Array.isArray(schema))\n )\n return `its schema is ${shown(schema)}, not a JSON Schema`;\n // Options are checked before each run, synchronously; an asynchronous\n // check would come back after the run, too late to stop it.\n if (schema && typeof schema === \"object\" && (schema as { $async?: unknown }).$async === true)\n return \"its schema is asynchronous ($async), and options are checked synchronously\";\n return undefined;\n}\n/**\n * The prefix of the engine's own diagnostics, such as `engine/rule-error`. A\n * plugin of this name could report findings that pass for the engine's, which\n * concern the whole document and make the CLI exit with code 2.\n */\nexport const reservedPluginName = \"engine\";\n/**\n * The built-in rules and those of `plugins`, by rule ID, in a new table. A\n * plugin name that is invalid, reserved, or used twice, a rule ID that exists\n * already, and a plugin rule that does not have the shape of a `Rule` are\n * errors that name them.\n */\nexport function ruleRegistry(plugins: readonly Plugin[] = []): Record<string, Readonly<Rule>> {\n const rules = { ...builtInRules };\n const names = new Set<string>();\n for (const plugin of plugins) {\n if (plugin.name === reservedPluginName)\n throw new Error(\n `Invalid plugin name: ${reservedPluginName} is reserved for the engine's own diagnostics`,\n );\n if (!/^[a-z][a-z\\d-]*$/.test(plugin.name) || names.has(plugin.name))\n throw new Error(`Invalid or duplicate plugin name: ${plugin.name}`);\n names.add(plugin.name);\n for (const [name, rule] of Object.entries(plugin.rules ?? {})) {\n const id = `${plugin.name}/${name}`;\n if (Object.hasOwn(rules, id)) throw new Error(`Duplicate rule: ${id}`);\n const problem = ruleProblem(rule);\n if (problem) throw new Error(`Invalid rule ${id}: ${problem}.`);\n rules[id] = rule;\n }\n }\n return rules;\n}\n/** Checks the options of built-in rules, whose schemas have no `$id` that could collide. */\nconst ruleValidator = new Ajv({ allErrors: true });\nconst builtInSchemas = new Set(Object.values(builtInRules).map((rule) => rule.schema));\n/**\n * Each option schema compiled once, however many documents use it. A plugin\n * schema gets a validator of its own, because distinct plugins may\n * legitimately reuse an `$id` with different schemas.\n */\nconst compiledSchemas = new WeakMap<object, ValidateFunction>();\nfunction optionsValidator(name: string, schema: JsonSchema): ValidateFunction {\n // Ajv keeps compiled boolean schemas itself.\n if (typeof schema !== \"object\") return ruleValidator.compile(schema);\n let validate = compiledSchemas.get(schema);\n if (!validate) {\n try {\n validate = (\n builtInSchemas.has(schema) ? ruleValidator : new Ajv({ allErrors: true })\n ).compile(schema as AnySchema);\n } catch (error) {\n throw new Error(\n `Invalid rule ${name}: its schema cannot be compiled: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n // A schema can become asynchronous through one that it refers to.\n if ((validate as { $async?: unknown }).$async === true)\n throw new Error(\n `Invalid rule ${name}: its schema is asynchronous ($async), and options are checked synchronously`,\n );\n compiledSchemas.set(schema, validate);\n }\n return validate;\n}\nfunction prepare(options: ProcessOptions) {\n // Only these options, so that resolveConfig's check for the prereleases' form sees no others.\n const { config: given, path, plugins, defaultDialect } = options;\n const config = resolveConfig({ config: given, path, plugins, defaultDialect });\n const rules = ruleRegistry(options.plugins);\n for (const [name, value] of Object.entries(config.rules)) {\n // Names such as `toString` are found on every object; only defined rules count.\n if (!Object.hasOwn(rules, name)) throw new Error(`Unknown rule: ${name}`);\n const rule = rules[name]!;\n const enabled = setting(value);\n // A schema of `false` means that the rule takes no options. A setting that\n // gives none is checked as empty options, which `false` would refuse too.\n if (rule.schema === false && enabled.severity !== \"off\") {\n if (Object.keys(enabled.options).length)\n throw new Error(`Invalid options for ${name}: the rule takes no options`);\n } else if (rule.schema !== undefined && enabled.severity !== \"off\") {\n const validate = optionsValidator(name, rule.schema);\n if (!validate(enabled.options))\n throw new Error(\n `Invalid options for ${name}: ${optionErrors(validate.errors ?? [], enabled.options)}`,\n );\n }\n }\n return { config, rules };\n}\n/** CommonMark's line endings. */\nconst lineBreaks = /\\r\\n|\\r|\\n/g;\n/** Offsets where each line starts, computed once per source so findings locate in O(log lines). */\nfunction lineStarts(source: string): number[] {\n const starts = [0];\n for (const match of source.matchAll(lineBreaks)) starts.push(match.index + match[0].length);\n return starts;\n}\nfunction diagnostic(\n starts: number[],\n rule: string,\n severity: \"warn\" | \"error\",\n finding: Finding,\n): Diagnostic {\n let low = 0;\n let high = starts.length - 1;\n while (low < high) {\n const middle = (low + high + 1) >> 1;\n if (starts[middle]! <= finding.start) low = middle;\n else high = middle - 1;\n }\n return { ...finding, rule, severity, line: low + 1, column: finding.start - starts[low]! + 1 };\n}\nconst sortDiagnostics = (a: Diagnostic, b: Diagnostic) =>\n a.start - b.start || a.rule.localeCompare(b.rule);\n/** Diagnostics of the engine itself; they concern the whole document. */\nconst fromEngine = (item: Diagnostic) => item.rule.startsWith(\"engine/\");\n/** Why `value` is not an offset from `from` to `to`, or undefined when it is one. */\nfunction offsetProblem(what: string, value: unknown, from: number, to: number) {\n return Number.isInteger(value) && (value as number) >= from && (value as number) <= to\n ? undefined\n : `${what} is ${shown(value)}, not an offset from ${from} to ${to}`;\n}\n/**\n * What is wrong with the findings that a rule returned for a source of\n * `length` UTF-16 units, as the rest of a sentence about the rule, or\n * undefined when every finding can be reported and every edit applied.\n */\nfunction findingsProblem(findings: unknown, length: number): string | undefined {\n if (!Array.isArray(findings)) return `returned ${shown(findings)} instead of a list of findings`;\n for (const finding of findings as unknown[]) {\n if (!finding || typeof finding !== \"object\")\n return `returned a finding that is ${shown(finding)}, not an object`;\n const { message, start, end, edit } = finding as Record<string, unknown>;\n const problem =\n (typeof message === \"string\"\n ? undefined\n : `whose message is ${shown(message)}, not a string`) ??\n offsetProblem(\"whose start\", start, 0, length) ??\n (end === undefined ? undefined : offsetProblem(\"whose end\", end, start as number, length)) ??\n (edit === undefined || (edit && typeof edit === \"object\")\n ? undefined\n : `whose edit is ${shown(edit)}, not an object`);\n if (problem) return `returned a finding ${problem}`;\n if (edit === undefined) continue;\n const { start: from, end: to, text } = edit as Record<string, unknown>;\n const invalid =\n offsetProblem(\"whose start\", from, 0, length) ??\n offsetProblem(\"whose end\", to, from as number, length) ??\n (typeof text === \"string\" ? undefined : `whose text is ${shown(text)}, not a string`);\n if (invalid) return `returned an edit ${invalid}`;\n }\n return undefined;\n}\n/**\n * The workspace of a run as the engine and its rules use it, and the errors\n * that it threw. Such an error is the host's, such as a file that could not be\n * read, and neither a rule's nor a refusal to format: it stops the run.\n */\ninterface Host {\n workspace?: Workspace;\n errors: Set<unknown>;\n}\nfunction host(workspace: Workspace | undefined): Host {\n const errors = new Set<unknown>();\n return workspace ? { workspace: guarded(workspace, errors), errors } : { errors };\n}\n/**\n * `workspace` as rules see it. What its `resolve` throws is added to `errors`:\n * such an error is the host's, such as a file that could not be read, and not\n * the rule's. Rules still see it as it was thrown.\n */\nfunction guarded(workspace: Workspace, errors: Set<unknown>): Workspace {\n const resolve: Workspace[\"resolve\"] = (...query) => {\n try {\n return workspace.resolve(...query);\n } catch (error) {\n errors.add(error);\n throw error;\n }\n };\n // Other members, such as a host's own, reach the workspace itself.\n return new Proxy(workspace, {\n get(target, key) {\n if (key === \"resolve\") return resolve;\n const value: unknown = Reflect.get(target, key);\n return typeof value === \"function\" ? (value as () => unknown).bind(target) : value;\n },\n });\n}\n/** A thrown value as text, without letting it throw again. */\nfunction failure(error: unknown): string {\n try {\n return error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n } catch {\n return \"a value that cannot be shown\";\n }\n}\n/**\n * The diagnostics of the enabled rules that `include` selects. A rule that\n * throws, or returns something that is not a list of valid findings, is\n * skipped for the document and reported as `engine/rule-error` instead. An\n * error of the workspace itself, such as a file that could not be read, is\n * not the rule's and is thrown on.\n */\nfunction inspect(\n document: Document,\n config: ResolvedConfig,\n rules: Record<string, Rule>,\n { workspace, errors: hostErrors }: Host,\n include: (rule: Rule) => boolean = () => true,\n): Diagnostic[] {\n const result: Diagnostic[] = [];\n const suppressed = suppressions(document);\n const starts = lineStarts(document.source);\n for (const [name, value] of Object.entries(config.rules)) {\n const enabled = setting(value);\n const rule = rules[name]!;\n if (enabled.severity === \"off\" || !include(rule)) continue;\n let findings: Finding[] = [];\n let problem: string | undefined;\n try {\n const returned: unknown = rule.check({\n document,\n options: enabled.options,\n ...(workspace ? { workspace } : {}),\n });\n problem = findingsProblem(returned, document.source.length);\n if (!problem) findings = returned as Finding[];\n } catch (error) {\n if (hostErrors.has(error)) throw error;\n problem = `failed (${failure(error)})`;\n }\n if (problem) {\n result.push(\n diagnostic([0], \"engine/rule-error\", \"error\", {\n start: 0,\n message: `Rule ${name} ${problem}; the rule was skipped for this document.`,\n }),\n );\n continue;\n }\n for (const finding of findings)\n if (!suppressed(name, finding))\n result.push(diagnostic(starts, name, enabled.severity, finding));\n }\n return result.sort(sortDiagnostics);\n}\n/**\n * Locate diagnostics of a document that `parse` read without the byte order\n * marks it starts with in the text as given, so that their edits apply to that\n * text. Lines and columns stay as they are: the marks are invisible.\n */\nfunction located(diagnostics: Diagnostic[], mark: string): Diagnostic[] {\n if (!mark) return diagnostics;\n const by = mark.length;\n return diagnostics.map((item) => ({\n ...item,\n start: item.start + by,\n ...(item.end !== undefined ? { end: item.end + by } : {}),\n ...(item.edit\n ? { edit: { ...item.edit, start: item.edit.start + by, end: item.edit.end + by } }\n : {}),\n }));\n}\n/**\n * The diagnostics of the enabled rules for `source`, sorted by position. A rule\n * that fails is skipped and reported as `engine/rule-error`. An invalid\n * configuration, an unknown rule, invalid rule options, an invalid plugin, and\n * an error that the workspace throws are thrown.\n */\nexport function lint(source: string, options: ProcessOptions = {}): Diagnostic[] {\n if (options.ranges) checkRanges(options.ranges, source);\n const { config, rules } = prepare(options);\n const [mark, text] = splitByteOrderMark(source);\n const document = parse(text, config.dialect, options.path, options.plugins);\n const diagnostics = inspect(document, config, rules, host(options.workspace));\n // Ranges count the marks, and the document's positions do not.\n const scope =\n options.ranges && widen(document.tree, document.source, shifted(options.ranges, -mark.length));\n return located(\n scope\n ? diagnostics.filter((item) => fromEngine(item) || covers(scope, item.start))\n : diagnostics,\n mark,\n );\n}\n/**\n * `source` with `edits` applied, which are `{ start, end, text }` replacements\n * at UTF-16 offsets into it. Repeats of one edit count once; an edit outside\n * the source, or one that overlaps another, is an error.\n */\nexport function applyEdits(source: string, edits: readonly Edit[]): string {\n return splice(source, acceptedEdits(source, edits));\n}\n/** `source` with `edits`, which are sorted and do not overlap, applied. */\nfunction splice(source: string, edits: readonly Edit[]): string {\n // Assemble the result in one pass; rebuilding the string per edit is quadratic.\n const parts: string[] = [];\n let cursor = 0;\n for (const edit of edits) {\n parts.push(source.slice(cursor, edit.start), edit.text);\n cursor = edit.end;\n }\n parts.push(source.slice(cursor));\n return parts.join(\"\");\n}\n/**\n * The edits that `applyEdits` applies, sorted by position and without repeats\n * of the same edit. An edit outside the source, or overlapping another one, is\n * an error.\n */\nfunction acceptedEdits(source: string, edits: readonly Edit[]): Edit[] {\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previous: Edit | undefined;\n const accepted: Edit[] = [];\n for (const edit of sorted) {\n if (\n !Number.isInteger(edit.start) ||\n !Number.isInteger(edit.end) ||\n edit.start < 0 ||\n edit.end < edit.start ||\n edit.end > source.length\n )\n throw new Error(\"Rule returned an invalid edit range.\");\n if (\n previous &&\n edit.start === previous.start &&\n edit.end === previous.end &&\n edit.text === previous.text\n )\n continue;\n if (previous && (edit.start < previous.end || edit.start === previous.start))\n throw new Error(\n \"Enabled rules proposed overlapping edits; disable one of the conflicting rules.\",\n );\n accepted.push(edit);\n previous = edit;\n }\n return accepted;\n}\n/**\n * The meaning of a parsed document as text, which `format` compares before and\n * after edits to refuse a change of meaning: its syntax tree without positions,\n * with runs of whitespace in text alike, and with each link's destination as\n * the workspace resolves it, so that two spellings of one target are the same.\n */\nexport function semanticFingerprint(document: Document, workspace?: Workspace): string {\n return JSON.stringify(semanticTree(document, workspace));\n}\n/**\n * The document's meaning as plain data whose keys are in sorted order. With\n * `origins`, each object of the result that stands for a node of the document\n * is mapped to that node.\n */\nfunction semanticTree(\n document: Document,\n workspace?: Workspace,\n origins?: Map<unknown, Nodes>,\n): unknown {\n const canonicalUrl = (url: string, wiki = false) => {\n const resolution = workspace?.resolve(document.path, url, document.dialect, wiki);\n // A target that is uncertain, because a directory could not be read, is not\n // an identity: only the same spelling is known to name the same note.\n return resolution?.status === \"resolved\" && !resolution.unreadable\n ? `${resolution.target}#${resolution.fragment ?? \"\"}`\n : url;\n };\n // Keys are emitted in sorted order so the JSON text is canonical without a replacer.\n function normalize(node: Nodes, calloutHeader = false): unknown {\n if (node.type === \"wikiLink\") {\n const link = node.embed\n ? { label: node.label, type: \"embed\", url: canonicalUrl(node.target, true) }\n : {\n children: [{ type: \"text\", value: node.label ?? node.target }],\n title: null,\n type: \"link\",\n url: canonicalUrl(node.target, true),\n };\n origins?.set(link, node);\n return link;\n }\n const result: Record<string, unknown> = {};\n // Forgejo and Gitea read a heading's trailing `{...}` block as attributes,\n // character for character, where the tree holds ordinary inline content,\n // and generate the anchor from the heading's last line as written.\n if (node.type === \"heading\") {\n const attributes = headingAttributeSource(document, node);\n if (attributes !== undefined) result.attributes = attributes;\n const anchors = headingAnchorSource(document, node);\n if (anchors !== undefined) result.anchors = anchors;\n }\n if (calloutHeader && document.dialect !== \"commonmark\" && node.type === \"paragraph\") {\n const [start, end] = range(node);\n const header = document.source.slice(start, end).split(/\\r\\n|\\r|\\n/, 1)[0]!;\n if (startsWithMarker(header, node)) {\n // CommonMark merges an Obsidian callout's title, or the line of a\n // GitHub alert's marker, and the body into one paragraph. Preserve\n // their boundary too, also for a marker written as `\\[!NOTE]`.\n const title = header.replace(\n /^\\[!([\\w-]+)\\]/,\n (_, marker: string) => `[!${marker.toLowerCase()}]`,\n );\n result.calloutTitle = normalize(parse(title, document.dialect, document.path).tree);\n }\n }\n for (const key of Object.keys(node).sort()) {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (key === \"position\" || key === \"data\") continue;\n if (key === \"children\" && \"children\" in node) {\n result.children = node.children.map((child, index) =>\n normalize(child, index === 0 && (node.type === \"blockquote\" || calloutHeader)),\n );\n } else if (key === \"url\" && typeof value === \"string\") result[key] = canonicalUrl(value);\n else if (key === \"value\" && node.type === \"text\") {\n let text = node.value.replace(/[ \\t\\r\\n]+/g, \" \");\n if (calloutHeader && document.dialect !== \"commonmark\")\n text = text.replace(\n /^\\[!([\\w-]+)\\]/,\n (_, marker: string) => `[!${marker.toLowerCase()}]`,\n );\n result[key] = text;\n } else if (key === \"value\" && node.type === \"inlineCode\")\n // A code span is compared by the text that GitHub shows, which its\n // value in the tree does not hold where it spans lines.\n result[key] = codeSpanText(node);\n // An image's description renders as plain text, and a reference's label\n // matches its definition with whitespace collapsed.\n else if ((key === \"alt\" || key === \"label\") && typeof value === \"string\")\n result[key] = value.replace(/[ \\t\\r\\n]+/g, \" \");\n else result[key] = value;\n }\n origins?.set(result, node);\n return result;\n }\n const result = normalize(document.tree) as Record<string, unknown>;\n // Where front matter would end inside a code block, an HTML block, or\n // display math, the document is read without it, and an edit has to keep\n // the meaning of both readings.\n const reading = frontMatterReading(document.tree);\n if (reading) result.frontMatterReading = normalize(reading);\n return result;\n}\n/** A part of a semantic tree that has children. */\ntype Branch = Record<string, unknown> & { children: unknown[] };\nconst isBranch = (value: unknown): value is Branch =>\n typeof value === \"object\" && value !== null && Array.isArray((value as Branch).children);\n/**\n * Where the meaning of `after` first differs from that of `before`, as an\n * offset into `before`'s source: the start of the first node, in document\n * order, whose meaning is not the same, or the end of the node that `after`\n * gives more content.\n */\nfunction divergence(before: Document, after: Document, workspace?: Workspace): number {\n const origins = new Map<unknown, Nodes>();\n let a = semanticTree(before, workspace, origins);\n let b = semanticTree(after, workspace);\n // Where only the reading with front matter differs, the place is in that reading.\n const reading = (value: unknown) =>\n (value as { frontMatterReading?: unknown }).frontMatterReading;\n if (\n isBranch(a) &&\n isBranch(b) &&\n isBranch(reading(a)) &&\n isBranch(reading(b)) &&\n JSON.stringify(a.children) === JSON.stringify(b.children)\n ) {\n a = reading(a);\n b = reading(b);\n }\n let offset = 0;\n for (;;) {\n const node = origins.get(a);\n // A node made up for the comparison, or one without a position, is placed at its parent.\n offset = node?.position?.start.offset ?? offset;\n if (!isBranch(a) || !isBranch(b)) return offset;\n const own = (value: Branch) => JSON.stringify({ ...value, children: undefined });\n if (own(a) !== own(b)) return offset;\n const { children } = b;\n const index = a.children.findIndex(\n (child, at) => JSON.stringify(child) !== JSON.stringify(children[at]),\n );\n if (index < 0) return node?.position?.end.offset ?? offset;\n a = a.children[index];\n b = children[index];\n }\n}\n/**\n * Format a document: apply the edits of the enabled style rules, in passes\n * until nothing changes, leaving out the edits of a rule that would change the\n * document's meaning. Byte order marks that it starts with stay in the output\n * and are not part of what the rules see. Errors are thrown as by `lint`.\n */\nexport function format(source: string, options: ProcessOptions = {}): FormatResult {\n if (options.ranges) checkRanges(options.ranges, source);\n const [mark, text] = splitByteOrderMark(source);\n // Ranges count the marks, and the document's positions do not.\n const result = formatText(text, options, options.ranges && shifted(options.ranges, -mark.length));\n return {\n output: mark + result.output,\n changed: result.changed,\n diagnostics: located(result.diagnostics, mark),\n ...(result.scope ? { scope: shifted(result.scope, mark.length) } : {}),\n };\n}\n/** An edit that a rule proposed, with the rule's ID. */\ninterface Proposal extends Edit {\n rule: string;\n}\nconst byPosition = (a: Edit, b: Edit) => a.start - b.start || a.end - b.end;\n/**\n * The proposals to apply together, in the order of the source. An edit that\n * overlaps one before it, or repeats it, is left out; the next pass, which\n * runs the rules again on the changed text, reconsiders it.\n */\nfunction compatible(proposals: readonly Proposal[]): Proposal[] {\n const result: Proposal[] = [];\n let previous: Proposal | undefined;\n for (const edit of [...proposals].sort(byPosition)) {\n if (previous && (edit.start < previous.end || edit.start === previous.start)) continue;\n result.push(edit);\n previous = edit;\n }\n return result;\n}\n/** Rule IDs as a list in prose. */\nfunction listed(names: Iterable<string>): string {\n const items = [...names];\n return items.length < 3\n ? items.join(\" and \")\n : `${items.slice(0, -1).join(\", \")}, and ${items.at(-1)}`;\n}\n/**\n * Format a document without byte order marks, limited to `ranges` in its\n * positions. Each phase applies the edits of its rules together when the\n * result means what the original document means. Otherwise it adds the rules'\n * edits one rule at a time and leaves out the edits of each rule that would\n * change the meaning; the result reports each such rule with the place where\n * the meaning would first differ. Passes repeat until one changes nothing;\n * formatting that does not settle leaves the whole document unchanged.\n */\nfunction formatText(\n source: string,\n options: ProcessOptions,\n ranges: SourceRange[] | undefined,\n): FormatResult {\n const { config, rules } = prepare(options);\n // What the workspace throws stops formatting, as it stops `lint`.\n const hosted = host(options.workspace);\n const { workspace } = hosted;\n let output = source;\n let document = parse(source, config.dialect, options.path, options.plugins);\n // Where edits may apply, in the positions of the current output.\n const initial = ranges && widen(document.tree, source, ranges);\n let scope = initial;\n // Engine findings concern the whole document and are always reported.\n const reported = (items: Diagnostic[]) =>\n scope ? items.filter((item) => fromEngine(item) || covers(scope!, item.start)) : items;\n const unchanged = (message: string): FormatResult => ({\n output: source,\n changed: false,\n diagnostics: [diagnostic([0], \"engine/unsafe-format\", \"error\", { start: 0, message })],\n ...(initial ? { scope: initial } : {}),\n });\n // The original fingerprint is only needed once an edit produces a candidate.\n let fingerprint: string | undefined;\n /** `candidate` parsed, and whether it means what the original document means. */\n const check = (candidate: string) => {\n const parsed = parse(candidate, config.dialect, options.path, options.plugins);\n // Every document accepted so far means what the original means, so the current one serves.\n fingerprint ??= semanticFingerprint(document, workspace);\n return {\n document: parsed,\n safe: semanticFingerprint(parsed, workspace) === fingerprint,\n };\n };\n const seen = new Set([source]);\n /** The rules whose edits changed the document in the latest pass. */\n let applied = new Set<string>();\n try {\n for (let pass = 0; pass < 8; pass++) {\n const before = output;\n const findings: Diagnostic[] = [];\n applied = new Set();\n /** The rules whose edits this pass left out, with the document before and after them. */\n const refused: { rule: string; before: Document; after: Document }[] = [];\n const accept = (edits: Proposal[], text: string, parsed: Document) => {\n output = text;\n // Rules consume the document without mutating it. Reuse the validated\n // tree until another phase changes its source, including final diagnostics.\n document = parsed;\n if (scope) scope = moved(scope, edits);\n for (const edit of edits) applied.add(edit.rule);\n };\n for (const phase of phases) {\n const diagnostics = inspect(\n document,\n config,\n rules,\n hosted,\n (rule) => rule.kind === \"style\" && (rule.phase ?? \"inline\") === phase,\n );\n findings.push(...diagnostics);\n // With ranges, an edit that reaches outside them is not applied. One\n // that changes nothing need not be tried, and must not hold others back.\n const proposals: Proposal[] = [];\n for (const { edit, rule } of diagnostics)\n if (\n edit &&\n (!scope || holds(scope, edit)) &&\n output.slice(edit.start, edit.end) !== edit.text\n )\n proposals.push({ start: edit.start, end: edit.end, text: edit.text, rule });\n // The rules of this phase whose edits would change the meaning.\n const excluded = new Set<string>();\n for (;;) {\n const edits = compatible(proposals.filter((edit) => !excluded.has(edit.rule)));\n if (!edits.length) break;\n const candidate = splice(output, edits);\n if (candidate === output) break;\n const tried = check(candidate);\n if (tried.safe) {\n accept(edits, candidate, tried.document);\n break;\n }\n // Taken only when a phase fails, so the usual path parses each candidate once.\n let kept: Proposal[] = [];\n let keptOutput = output;\n let keptDocument = document;\n for (const rule of new Set(edits.map((edit) => edit.rule))) {\n const trial = [...kept, ...edits.filter((edit) => edit.rule === rule)].sort(byPosition);\n // All the edits together are already known to fail.\n const whole = trial.length === edits.length;\n const text = whole ? candidate : splice(output, trial);\n const result = whole ? tried : check(text);\n if (result.safe) {\n kept = trial;\n keptOutput = text;\n keptDocument = result.document;\n } else {\n excluded.add(rule);\n refused.push({ rule, before: document, after: result.document });\n }\n }\n if (keptOutput !== output) {\n accept(kept, keptOutput, keptDocument);\n break;\n }\n // Nothing was kept: the edits that overlapped refused ones get their turn.\n }\n }\n if (output === before) {\n // No phase changed the document, so every style finding of this pass\n // describes the final document; only the non-style rules still need to run.\n const remaining = inspect(document, config, rules, hosted, (rule) => rule.kind !== \"style\");\n // A refusal of this pass was tried on the final text, unless one\n // phase undid what an earlier one did.\n const starts = refused.length ? lineStarts(output) : [];\n const refusals = refused.map(({ rule, before: tried, after }) => {\n const start = tried.source === output ? divergence(tried, after, workspace) : 0;\n const { line } = diagnostic(starts, rule, \"error\", { start, message: \"\" });\n return diagnostic(starts, \"engine/unsafe-format\", \"error\", {\n start,\n message: `${rule} would change the parsed meaning at line ${line}; none of its edits were applied.`,\n });\n });\n return {\n output,\n changed: output !== source,\n diagnostics: reported([...findings, ...remaining, ...refusals]).sort(sortDiagnostics),\n ...(scope ? { scope } : {}),\n };\n }\n if (seen.has(output))\n return unchanged(\n `Formatting by ${listed(applied)} oscillates; the document was left unchanged.`,\n );\n seen.add(output);\n }\n return unchanged(\n `Formatting by ${listed(applied)} did not converge in eight passes; the document was left unchanged.`,\n );\n } catch (error) {\n if (hosted.errors.has(error)) throw error;\n return unchanged(error instanceof Error ? error.message : String(error));\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `value`, with every object and list that it holds, frozen: a table that the
|
|
3
|
+
* package exports is shared by every caller in the process, and a change that
|
|
4
|
+
* one of them made would reach all the others. Functions are left as they are.
|
|
5
|
+
*/
|
|
6
|
+
export declare function deepFreeze<T>(value: T, seen?: Set<object>): T;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `value`, with every object and list that it holds, frozen: a table that the
|
|
3
|
+
* package exports is shared by every caller in the process, and a change that
|
|
4
|
+
* one of them made would reach all the others. Functions are left as they are.
|
|
5
|
+
*/
|
|
6
|
+
export function deepFreeze(value, seen = new Set()) {
|
|
7
|
+
if (value && typeof value === "object" && !seen.has(value)) {
|
|
8
|
+
seen.add(value);
|
|
9
|
+
Object.freeze(value);
|
|
10
|
+
for (const key of Reflect.ownKeys(value))
|
|
11
|
+
deepFreeze(value[key], seen);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=frozen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frozen.js","sourceRoot":"","sources":["../../src/core/frozen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAI,KAAQ,EAAE,OAAO,IAAI,GAAG,EAAU;IAC9D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACtC,UAAU,CAAE,KAAsC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/**\n * `value`, with every object and list that it holds, frozen: a table that the\n * package exports is shared by every caller in the process, and a change that\n * one of them made would reach all the others. Functions are left as they are.\n */\nexport function deepFreeze<T>(value: T, seen = new Set<object>()): T {\n if (value && typeof value === \"object\" && !seen.has(value)) {\n seen.add(value);\n Object.freeze(value);\n for (const key of Reflect.ownKeys(value))\n deepFreeze((value as Record<PropertyKey, unknown>)[key], seen);\n }\n return value;\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Root } from "mdast";
|
|
2
|
+
import type { Edit, SourceRange } from "./types.js";
|
|
3
|
+
/** Stops with an error for ranges that are not half-open offsets into `source`. */
|
|
4
|
+
export declare function checkRanges(ranges: readonly SourceRange[], source: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Where processing is limited to for `ranges`: each range together with the
|
|
7
|
+
* scope of the leaf blocks that it touches, sorted, with overlapping and
|
|
8
|
+
* adjoining parts joined. A non-empty range touches a block whose lines it
|
|
9
|
+
* overlaps, and an empty one, a position, the block whose lines hold it. A
|
|
10
|
+
* range that touches no block, such as one in a run of blank lines, selects
|
|
11
|
+
* nothing.
|
|
12
|
+
*/
|
|
13
|
+
export declare function widen(tree: Root, source: string, ranges: readonly SourceRange[]): SourceRange[];
|
|
14
|
+
/** Whether a position lies in the scope; the end of a part still belongs to it. */
|
|
15
|
+
export declare function covers(scope: readonly SourceRange[], at: number): boolean;
|
|
16
|
+
/** Whether an edit lies wholly in one part of the scope. */
|
|
17
|
+
export declare function holds(scope: readonly SourceRange[], edit: Edit): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* The scope after `edits`, which all lie in it and are sorted and free of
|
|
20
|
+
* duplicates, were applied: each part grows or shrinks by the edits in it and
|
|
21
|
+
* moves by those before it.
|
|
22
|
+
*/
|
|
23
|
+
export declare function moved(scope: readonly SourceRange[], edits: readonly Edit[]): SourceRange[];
|
|
24
|
+
/**
|
|
25
|
+
* Ranges in the positions of a text that has `by` more characters in front,
|
|
26
|
+
* or fewer for a negative `by`. A position in the removed part becomes 0, and
|
|
27
|
+
* a non-empty range that lies wholly in it is dropped: it selected nothing of
|
|
28
|
+
* the rest, and as an empty range it would select the first block.
|
|
29
|
+
*/
|
|
30
|
+
export declare function shifted(ranges: readonly SourceRange[], by: number): SourceRange[];
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { range } from "../syntax/parse.js";
|
|
2
|
+
/**
|
|
3
|
+
* The nodes whose children are blocks of their own. Every other child of one
|
|
4
|
+
* of them is a leaf block, such as a paragraph, heading, table, or code block,
|
|
5
|
+
* and is selected as a whole.
|
|
6
|
+
*/
|
|
7
|
+
const containers = new Set([
|
|
8
|
+
"root",
|
|
9
|
+
"blockquote",
|
|
10
|
+
"list",
|
|
11
|
+
"listItem",
|
|
12
|
+
"footnoteDefinition",
|
|
13
|
+
]);
|
|
14
|
+
/** Stops with an error for ranges that are not half-open offsets into `source`. */
|
|
15
|
+
export function checkRanges(ranges, source) {
|
|
16
|
+
for (const item of ranges)
|
|
17
|
+
if (!Number.isInteger(item.start) ||
|
|
18
|
+
!Number.isInteger(item.end) ||
|
|
19
|
+
item.start < 0 ||
|
|
20
|
+
item.end < item.start ||
|
|
21
|
+
item.end > source.length)
|
|
22
|
+
throw new Error(`Invalid range ${JSON.stringify({ start: item.start, end: item.end })}: a range needs integer offsets with 0 <= start <= end <= ${source.length}.`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The leaf blocks of a document, in the order of its source; they do not
|
|
26
|
+
* overlap. A block's lines begin with what stands before it on its first
|
|
27
|
+
* line, such as a list item's marker or a quote's `>`, and end with the rest
|
|
28
|
+
* of its last line. Its scope adds the line breaks next to those lines, where
|
|
29
|
+
* the spacing between it and its neighbors is edited.
|
|
30
|
+
*/
|
|
31
|
+
function leafBlocks(tree, source) {
|
|
32
|
+
const blocks = [];
|
|
33
|
+
const visit = (node) => {
|
|
34
|
+
if (!("children" in node))
|
|
35
|
+
return;
|
|
36
|
+
for (const child of node.children)
|
|
37
|
+
if (containers.has(child.type))
|
|
38
|
+
visit(child);
|
|
39
|
+
else {
|
|
40
|
+
let [start, end] = range(child);
|
|
41
|
+
while (start > 0 && source[start - 1] !== "\n" && source[start - 1] !== "\r")
|
|
42
|
+
start--;
|
|
43
|
+
while (end < source.length && source[end] !== "\n" && source[end] !== "\r")
|
|
44
|
+
end++;
|
|
45
|
+
const before = source.endsWith("\r\n", start) ? 2 : start > 0 ? 1 : 0;
|
|
46
|
+
const after = source.startsWith("\r\n", end) ? 2 : end < source.length ? 1 : 0;
|
|
47
|
+
blocks.push({ lines: [start, end], scope: [start - before, end + after] });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
visit(tree);
|
|
51
|
+
return blocks;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Where processing is limited to for `ranges`: each range together with the
|
|
55
|
+
* scope of the leaf blocks that it touches, sorted, with overlapping and
|
|
56
|
+
* adjoining parts joined. A non-empty range touches a block whose lines it
|
|
57
|
+
* overlaps, and an empty one, a position, the block whose lines hold it. A
|
|
58
|
+
* range that touches no block, such as one in a run of blank lines, selects
|
|
59
|
+
* nothing.
|
|
60
|
+
*/
|
|
61
|
+
export function widen(tree, source, ranges) {
|
|
62
|
+
const blocks = leafBlocks(tree, source);
|
|
63
|
+
const widened = [];
|
|
64
|
+
for (const { start, end } of ranges) {
|
|
65
|
+
const touched = blocks.filter(({ lines: [from, to] }) => start === end ? from <= start && start <= to : start < to && end > from);
|
|
66
|
+
if (!touched.length)
|
|
67
|
+
continue;
|
|
68
|
+
widened.push({
|
|
69
|
+
start: Math.min(start, touched[0].scope[0]),
|
|
70
|
+
end: Math.max(end, touched[touched.length - 1].scope[1]),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
widened.sort((a, b) => a.start - b.start);
|
|
74
|
+
const joined = [];
|
|
75
|
+
for (const part of widened) {
|
|
76
|
+
const last = joined[joined.length - 1];
|
|
77
|
+
if (last && part.start <= last.end)
|
|
78
|
+
last.end = Math.max(last.end, part.end);
|
|
79
|
+
else
|
|
80
|
+
joined.push({ ...part });
|
|
81
|
+
}
|
|
82
|
+
return joined;
|
|
83
|
+
}
|
|
84
|
+
/** Whether a position lies in the scope; the end of a part still belongs to it. */
|
|
85
|
+
export function covers(scope, at) {
|
|
86
|
+
return scope.some((part) => part.start <= at && at <= part.end);
|
|
87
|
+
}
|
|
88
|
+
/** Whether an edit lies wholly in one part of the scope. */
|
|
89
|
+
export function holds(scope, edit) {
|
|
90
|
+
return scope.some((part) => part.start <= edit.start && edit.end <= part.end);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The scope after `edits`, which all lie in it and are sorted and free of
|
|
94
|
+
* duplicates, were applied: each part grows or shrinks by the edits in it and
|
|
95
|
+
* moves by those before it.
|
|
96
|
+
*/
|
|
97
|
+
export function moved(scope, edits) {
|
|
98
|
+
let shift = 0;
|
|
99
|
+
let next = 0;
|
|
100
|
+
return scope.map((part) => {
|
|
101
|
+
let change = 0;
|
|
102
|
+
for (; next < edits.length && edits[next].end <= part.end; next++) {
|
|
103
|
+
const edit = edits[next];
|
|
104
|
+
change += edit.text.length - (edit.end - edit.start);
|
|
105
|
+
}
|
|
106
|
+
const result = { start: part.start + shift, end: part.end + shift + change };
|
|
107
|
+
shift += change;
|
|
108
|
+
return result;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Ranges in the positions of a text that has `by` more characters in front,
|
|
113
|
+
* or fewer for a negative `by`. A position in the removed part becomes 0, and
|
|
114
|
+
* a non-empty range that lies wholly in it is dropped: it selected nothing of
|
|
115
|
+
* the rest, and as an empty range it would select the first block.
|
|
116
|
+
*/
|
|
117
|
+
export function shifted(ranges, by) {
|
|
118
|
+
return ranges.flatMap((part) => by < 0 && part.start < part.end && part.end <= -by
|
|
119
|
+
? []
|
|
120
|
+
: [{ start: Math.max(0, part.start + by), end: Math.max(0, part.end + by) }]);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nodes, Root } from \"mdast\";\nimport { range } from \"../syntax/parse.js\";\nimport type { Edit, SourceRange } from \"./types.js\";\n\n/**\n * The nodes whose children are blocks of their own. Every other child of one\n * of them is a leaf block, such as a paragraph, heading, table, or code block,\n * and is selected as a whole.\n */\nconst containers = new Set<Nodes[\"type\"]>([\n \"root\",\n \"blockquote\",\n \"list\",\n \"listItem\",\n \"footnoteDefinition\",\n]);\n\n/** Stops with an error for ranges that are not half-open offsets into `source`. */\nexport function checkRanges(ranges: readonly SourceRange[], source: string): void {\n for (const item of ranges)\n if (\n !Number.isInteger(item.start) ||\n !Number.isInteger(item.end) ||\n item.start < 0 ||\n item.end < item.start ||\n item.end > source.length\n )\n throw new Error(\n `Invalid range ${JSON.stringify({ start: item.start, end: item.end })}: a range needs integer offsets with 0 <= start <= end <= ${source.length}.`,\n );\n}\n\n/** A leaf block's whole lines, and the same with the line breaks before and after them. */\ninterface Block {\n lines: [number, number];\n scope: [number, number];\n}\n/**\n * The leaf blocks of a document, in the order of its source; they do not\n * overlap. A block's lines begin with what stands before it on its first\n * line, such as a list item's marker or a quote's `>`, and end with the rest\n * of its last line. Its scope adds the line breaks next to those lines, where\n * the spacing between it and its neighbors is edited.\n */\nfunction leafBlocks(tree: Root, source: string): Block[] {\n const blocks: Block[] = [];\n const visit = (node: Nodes) => {\n if (!(\"children\" in node)) return;\n for (const child of node.children)\n if (containers.has(child.type)) visit(child);\n else {\n let [start, end] = range(child);\n while (start > 0 && source[start - 1] !== \"\\n\" && source[start - 1] !== \"\\r\") start--;\n while (end < source.length && source[end] !== \"\\n\" && source[end] !== \"\\r\") end++;\n const before = source.endsWith(\"\\r\\n\", start) ? 2 : start > 0 ? 1 : 0;\n const after = source.startsWith(\"\\r\\n\", end) ? 2 : end < source.length ? 1 : 0;\n blocks.push({ lines: [start, end], scope: [start - before, end + after] });\n }\n };\n visit(tree);\n return blocks;\n}\n\n/**\n * Where processing is limited to for `ranges`: each range together with the\n * scope of the leaf blocks that it touches, sorted, with overlapping and\n * adjoining parts joined. A non-empty range touches a block whose lines it\n * overlaps, and an empty one, a position, the block whose lines hold it. A\n * range that touches no block, such as one in a run of blank lines, selects\n * nothing.\n */\nexport function widen(tree: Root, source: string, ranges: readonly SourceRange[]): SourceRange[] {\n const blocks = leafBlocks(tree, source);\n const widened: SourceRange[] = [];\n for (const { start, end } of ranges) {\n const touched = blocks.filter(({ lines: [from, to] }) =>\n start === end ? from <= start && start <= to : start < to && end > from,\n );\n if (!touched.length) continue;\n widened.push({\n start: Math.min(start, touched[0]!.scope[0]),\n end: Math.max(end, touched[touched.length - 1]!.scope[1]),\n });\n }\n widened.sort((a, b) => a.start - b.start);\n const joined: SourceRange[] = [];\n for (const part of widened) {\n const last = joined[joined.length - 1];\n if (last && part.start <= last.end) last.end = Math.max(last.end, part.end);\n else joined.push({ ...part });\n }\n return joined;\n}\n\n/** Whether a position lies in the scope; the end of a part still belongs to it. */\nexport function covers(scope: readonly SourceRange[], at: number): boolean {\n return scope.some((part) => part.start <= at && at <= part.end);\n}\n\n/** Whether an edit lies wholly in one part of the scope. */\nexport function holds(scope: readonly SourceRange[], edit: Edit): boolean {\n return scope.some((part) => part.start <= edit.start && edit.end <= part.end);\n}\n\n/**\n * The scope after `edits`, which all lie in it and are sorted and free of\n * duplicates, were applied: each part grows or shrinks by the edits in it and\n * moves by those before it.\n */\nexport function moved(scope: readonly SourceRange[], edits: readonly Edit[]): SourceRange[] {\n let shift = 0;\n let next = 0;\n return scope.map((part) => {\n let change = 0;\n for (; next < edits.length && edits[next]!.end <= part.end; next++) {\n const edit = edits[next]!;\n change += edit.text.length - (edit.end - edit.start);\n }\n const result = { start: part.start + shift, end: part.end + shift + change };\n shift += change;\n return result;\n });\n}\n\n/**\n * Ranges in the positions of a text that has `by` more characters in front,\n * or fewer for a negative `by`. A position in the removed part becomes 0, and\n * a non-empty range that lies wholly in it is dropped: it selected nothing of\n * the rest, and as an empty range it would select the first block.\n */\nexport function shifted(ranges: readonly SourceRange[], by: number): SourceRange[] {\n return ranges.flatMap((part) =>\n by < 0 && part.start < part.end && part.end <= -by\n ? []\n : [{ start: Math.max(0, part.start + by), end: Math.max(0, part.end + by) }],\n );\n}\n"]}
|