punctilio 3.9.2 → 3.10.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/.pre-commit-hooks.yaml +27 -0
- package/README.md +11 -1
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +324 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashes.d.ts +2 -1
- package/dist/dashes.d.ts.map +1 -1
- package/dist/dashes.js +1 -0
- package/dist/dashes.js.map +1 -1
- package/dist/html.d.ts +44 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +66 -0
- package/dist/html.js.map +1 -0
- package/dist/prettier-plugin.d.ts +18 -0
- package/dist/prettier-plugin.d.ts.map +1 -0
- package/dist/prettier-plugin.js +41 -0
- package/dist/prettier-plugin.js.map +1 -0
- package/dist/quotes.d.ts +2 -1
- package/dist/quotes.d.ts.map +1 -1
- package/dist/quotes.js +1 -0
- package/dist/quotes.js.map +1 -1
- package/package.json +25 -2
- package/src/cli.ts +393 -0
- package/src/dashes.ts +2 -1
- package/src/html.ts +92 -0
- package/src/prettier-plugin.ts +49 -0
- package/src/quotes.ts +2 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
- id: punctilio
|
|
2
|
+
name: punctilio
|
|
3
|
+
description: Apply punctilio typography transformations to Markdown and HTML files.
|
|
4
|
+
entry: punctilio
|
|
5
|
+
language: node
|
|
6
|
+
types_or: [markdown, html]
|
|
7
|
+
additional_dependencies:
|
|
8
|
+
- unified@^11.0.0
|
|
9
|
+
- remark-parse@^11.0.0
|
|
10
|
+
- remark-stringify@^11.0.0
|
|
11
|
+
- remark-gfm@^4.0.0
|
|
12
|
+
- rehype-parse@^9.0.0
|
|
13
|
+
- rehype-stringify@^10.0.0
|
|
14
|
+
|
|
15
|
+
- id: punctilio-check
|
|
16
|
+
name: punctilio (check)
|
|
17
|
+
description: Fail if punctilio would change any Markdown or HTML file (no writes).
|
|
18
|
+
entry: punctilio --check
|
|
19
|
+
language: node
|
|
20
|
+
types_or: [markdown, html]
|
|
21
|
+
additional_dependencies:
|
|
22
|
+
- unified@^11.0.0
|
|
23
|
+
- remark-parse@^11.0.0
|
|
24
|
+
- remark-stringify@^11.0.0
|
|
25
|
+
- remark-gfm@^4.0.0
|
|
26
|
+
- rehype-parse@^9.0.0
|
|
27
|
+
- rehype-stringify@^10.0.0
|
package/README.md
CHANGED
|
@@ -160,10 +160,20 @@ rehypePunctilio({
|
|
|
160
160
|
});
|
|
161
161
|
```
|
|
162
162
|
|
|
163
|
+
## CLI and editor integration
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
punctilio README.md 'docs/**/*.md' # format in place; globs expand internally
|
|
167
|
+
punctilio --check README.md # exit 1 if it would change anything
|
|
168
|
+
echo '"Hi" -- there' | punctilio - --type md
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Subsequent runs skip files unchanged since the previous invocation via an incremental cache at `node_modules/.cache/punctilio/cache.json` (use `--no-cache` to disable, `--cache-location <path>` to override). Config is loaded from `.punctiliorc[.json|.yaml|.js]`, `punctilio.config.js`, or a `"punctilio"` key in `package.json` (via [`cosmiconfig`](https://github.com/cosmiconfig/cosmiconfig)); CLI flags override. A `.punctilioignore` (gitignore syntax) in cwd excludes matching files. A `.pre-commit-hooks.yaml` ships in the package for [pre-commit](https://pre-commit.com) integration. For prettier users, add `punctilio/prettier-plugin` to `.prettierrc` `plugins`; it reads the same `.punctiliorc`.
|
|
172
|
+
|
|
163
173
|
|
|
164
174
|
## Notes
|
|
165
175
|
|
|
166
|
-
- Fully general prime mark conversion (e.g. <span class="no-formatting">5'10" → 5′10″</span>) requires semantic understanding to distinguish from closing quotes (e.g. `"Term 1"` should produce closing quotes). `punctilio` tracks quote balance to
|
|
176
|
+
- Fully general prime mark conversion (e.g. <span class="no-formatting">5'10" → 5′10″</span>) requires semantic understanding to distinguish from closing quotes (e.g. `"Term 1"` should produce closing quotes). `punctilio` heuristically tracks quote balance to distinguish a prime after a number from a closing quote (`"Term 1"`). Simpler libraries like `tipograph` 0.7.4 make more mistakes here.
|
|
167
177
|
- The `american` style follows the [Chicago Manual of Style](https://www.chicagomanualofstyle.org/):
|
|
168
178
|
- Periods and commas go inside quotation marks (“Hello,” she said.)
|
|
169
179
|
- Unspaced em-dashes between words (word—word)
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Command-line entry point: format Markdown and HTML files in place,
|
|
4
|
+
* or check whether they would be reformatted (for use as a pre-commit hook).
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
interface CliIO {
|
|
9
|
+
stdin: AsyncIterable<string | Buffer>;
|
|
10
|
+
stdout: NodeJS.WritableStream;
|
|
11
|
+
stderr: NodeJS.WritableStream;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Runs the CLI with the given arguments and I/O streams.
|
|
15
|
+
*
|
|
16
|
+
* @returns Exit code: 0 if no changes (or all changes written),
|
|
17
|
+
* 1 if `--check` saw a file that would change, 2 for usage errors.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runCli(args: string[], io: CliIO): Promise<number>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAqBH,UAAU,KAAK;IACb,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IACrC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B;AAyOD;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBvE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Command-line entry point: format Markdown and HTML files in place,
|
|
4
|
+
* or check whether they would be reformatted (for use as a pre-commit hook).
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
11
|
+
import { dirname, extname, join, relative, resolve } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { Command, CommanderError, Option } from "commander";
|
|
14
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
15
|
+
import ignore from "ignore";
|
|
16
|
+
import { glob } from "tinyglobby";
|
|
17
|
+
import { transformMarkdown } from "./markdown.js";
|
|
18
|
+
import { transformHtml } from "./html.js";
|
|
19
|
+
import { PUNCTUATION_STYLES } from "./quotes.js";
|
|
20
|
+
import { DASH_STYLES } from "./dashes.js";
|
|
21
|
+
class UsageError extends Error {
|
|
22
|
+
}
|
|
23
|
+
const FILE_TYPES = ["md", "html"];
|
|
24
|
+
const EMPHASIS_MARKERS = ["*", "_"];
|
|
25
|
+
const BULLET_MARKERS = ["-", "*", "+"];
|
|
26
|
+
const RULE_MARKERS = ["-", "*", "_"];
|
|
27
|
+
const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown"]);
|
|
28
|
+
const HTML_EXTENSIONS = new Set([".html", ".htm"]);
|
|
29
|
+
function buildProgram(version, io) {
|
|
30
|
+
return new Command()
|
|
31
|
+
.name("punctilio")
|
|
32
|
+
.description("Apply typographic improvements to Markdown and HTML files.")
|
|
33
|
+
.version(version, "-V, --version", "show version")
|
|
34
|
+
.argument("[files...]", "files to format (pass '-' to read from stdin)")
|
|
35
|
+
.option("--check", "exit 1 if any file would change; write nothing")
|
|
36
|
+
.option("--config <path>", "path to a punctilio config file (otherwise auto-discovered)")
|
|
37
|
+
.option("--no-config", "ignore any auto-discovered config file")
|
|
38
|
+
.option("--ignore-path <path>", "path to an ignore file (otherwise .punctilioignore in cwd)")
|
|
39
|
+
.option("--no-cache", "disable the incremental cache (default location node_modules/.cache/punctilio/cache.json)")
|
|
40
|
+
.option("--cache-location <path>", "override the cache file location")
|
|
41
|
+
.option("--stdin-filepath <path>", "treat stdin as if it were this filename (infers type from extension)")
|
|
42
|
+
.addOption(new Option("--type <type>", "force file type (otherwise inferred from extension)").choices(FILE_TYPES))
|
|
43
|
+
.addOption(new Option("--punctuation-style <style>", "quote and punctuation style").choices(PUNCTUATION_STYLES))
|
|
44
|
+
.addOption(new Option("--dash-style <style>", "dash style").choices(DASH_STYLES))
|
|
45
|
+
.option("--no-symbols", "disable symbol transforms (ellipsis, ×, ©, etc.)")
|
|
46
|
+
.option("--no-nbsp", "disable non-breaking space insertion")
|
|
47
|
+
.option("--no-collapse-spaces", "preserve runs of consecutive spaces")
|
|
48
|
+
.option("--no-arrows", "disable -> → arrow transforms")
|
|
49
|
+
.option("--fractions", "enable 1/2 → ½")
|
|
50
|
+
.option("--degrees", "enable 20 C → 20 °C")
|
|
51
|
+
.option("--superscript", "enable 1st → 1ˢᵗ")
|
|
52
|
+
.option("--ligatures", "enable !? → ⁉")
|
|
53
|
+
.addOption(new Option("--emphasis-marker <char>", "markdown emphasis character").choices(EMPHASIS_MARKERS))
|
|
54
|
+
.addOption(new Option("--strong-marker <char>", "markdown strong emphasis character").choices(EMPHASIS_MARKERS))
|
|
55
|
+
.addOption(new Option("--bullet-marker <char>", "markdown list bullet character").choices(BULLET_MARKERS))
|
|
56
|
+
.addOption(new Option("--rule-marker <char>", "markdown thematic break character").choices(RULE_MARKERS))
|
|
57
|
+
.option("--skip-tag <tag...>", "HTML tags whose contents are left alone (repeatable)")
|
|
58
|
+
.option("--skip-class <class...>", "HTML class names whose elements are skipped (repeatable)")
|
|
59
|
+
.option("--no-fragment", "parse input as a full HTML document")
|
|
60
|
+
.exitOverride()
|
|
61
|
+
.configureOutput({
|
|
62
|
+
writeOut: (str) => { io.stdout.write(str); },
|
|
63
|
+
writeErr: (str) => { io.stderr.write(str); },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function inferFileType(path, override) {
|
|
67
|
+
if (override !== undefined)
|
|
68
|
+
return override;
|
|
69
|
+
const ext = extname(path).toLowerCase();
|
|
70
|
+
if (MARKDOWN_EXTENSIONS.has(ext))
|
|
71
|
+
return "md";
|
|
72
|
+
if (HTML_EXTENSIONS.has(ext))
|
|
73
|
+
return "html";
|
|
74
|
+
throw new UsageError(`Cannot infer file type from extension "${ext}" for ${path}. Pass --type md|html.`);
|
|
75
|
+
}
|
|
76
|
+
// Config keys must match library option names (punctuationStyle, skipTags, …),
|
|
77
|
+
// not the kebab-cased CLI flag names.
|
|
78
|
+
async function loadConfig(cwd, configPath, disabled) {
|
|
79
|
+
if (disabled)
|
|
80
|
+
return {};
|
|
81
|
+
const explorer = cosmiconfig("punctilio");
|
|
82
|
+
const result = configPath ? await explorer.load(configPath) : await explorer.search(cwd);
|
|
83
|
+
if (!result || result.isEmpty)
|
|
84
|
+
return {};
|
|
85
|
+
return result.config;
|
|
86
|
+
}
|
|
87
|
+
function loadIgnore(cwd, ignorePath) {
|
|
88
|
+
const ig = ignore();
|
|
89
|
+
const effective = ignorePath ?? join(cwd, ".punctilioignore");
|
|
90
|
+
if (existsSync(effective))
|
|
91
|
+
ig.add(readFileSync(effective, "utf8"));
|
|
92
|
+
return ig;
|
|
93
|
+
}
|
|
94
|
+
function isGlobPattern(pattern) {
|
|
95
|
+
return /[*?[\]{}]/.test(pattern);
|
|
96
|
+
}
|
|
97
|
+
// Non-glob positionals pass through as literal paths so they error loudly
|
|
98
|
+
// if missing, matching the prior behavior of `punctilio file.md`.
|
|
99
|
+
async function discoverFiles(patterns, cwd, ig) {
|
|
100
|
+
const literals = patterns.filter((p) => !isGlobPattern(p));
|
|
101
|
+
const globs = patterns.filter(isGlobPattern);
|
|
102
|
+
const expanded = globs.length > 0
|
|
103
|
+
? await glob(globs, { cwd, absolute: true, onlyFiles: true })
|
|
104
|
+
: [];
|
|
105
|
+
const all = [...literals.map((p) => resolve(cwd, p)), ...expanded];
|
|
106
|
+
return all.filter((file) => {
|
|
107
|
+
const rel = relative(cwd, file);
|
|
108
|
+
return rel.startsWith("..") || !ig.ignores(rel);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const DEFAULT_CACHE_LOCATION = join("node_modules", ".cache", "punctilio", "cache.json");
|
|
112
|
+
function hashString(s) {
|
|
113
|
+
return createHash("sha256").update(s).digest("hex").slice(0, 16);
|
|
114
|
+
}
|
|
115
|
+
function hashOptions(opts) {
|
|
116
|
+
const stable = Object.entries(opts)
|
|
117
|
+
.filter(([, v]) => v !== undefined)
|
|
118
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
119
|
+
return hashString(JSON.stringify(stable));
|
|
120
|
+
}
|
|
121
|
+
function loadCache(location) {
|
|
122
|
+
if (!existsSync(location))
|
|
123
|
+
return { files: {} };
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(readFileSync(location, "utf8"));
|
|
126
|
+
return parsed.files ? parsed : { files: {} };
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return { files: {} };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function saveCache(location, cache) {
|
|
133
|
+
mkdirSync(dirname(location), { recursive: true });
|
|
134
|
+
writeFileSync(location, JSON.stringify(cache));
|
|
135
|
+
}
|
|
136
|
+
function buildOptions(flags) {
|
|
137
|
+
const opts = {};
|
|
138
|
+
if (flags.punctuationStyle)
|
|
139
|
+
opts.punctuationStyle = flags.punctuationStyle;
|
|
140
|
+
if (flags.dashStyle)
|
|
141
|
+
opts.dashStyle = flags.dashStyle;
|
|
142
|
+
if (flags.symbols === false)
|
|
143
|
+
opts.symbols = false;
|
|
144
|
+
if (flags.nbsp === false)
|
|
145
|
+
opts.nbsp = false;
|
|
146
|
+
if (flags.collapseSpaces === false)
|
|
147
|
+
opts.collapseSpaces = false;
|
|
148
|
+
if (flags.arrows === false)
|
|
149
|
+
opts.includeArrows = false;
|
|
150
|
+
if (flags.fractions)
|
|
151
|
+
opts.fractions = true;
|
|
152
|
+
if (flags.degrees)
|
|
153
|
+
opts.degrees = true;
|
|
154
|
+
if (flags.superscript)
|
|
155
|
+
opts.superscript = true;
|
|
156
|
+
if (flags.ligatures)
|
|
157
|
+
opts.ligatures = true;
|
|
158
|
+
if (flags.emphasisMarker)
|
|
159
|
+
opts.emphasisMarker = flags.emphasisMarker;
|
|
160
|
+
if (flags.strongMarker)
|
|
161
|
+
opts.strongMarker = flags.strongMarker;
|
|
162
|
+
if (flags.bulletMarker)
|
|
163
|
+
opts.bulletMarker = flags.bulletMarker;
|
|
164
|
+
if (flags.ruleMarker)
|
|
165
|
+
opts.ruleMarker = flags.ruleMarker;
|
|
166
|
+
if (flags.skipTag)
|
|
167
|
+
opts.skipTags = flags.skipTag;
|
|
168
|
+
if (flags.skipClass)
|
|
169
|
+
opts.skipClasses = flags.skipClass;
|
|
170
|
+
if (flags.fragment === false)
|
|
171
|
+
opts.fragment = false;
|
|
172
|
+
return opts;
|
|
173
|
+
}
|
|
174
|
+
async function transformContent(input, type, opts) {
|
|
175
|
+
return type === "md" ? transformMarkdown(input, opts) : transformHtml(input, opts);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Preserves whether the original file ends with a trailing newline.
|
|
179
|
+
* The unified pipelines for Markdown and HTML both unconditionally append
|
|
180
|
+
* one, so without this adjustment every file lacking a trailing newline
|
|
181
|
+
* would always appear as needing a rewrite.
|
|
182
|
+
*/
|
|
183
|
+
function matchTrailingNewline(original, formatted) {
|
|
184
|
+
const originalHas = original.endsWith("\n");
|
|
185
|
+
const formattedHas = formatted.endsWith("\n");
|
|
186
|
+
if (originalHas === formattedHas)
|
|
187
|
+
return formatted;
|
|
188
|
+
if (originalHas)
|
|
189
|
+
return formatted + "\n";
|
|
190
|
+
return formatted.replace(/\n$/, "");
|
|
191
|
+
}
|
|
192
|
+
async function readStdin(stdin) {
|
|
193
|
+
const chunks = [];
|
|
194
|
+
for await (const chunk of stdin) {
|
|
195
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
196
|
+
}
|
|
197
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
198
|
+
}
|
|
199
|
+
async function readPackageVersion() {
|
|
200
|
+
const pkgPath = new URL("../package.json", import.meta.url);
|
|
201
|
+
/* istanbul ignore next -- the catch only fires when package.json is missing or unreadable */
|
|
202
|
+
try {
|
|
203
|
+
const raw = await readFile(pkgPath, "utf8");
|
|
204
|
+
return JSON.parse(raw).version ?? "unknown";
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return "unknown";
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Runs the CLI with the given arguments and I/O streams.
|
|
212
|
+
*
|
|
213
|
+
* @returns Exit code: 0 if no changes (or all changes written),
|
|
214
|
+
* 1 if `--check` saw a file that would change, 2 for usage errors.
|
|
215
|
+
*/
|
|
216
|
+
export async function runCli(args, io) {
|
|
217
|
+
const version = await readPackageVersion();
|
|
218
|
+
const program = buildProgram(version, io);
|
|
219
|
+
try {
|
|
220
|
+
program.parse(args, { from: "user" });
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
/* istanbul ignore if -- commander only throws CommanderError from parse */
|
|
224
|
+
if (!(err instanceof CommanderError))
|
|
225
|
+
throw err;
|
|
226
|
+
if (err.code === "commander.helpDisplayed" || err.code === "commander.version")
|
|
227
|
+
return 0;
|
|
228
|
+
return 2;
|
|
229
|
+
}
|
|
230
|
+
const flags = program.opts();
|
|
231
|
+
const positionals = program.args;
|
|
232
|
+
try {
|
|
233
|
+
return await runValidated(flags, positionals, io, program, version);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
if (err instanceof UsageError) {
|
|
237
|
+
io.stderr.write(`Error: ${err.message}\n`);
|
|
238
|
+
return 2;
|
|
239
|
+
}
|
|
240
|
+
throw err;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function readsStdin(positionals, flags) {
|
|
244
|
+
if (positionals.includes("-"))
|
|
245
|
+
return true;
|
|
246
|
+
return flags.stdinFilepath !== undefined && positionals.length === 0;
|
|
247
|
+
}
|
|
248
|
+
async function runValidated(flags, positionals, io, program, version) {
|
|
249
|
+
const cwd = process.cwd();
|
|
250
|
+
const config = await loadConfig(cwd, typeof flags.config === "string" ? flags.config : undefined, flags.config === false);
|
|
251
|
+
const opts = { ...config, ...buildOptions(flags) };
|
|
252
|
+
const check = flags.check ?? false;
|
|
253
|
+
if (readsStdin(positionals, flags)) {
|
|
254
|
+
const fileArgs = positionals.filter((p) => p !== "-");
|
|
255
|
+
if (fileArgs.length > 0) {
|
|
256
|
+
throw new UsageError("'-' cannot be combined with file arguments.");
|
|
257
|
+
}
|
|
258
|
+
const type = flags.type ?? (flags.stdinFilepath !== undefined ? inferFileType(flags.stdinFilepath) : undefined);
|
|
259
|
+
if (type === undefined) {
|
|
260
|
+
throw new UsageError("Reading from stdin requires --type md|html or --stdin-filepath <path>.");
|
|
261
|
+
}
|
|
262
|
+
const input = await readStdin(io.stdin);
|
|
263
|
+
const output = matchTrailingNewline(input, await transformContent(input, type, opts));
|
|
264
|
+
if (check)
|
|
265
|
+
return input === output ? 0 : 1;
|
|
266
|
+
io.stdout.write(output);
|
|
267
|
+
return 0;
|
|
268
|
+
}
|
|
269
|
+
if (positionals.length === 0) {
|
|
270
|
+
io.stderr.write(program.helpInformation());
|
|
271
|
+
return 2;
|
|
272
|
+
}
|
|
273
|
+
const ig = loadIgnore(cwd, flags.ignorePath);
|
|
274
|
+
const files = await discoverFiles(positionals, cwd, ig);
|
|
275
|
+
const cacheLocation = flags.cache === false
|
|
276
|
+
? undefined
|
|
277
|
+
: resolve(cwd, flags.cacheLocation ?? DEFAULT_CACHE_LOCATION);
|
|
278
|
+
const cache = cacheLocation ? loadCache(cacheLocation) : undefined;
|
|
279
|
+
const optionsHash = cache ? hashOptions(opts) : "";
|
|
280
|
+
let anyChanged = false;
|
|
281
|
+
for (const path of files) {
|
|
282
|
+
const type = inferFileType(path, flags.type);
|
|
283
|
+
const original = await readFile(path, "utf8");
|
|
284
|
+
if (cache) {
|
|
285
|
+
const entry = cache.files[path];
|
|
286
|
+
if (entry?.contentHash === hashString(original)
|
|
287
|
+
&& entry.optionsHash === optionsHash
|
|
288
|
+
&& entry.version === version)
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const formatted = matchTrailingNewline(original, await transformContent(original, type, opts));
|
|
292
|
+
const unchanged = original === formatted;
|
|
293
|
+
if (!unchanged) {
|
|
294
|
+
anyChanged = true;
|
|
295
|
+
if (check) {
|
|
296
|
+
io.stderr.write(`Would reformat: ${path}\n`);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
await writeFile(path, formatted);
|
|
300
|
+
io.stdout.write(`Reformatted: ${path}\n`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (cache && (unchanged || !check)) {
|
|
304
|
+
cache.files[path] = { contentHash: hashString(formatted), optionsHash, version };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (cacheLocation && cache)
|
|
308
|
+
saveCache(cacheLocation, cache);
|
|
309
|
+
return check && anyChanged ? 1 : 0;
|
|
310
|
+
}
|
|
311
|
+
/* istanbul ignore next -- entry-point bootstrap; logic is covered via runCli */
|
|
312
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
313
|
+
runCli(process.argv.slice(2), {
|
|
314
|
+
stdin: process.stdin,
|
|
315
|
+
stdout: process.stdout,
|
|
316
|
+
stderr: process.stderr,
|
|
317
|
+
})
|
|
318
|
+
.then((code) => process.exit(code))
|
|
319
|
+
.catch((err) => {
|
|
320
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
321
|
+
process.exit(2);
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,MAAuB,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,OAAO,EAAE,iBAAiB,EAAwB,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,aAAa,EAAoB,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAyB,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAA;AAWzD,MAAM,UAAW,SAAQ,KAAK;CAAG;AAEjC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,CAAwC,CAAA;AACxE,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,CAAU,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAC/C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAE7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;AACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAkClD,SAAS,YAAY,CAAC,OAAe,EAAE,EAAS;IAC9C,OAAO,IAAI,OAAO,EAAE;SACjB,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,4DAA4D,CAAC;SACzE,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC;SACjD,QAAQ,CAAC,YAAY,EAAE,+CAA+C,CAAC;SACvE,MAAM,CAAC,SAAS,EAAE,gDAAgD,CAAC;SACnE,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,4DAA4D,CAAC;SAC5F,MAAM,CAAC,YAAY,EAAE,2FAA2F,CAAC;SACjH,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;SACrE,MAAM,CAAC,yBAAyB,EAAE,sEAAsE,CAAC;SACzG,SAAS,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,qDAAqD,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACjH,SAAS,CAAC,IAAI,MAAM,CAAC,6BAA6B,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;SAC/G,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SAChF,MAAM,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAC1E,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,sBAAsB,EAAE,qCAAqC,CAAC;SACrE,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;SACtC,SAAS,CAAC,IAAI,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;SAC1G,SAAS,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;SAC/G,SAAS,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,gCAAgC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;SACzG,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,mCAAmC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SACxG,MAAM,CAAC,qBAAqB,EAAE,sDAAsD,CAAC;SACrF,MAAM,CAAC,yBAAyB,EAAE,0DAA0D,CAAC;SAC7F,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,YAAY,EAAE;SACd,eAAe,CAAC;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;KAC5C,CAAC,CAAA;AACN,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,QAAmB;IACtD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IACvC,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAC3C,MAAM,IAAI,UAAU,CAClB,0CAA0C,GAAG,SAAS,IAAI,wBAAwB,CACnF,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,sCAAsC;AACtC,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,UAA8B,EAC9B,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,EAAE,CAAA;IACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACxC,OAAO,MAAM,CAAC,MAAoB,CAAA;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,UAA8B;IAC7D,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;IACnB,MAAM,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC7D,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAClE,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC;AAED,0EAA0E;AAC1E,kEAAkE;AAClE,KAAK,UAAU,aAAa,CAC1B,QAAkB,EAClB,GAAW,EACX,EAAU;IAEV,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;IAClE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC;AAYD,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AAExF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAU,CAAA;QAClE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,KAAY;IAC/C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,MAAM,IAAI,GAAe,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,gBAAgB;QAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAA;IAC1E,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;IACrD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;QAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;QAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;IACtD,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IAC1C,IAAI,KAAK,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACtC,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IAC9C,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IAC1C,IAAI,KAAK,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAA;IACpE,IAAI,KAAK,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAA;IAC9D,IAAI,KAAK,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAA;IAC9D,IAAI,KAAK,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;IACxD,IAAI,KAAK,CAAC,OAAO;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAA;IAChD,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAA;IACvD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;IACnD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAc,EAAE,IAAgB;IAC7E,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,QAAgB,EAAE,SAAiB;IAC/D,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,WAAW,KAAK,YAAY;QAAE,OAAO,SAAS,CAAA;IAClD,IAAI,WAAW;QAAE,OAAO,SAAS,GAAG,IAAI,CAAA;IACxC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACrC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAqC;IAC5D,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC/C,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3D,6FAA6F;IAC7F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,EAAS;IACpD,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAEzC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,IAAI,CAAC,CAAC,GAAG,YAAY,cAAc,CAAC;YAAE,MAAM,GAAG,CAAA;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB;YAAE,OAAO,CAAC,CAAA;QACxF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAA;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;YAC1C,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,WAAqB,EAAE,KAAkB;IAC3D,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1C,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAA;AACtE,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAkB,EAClB,WAAqB,EACrB,EAAS,EACT,OAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,GAAG,EACH,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC3D,KAAK,CAAC,MAAM,KAAK,KAAK,CACvB,CAAA;IACD,MAAM,IAAI,GAAe,EAAE,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAA;IAElC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;QACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAA;QACrE,CAAC;QACD,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACpG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,wEAAwE,CAAC,CAAA;QAChG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACrF,IAAI,KAAK;YAAE,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAEvD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK;QACzC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAElD,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,KAAK,EAAE,WAAW,KAAK,UAAU,CAAC,QAAQ,CAAC;mBACxC,KAAK,CAAC,WAAW,KAAK,WAAW;mBACjC,KAAK,CAAC,OAAO,KAAK,OAAO;gBAAE,SAAQ;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC9F,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAA;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,UAAU,GAAG,IAAI,CAAA;YACjB,IAAI,KAAK,EAAE,CAAC;gBACV,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;gBAChC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QACD,IAAI,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;QAClF,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,KAAK;QAAE,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAC3D,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACpC,CAAC;AAED,gFAAgF;AAChF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;SACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/dist/dashes.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dash transformation: hyphens → em-dashes, en-dashes, minus signs.
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
4
|
+
export declare const DASH_STYLES: readonly ["american", "british", "none"];
|
|
5
|
+
export type DashStyle = (typeof DASH_STYLES)[number];
|
|
5
6
|
export interface DashOptions {
|
|
6
7
|
/** Boundary marker for HTML element boundaries. Default: "\uE000\uE001" */
|
|
7
8
|
separator?: string;
|
package/dist/dashes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,WAAW,0CAA2C,CAAA;AACnE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAID;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,+BAA0C,CAAA;AAsBpF,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CA2DjF;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAoB/E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAkC5E;AAkFD,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAU7E"}
|
package/dist/dashes.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Dash transformation: hyphens → em-dashes, en-dashes, minus signs.
|
|
3
3
|
*/
|
|
4
4
|
import { UNICODE_SYMBOLS, DEFAULT_SEPARATOR, LATIN_LETTERS, wordBoundaryStart, wordBoundaryEnd, getEscapedSeparator, cachedRegExp } from "./constants.js";
|
|
5
|
+
export const DASH_STYLES = ["american", "british", "none"];
|
|
5
6
|
const { EN_DASH, EM_DASH, MINUS, LEFT_DOUBLE_QUOTE, RIGHT_DOUBLE_QUOTE, LEFT_SINGLE_QUOTE, RIGHT_SINGLE_QUOTE } = UNICODE_SYMBOLS;
|
|
6
7
|
/**
|
|
7
8
|
* Characters that, when preceding a number, prevent it from being
|
package/dist/dashes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"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"}
|
package/dist/html.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience module for HTML-to-HTML typography transformations.
|
|
3
|
+
*
|
|
4
|
+
* Provides a single function that takes HTML input and returns
|
|
5
|
+
* typographically improved HTML output.
|
|
6
|
+
*
|
|
7
|
+
* Requires `unified`, `rehype-parse`, and `rehype-stringify` to be installed.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import { type RehypePunctilioOptions } from "./rehype.js";
|
|
12
|
+
/**
|
|
13
|
+
* Options for the HTML transform pipeline.
|
|
14
|
+
*/
|
|
15
|
+
export interface HtmlOptions extends RehypePunctilioOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Whether to parse the input as an HTML fragment (no implicit `<html>`,
|
|
18
|
+
* `<head>`, or `<body>` wrapping). Set to `false` to parse a complete
|
|
19
|
+
* document. Default: `true`.
|
|
20
|
+
*/
|
|
21
|
+
fragment?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Clears the processor cache. Exported for test isolation only.
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearProcessorCache(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Transforms HTML text with typographic improvements.
|
|
30
|
+
*
|
|
31
|
+
* Parses the input as HTML, applies punctilio typography transformations,
|
|
32
|
+
* and serializes back to HTML. The unified processor pipeline is cached
|
|
33
|
+
* and reused across calls with identical options.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { transformHtml } from 'punctilio/html'
|
|
38
|
+
*
|
|
39
|
+
* await transformHtml('<p>"Hello" -- world</p>')
|
|
40
|
+
* // → '<p>“Hello”—world</p>'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function transformHtml(input: string, options?: HtmlOptions): Promise<string>;
|
|
44
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAE1E;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,sBAAsB;IACzD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
|
package/dist/html.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience module for HTML-to-HTML typography transformations.
|
|
3
|
+
*
|
|
4
|
+
* Provides a single function that takes HTML input and returns
|
|
5
|
+
* typographically improved HTML output.
|
|
6
|
+
*
|
|
7
|
+
* Requires `unified`, `rehype-parse`, and `rehype-stringify` to be installed.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import { unified } from "unified";
|
|
12
|
+
import rehypeParse from "rehype-parse";
|
|
13
|
+
import rehypeStringify from "rehype-stringify";
|
|
14
|
+
import QuickLRU from "quick-lru";
|
|
15
|
+
import { rehypePunctilio } from "./rehype.js";
|
|
16
|
+
function createProcessor(options) {
|
|
17
|
+
const { fragment, ...punctilioOptions } = options;
|
|
18
|
+
return unified()
|
|
19
|
+
.use(rehypeParse, { fragment: fragment ?? true })
|
|
20
|
+
.use(rehypePunctilio, punctilioOptions)
|
|
21
|
+
.use(rehypeStringify);
|
|
22
|
+
}
|
|
23
|
+
const MAX_PROCESSOR_CACHE_SIZE = 8;
|
|
24
|
+
const processorCache = new QuickLRU({
|
|
25
|
+
maxSize: MAX_PROCESSOR_CACHE_SIZE,
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Clears the processor cache. Exported for test isolation only.
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export function clearProcessorCache() {
|
|
32
|
+
processorCache.clear();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Transforms HTML text with typographic improvements.
|
|
36
|
+
*
|
|
37
|
+
* Parses the input as HTML, applies punctilio typography transformations,
|
|
38
|
+
* and serializes back to HTML. The unified processor pipeline is cached
|
|
39
|
+
* and reused across calls with identical options.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { transformHtml } from 'punctilio/html'
|
|
44
|
+
*
|
|
45
|
+
* await transformHtml('<p>"Hello" -- world</p>')
|
|
46
|
+
* // → '<p>“Hello”—world</p>'
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export async function transformHtml(input, options = {}) {
|
|
50
|
+
// Function-valued options aren't JSON-serializable, so the cache key
|
|
51
|
+
// can't distinguish them. Bypass the cache to avoid returning a
|
|
52
|
+
// processor wired to a different shouldSkipText.
|
|
53
|
+
if (typeof options.shouldSkipText === "function") {
|
|
54
|
+
const result = await createProcessor(options).process(input);
|
|
55
|
+
return String(result);
|
|
56
|
+
}
|
|
57
|
+
const optionsKey = JSON.stringify(Object.entries(options).filter(([, v]) => v !== undefined).sort(([a], [b]) => a.localeCompare(b)));
|
|
58
|
+
let processor = processorCache.get(optionsKey);
|
|
59
|
+
if (!processor) {
|
|
60
|
+
processor = createProcessor(options);
|
|
61
|
+
processorCache.set(optionsKey, processor);
|
|
62
|
+
}
|
|
63
|
+
const result = await processor.process(input);
|
|
64
|
+
return String(result);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=html.js.map
|
package/dist/html.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAC9C,OAAO,QAAQ,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,eAAe,EAA+B,MAAM,aAAa,CAAA;AAc1E,SAAS,eAAe,CAAC,OAAoB;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAA;IACjD,OAAO,OAAO,EAAE;SACb,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;SAChD,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACtC,GAAG,CAAC,eAAe,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,wBAAwB,GAAG,CAAC,CAAA;AAElC,MAAM,cAAc,GAAG,IAAI,QAAQ,CAA6C;IAC9E,OAAO,EAAE,wBAAwB;CAClC,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,cAAc,CAAC,KAAK,EAAE,CAAA;AACxB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,UAAuB,EAAE;IAEzB,qEAAqE;IACrE,gEAAgE;IAChE,iDAAiD;IACjD,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAClG,CAAA;IAED,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QACpC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prettier plugin applying punctilio's typographic transforms to Markdown.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```jsonc
|
|
6
|
+
* // .prettierrc
|
|
7
|
+
* { "plugins": ["punctilio/prettier-plugin"] }
|
|
8
|
+
*
|
|
9
|
+
* // .punctiliorc.json (optional)
|
|
10
|
+
* { "punctuationStyle": "british", "skipTags": ["pre", "code"] }
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import type { Plugin } from "prettier";
|
|
16
|
+
declare const plugin: Plugin;
|
|
17
|
+
export default plugin;
|
|
18
|
+
//# sourceMappingURL=prettier-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prettier-plugin.d.ts","sourceRoot":"","sources":["../src/prettier-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,UAAU,CAAA;AAc9C,QAAA,MAAM,MAAM,EAAE,MAcb,CAAA;AAED,eAAe,MAAM,CAAA"}
|