markdown-flavor-detection 0.0.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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/fg-config-resolution.d.ts +39 -0
- package/dist/fg-config-resolution.d.ts.map +1 -0
- package/dist/fg-config-resolution.js +200 -0
- package/dist/fg-config-resolution.js.map +1 -0
- package/dist/fgattributes.d.ts +26 -0
- package/dist/fgattributes.d.ts.map +1 -0
- package/dist/fgattributes.js +126 -0
- package/dist/fgattributes.js.map +1 -0
- package/dist/fgignore.d.ts +8 -0
- package/dist/fgignore.d.ts.map +1 -0
- package/dist/fgignore.js +35 -0
- package/dist/fgignore.js.map +1 -0
- package/dist/flavor-resolution.d.ts +32 -0
- package/dist/flavor-resolution.d.ts.map +1 -0
- package/dist/flavor-resolution.js +56 -0
- package/dist/flavor-resolution.js.map +1 -0
- package/dist/flavors.d.ts +15 -0
- package/dist/flavors.d.ts.map +1 -0
- package/dist/flavors.js +44 -0
- package/dist/flavors.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +13 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +65 -0
- package/dist/node.js.map +1 -0
- package/dist/path-confinement.d.ts +5 -0
- package/dist/path-confinement.d.ts.map +1 -0
- package/dist/path-confinement.js +112 -0
- package/dist/path-confinement.js.map +1 -0
- package/dist/patterns.d.ts +7 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +229 -0
- package/dist/patterns.js.map +1 -0
- package/dist/structured-profiles.d.ts +22 -0
- package/dist/structured-profiles.d.ts.map +1 -0
- package/dist/structured-profiles.js +150 -0
- package/dist/structured-profiles.js.map +1 -0
- package/dist/syntax-inference.d.ts +4 -0
- package/dist/syntax-inference.d.ts.map +1 -0
- package/dist/syntax-inference.js +75 -0
- package/dist/syntax-inference.js.map +1 -0
- package/package.json +26 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 alisonaquinas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# @flavor-grenade/markdown-flavor
|
|
2
|
+
|
|
3
|
+
Shared Markdown flavor detection and Flavor Grenade config resolution.
|
|
4
|
+
|
|
5
|
+
This package is intentionally independent from NestJS, LSP, VS Code, and Bun
|
|
6
|
+
runtime APIs. Import `@flavor-grenade/markdown-flavor/node` only when filesystem
|
|
7
|
+
resolution for `.fgignore` and `.fgattributes` is needed.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type FgAttributes } from './fgattributes.js';
|
|
2
|
+
export declare const DEFAULT_FG_CONFIG_MAX_BYTES = 8192;
|
|
3
|
+
export interface FlavorConfigFileStat {
|
|
4
|
+
isFile(): boolean;
|
|
5
|
+
size: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FlavorConfigFileReader {
|
|
8
|
+
stat(filePath: string): FlavorConfigFileStat | undefined | Promise<FlavorConfigFileStat | undefined>;
|
|
9
|
+
readFile(filePath: string): string | undefined | Promise<string | undefined>;
|
|
10
|
+
}
|
|
11
|
+
export interface SyncFlavorConfigFileReader {
|
|
12
|
+
stat(filePath: string): FlavorConfigFileStat | undefined;
|
|
13
|
+
readFile(filePath: string): string | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface FlavorConfigResolution {
|
|
16
|
+
ignored: boolean;
|
|
17
|
+
inactiveReason?: 'fgignore' | 'outside-vault';
|
|
18
|
+
configFilesSeen: boolean;
|
|
19
|
+
attributes: FgAttributes;
|
|
20
|
+
}
|
|
21
|
+
export type ResolveFlavorConfigInput = {
|
|
22
|
+
root: string;
|
|
23
|
+
path: string;
|
|
24
|
+
maxConfigBytes?: number;
|
|
25
|
+
} & ({
|
|
26
|
+
reader: FlavorConfigFileReader;
|
|
27
|
+
} | FlavorConfigFileReader);
|
|
28
|
+
export type ResolveFlavorConfigSyncInput = {
|
|
29
|
+
root: string;
|
|
30
|
+
path: string;
|
|
31
|
+
maxConfigBytes?: number;
|
|
32
|
+
} & ({
|
|
33
|
+
reader: SyncFlavorConfigFileReader;
|
|
34
|
+
} | SyncFlavorConfigFileReader);
|
|
35
|
+
export declare function resolveFlavorConfig(input: ResolveFlavorConfigInput): Promise<FlavorConfigResolution>;
|
|
36
|
+
export declare function resolveFlavorConfigSync(input: ResolveFlavorConfigSyncInput): FlavorConfigResolution;
|
|
37
|
+
export declare function shouldPruneDirectoryByFlavorConfig(input: ResolveFlavorConfigInput): Promise<boolean>;
|
|
38
|
+
export declare function shouldPruneDirectoryByFlavorConfigSync(input: ResolveFlavorConfigSyncInput): boolean;
|
|
39
|
+
//# sourceMappingURL=fg-config-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fg-config-resolution.d.ts","sourceRoot":"","sources":["../src/fg-config-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAS5F,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CACF,QAAQ,EAAE,MAAM,GACf,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IAC9C,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,CAAC;IAAE,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAAG,sBAAsB,CAAC,CAAC;AAElE,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,CAAC;IAAE,MAAM,EAAE,0BAA0B,CAAA;CAAE,GAAG,0BAA0B,CAAC,CAAC;AAO1E,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAyCjC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,GAClC,sBAAsB,CAyCxB;AAED,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,4BAA4B,GAClC,OAAO,CA2BT"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { applyFgAttributes, parseFgAttributes } from './fgattributes.js';
|
|
2
|
+
import { matchFgIgnore, parseFgIgnore, shouldPruneDirectoryByFgIgnore } from './fgignore.js';
|
|
3
|
+
import { confinePathToRoot, normalizeRootPath, resolveRootRelativePath, rootRelativePath, } from './path-confinement.js';
|
|
4
|
+
export const DEFAULT_FG_CONFIG_MAX_BYTES = 8192;
|
|
5
|
+
export async function resolveFlavorConfig(input) {
|
|
6
|
+
const confinedResource = confinePathToRoot(input.root, input.path);
|
|
7
|
+
if (confinedResource === null) {
|
|
8
|
+
return outsideVaultResult();
|
|
9
|
+
}
|
|
10
|
+
const maxConfigBytes = normalizeMaxConfigBytes(input.maxConfigBytes);
|
|
11
|
+
const directories = configDirectoriesFor(input.root, confinedResource);
|
|
12
|
+
let configFilesSeen = false;
|
|
13
|
+
let ignored = false;
|
|
14
|
+
let attributes = {};
|
|
15
|
+
for (const directory of directories) {
|
|
16
|
+
const ignoreContent = await readConfigIfPresent(input, directory.directory, '.fgignore', maxConfigBytes);
|
|
17
|
+
if (ignoreContent !== undefined) {
|
|
18
|
+
configFilesSeen = true;
|
|
19
|
+
ignored = matchFgIgnore(parseFgIgnore(ignoreContent), directory.relativeTargetPath, ignored);
|
|
20
|
+
}
|
|
21
|
+
const attributesContent = await readConfigIfPresent(input, directory.directory, '.fgattributes', maxConfigBytes);
|
|
22
|
+
if (attributesContent !== undefined) {
|
|
23
|
+
configFilesSeen = true;
|
|
24
|
+
attributes = applyFgAttributes(parseFgAttributes(attributesContent), directory.relativeTargetPath, attributes);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return flavorConfigResult(ignored, configFilesSeen, attributes);
|
|
28
|
+
}
|
|
29
|
+
export function resolveFlavorConfigSync(input) {
|
|
30
|
+
const confinedResource = confinePathToRoot(input.root, input.path);
|
|
31
|
+
if (confinedResource === null) {
|
|
32
|
+
return outsideVaultResult();
|
|
33
|
+
}
|
|
34
|
+
const maxConfigBytes = normalizeMaxConfigBytes(input.maxConfigBytes);
|
|
35
|
+
const directories = configDirectoriesFor(input.root, confinedResource);
|
|
36
|
+
let configFilesSeen = false;
|
|
37
|
+
let ignored = false;
|
|
38
|
+
let attributes = {};
|
|
39
|
+
for (const directory of directories) {
|
|
40
|
+
const ignoreContent = readConfigIfPresentSync(input, directory.directory, '.fgignore', maxConfigBytes);
|
|
41
|
+
if (ignoreContent !== undefined) {
|
|
42
|
+
configFilesSeen = true;
|
|
43
|
+
ignored = matchFgIgnore(parseFgIgnore(ignoreContent), directory.relativeTargetPath, ignored);
|
|
44
|
+
}
|
|
45
|
+
const attributesContent = readConfigIfPresentSync(input, directory.directory, '.fgattributes', maxConfigBytes);
|
|
46
|
+
if (attributesContent !== undefined) {
|
|
47
|
+
configFilesSeen = true;
|
|
48
|
+
attributes = applyFgAttributes(parseFgAttributes(attributesContent), directory.relativeTargetPath, attributes);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return flavorConfigResult(ignored, configFilesSeen, attributes);
|
|
52
|
+
}
|
|
53
|
+
export async function shouldPruneDirectoryByFlavorConfig(input) {
|
|
54
|
+
const confinedDirectory = confinePathToRoot(input.root, input.path);
|
|
55
|
+
if (confinedDirectory === null) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const maxConfigBytes = normalizeMaxConfigBytes(input.maxConfigBytes);
|
|
59
|
+
const directories = configDirectoriesFor(input.root, confinedDirectory);
|
|
60
|
+
let ignored = false;
|
|
61
|
+
for (const directory of directories) {
|
|
62
|
+
const ignoreContent = await readConfigIfPresent(input, directory.directory, '.fgignore', maxConfigBytes);
|
|
63
|
+
if (ignoreContent !== undefined) {
|
|
64
|
+
ignored = shouldPruneDirectoryByFgIgnore(parseFgIgnore(ignoreContent), directory.relativeTargetPath, ignored);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return ignored;
|
|
68
|
+
}
|
|
69
|
+
export function shouldPruneDirectoryByFlavorConfigSync(input) {
|
|
70
|
+
const confinedDirectory = confinePathToRoot(input.root, input.path);
|
|
71
|
+
if (confinedDirectory === null) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const maxConfigBytes = normalizeMaxConfigBytes(input.maxConfigBytes);
|
|
75
|
+
const directories = configDirectoriesFor(input.root, confinedDirectory);
|
|
76
|
+
let ignored = false;
|
|
77
|
+
for (const directory of directories) {
|
|
78
|
+
const ignoreContent = readConfigIfPresentSync(input, directory.directory, '.fgignore', maxConfigBytes);
|
|
79
|
+
if (ignoreContent !== undefined) {
|
|
80
|
+
ignored = shouldPruneDirectoryByFgIgnore(parseFgIgnore(ignoreContent), directory.relativeTargetPath, ignored);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return ignored;
|
|
84
|
+
}
|
|
85
|
+
async function readConfigIfPresent(input, directory, fileName, maxConfigBytes) {
|
|
86
|
+
const candidate = configFilePath(input.root, directory, fileName);
|
|
87
|
+
if (candidate === null) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const reader = configFileReader(input);
|
|
91
|
+
try {
|
|
92
|
+
const stat = await reader.stat(candidate);
|
|
93
|
+
if (stat === undefined || !stat.isFile() || stat.size > maxConfigBytes) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const content = await reader.readFile(candidate);
|
|
97
|
+
if (content === undefined || utf8ByteLength(content) > maxConfigBytes) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
return content;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function readConfigIfPresentSync(input, directory, fileName, maxConfigBytes) {
|
|
107
|
+
const candidate = configFilePath(input.root, directory, fileName);
|
|
108
|
+
if (candidate === null) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
const reader = syncConfigFileReader(input);
|
|
112
|
+
const stat = reader.stat(candidate);
|
|
113
|
+
if (stat === undefined || !stat.isFile() || stat.size > maxConfigBytes) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const content = reader.readFile(candidate);
|
|
117
|
+
if (content === undefined || utf8ByteLength(content) > maxConfigBytes) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return content;
|
|
121
|
+
}
|
|
122
|
+
function configDirectoriesFor(root, resourcePath) {
|
|
123
|
+
const relativeResource = rootRelativePath(root, resourcePath);
|
|
124
|
+
if (relativeResource === null) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
const relativeDirectory = relativeDirname(relativeResource);
|
|
128
|
+
const parts = relativeDirectory === null || relativeDirectory === '' || relativeDirectory === '.'
|
|
129
|
+
? []
|
|
130
|
+
: relativeDirectory.split('/');
|
|
131
|
+
const result = [];
|
|
132
|
+
for (let index = 0; index <= parts.length; index += 1) {
|
|
133
|
+
const relativeDir = parts.slice(0, index).join('/');
|
|
134
|
+
const directory = relativeDir.length === 0
|
|
135
|
+
? normalizeRootPath(root)
|
|
136
|
+
: resolveRootRelativePath(root, relativeDir);
|
|
137
|
+
if (directory === null) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const relativeTargetPath = relativeDir.length === 0
|
|
141
|
+
? relativeResource
|
|
142
|
+
: relativeResource.slice(`${relativeDir}/`.length);
|
|
143
|
+
result.push({ directory, relativeTargetPath });
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
function configFilePath(root, directory, fileName) {
|
|
148
|
+
const relativeDirectory = rootRelativePath(root, directory);
|
|
149
|
+
if (relativeDirectory === null) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
if (relativeDirectory === '' || relativeDirectory === '.') {
|
|
153
|
+
return resolveRootRelativePath(root, fileName);
|
|
154
|
+
}
|
|
155
|
+
return resolveRootRelativePath(root, `${relativeDirectory}/${fileName}`);
|
|
156
|
+
}
|
|
157
|
+
function normalizeMaxConfigBytes(value) {
|
|
158
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
159
|
+
return DEFAULT_FG_CONFIG_MAX_BYTES;
|
|
160
|
+
}
|
|
161
|
+
const normalized = Math.floor(value);
|
|
162
|
+
return normalized > 0 ? normalized : DEFAULT_FG_CONFIG_MAX_BYTES;
|
|
163
|
+
}
|
|
164
|
+
function configFileReader(input) {
|
|
165
|
+
return 'reader' in input ? input.reader : input;
|
|
166
|
+
}
|
|
167
|
+
function syncConfigFileReader(input) {
|
|
168
|
+
return 'reader' in input ? input.reader : input;
|
|
169
|
+
}
|
|
170
|
+
function flavorConfigResult(ignored, configFilesSeen, attributes) {
|
|
171
|
+
if (ignored) {
|
|
172
|
+
return {
|
|
173
|
+
ignored: true,
|
|
174
|
+
inactiveReason: 'fgignore',
|
|
175
|
+
configFilesSeen,
|
|
176
|
+
attributes: {},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
ignored: false,
|
|
181
|
+
configFilesSeen,
|
|
182
|
+
attributes,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function outsideVaultResult() {
|
|
186
|
+
return {
|
|
187
|
+
ignored: true,
|
|
188
|
+
inactiveReason: 'outside-vault',
|
|
189
|
+
configFilesSeen: false,
|
|
190
|
+
attributes: {},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function relativeDirname(relativePath) {
|
|
194
|
+
const index = relativePath.lastIndexOf('/');
|
|
195
|
+
return index < 0 ? '' : relativePath.slice(0, index);
|
|
196
|
+
}
|
|
197
|
+
function utf8ByteLength(value) {
|
|
198
|
+
return new TextEncoder().encode(value).byteLength;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=fg-config-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fg-config-resolution.js","sourceRoot":"","sources":["../src/fg-config-resolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type MarkdownFlavorSelection } from './flavors.js';
|
|
2
|
+
import { type StructuredProfileSelection } from './structured-profiles.js';
|
|
3
|
+
export interface FgAttributes {
|
|
4
|
+
flavor?: MarkdownFlavorSelection;
|
|
5
|
+
structuredProfiles?: StructuredProfileSelection;
|
|
6
|
+
}
|
|
7
|
+
export interface FgAttributeRule {
|
|
8
|
+
pattern: string;
|
|
9
|
+
negated: boolean;
|
|
10
|
+
assignments: readonly FgAttributeAssignment[];
|
|
11
|
+
}
|
|
12
|
+
export type FgAttributeAssignment = {
|
|
13
|
+
kind: 'set';
|
|
14
|
+
key: 'flavor';
|
|
15
|
+
value: MarkdownFlavorSelection;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'set';
|
|
18
|
+
key: 'structuredProfiles';
|
|
19
|
+
value: StructuredProfileSelection;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'reset';
|
|
22
|
+
key: 'flavor' | 'structuredProfiles';
|
|
23
|
+
};
|
|
24
|
+
export declare function parseFgAttributes(content: string): FgAttributeRule[];
|
|
25
|
+
export declare function applyFgAttributes(rules: readonly FgAttributeRule[], relativePath: string, inherited?: FgAttributes): FgAttributes;
|
|
26
|
+
//# sourceMappingURL=fgattributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fgattributes.d.ts","sourceRoot":"","sources":["../src/fgattributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,0BAA0B,CAAC;AAWlC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC/C;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,0BAA0B,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,QAAQ,GAAG,oBAAoB,CAAA;CAAE,CAAC;AAE5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAuBpE;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,YAAiB,GAC3B,YAAY,CA0Cd"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { isMarkdownFlavorSelection } from './flavors.js';
|
|
2
|
+
import { isStructuredProfileSelection, } from './structured-profiles.js';
|
|
3
|
+
import { normalizeConfigLine, patternMatches, splitConfigTokens, toPosix, unescapePattern, } from './patterns.js';
|
|
4
|
+
const DANGEROUS_ATTRIBUTE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
5
|
+
export function parseFgAttributes(content) {
|
|
6
|
+
const rules = [];
|
|
7
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
8
|
+
const line = normalizeConfigLine(rawLine);
|
|
9
|
+
if (line.length === 0) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const tokens = splitConfigTokens(line);
|
|
13
|
+
if (tokens.length < 1) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const rawPattern = tokens[0];
|
|
17
|
+
const negated = rawPattern.startsWith('!');
|
|
18
|
+
const pattern = unescapePattern(negated ? rawPattern.slice(1) : rawPattern);
|
|
19
|
+
if (pattern.length === 0) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const assignments = tokens.slice(1).flatMap(parseFgAttributeToken);
|
|
23
|
+
if (negated || assignments.length > 0) {
|
|
24
|
+
rules.push({ pattern, negated, assignments });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return rules;
|
|
28
|
+
}
|
|
29
|
+
export function applyFgAttributes(rules, relativePath, inherited = {}) {
|
|
30
|
+
const attributes = { ...inherited };
|
|
31
|
+
const local = {};
|
|
32
|
+
const localResets = new Set();
|
|
33
|
+
for (const rule of rules) {
|
|
34
|
+
if (!patternMatches(rule.pattern, toPosix(relativePath))) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (rule.negated) {
|
|
38
|
+
delete local.flavor;
|
|
39
|
+
delete local.structuredProfiles;
|
|
40
|
+
localResets.delete('flavor');
|
|
41
|
+
localResets.delete('structuredProfiles');
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
for (const assignment of rule.assignments) {
|
|
45
|
+
if (assignment.kind === 'reset') {
|
|
46
|
+
resetAttribute(local, assignment.key);
|
|
47
|
+
localResets.add(assignment.key);
|
|
48
|
+
}
|
|
49
|
+
else if (assignment.key === 'flavor') {
|
|
50
|
+
local.flavor = assignment.value;
|
|
51
|
+
localResets.delete('flavor');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
local.structuredProfiles = assignment.value;
|
|
55
|
+
localResets.delete('structuredProfiles');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (localResets.has('flavor')) {
|
|
60
|
+
delete attributes.flavor;
|
|
61
|
+
}
|
|
62
|
+
else if (local.flavor !== undefined) {
|
|
63
|
+
attributes.flavor = local.flavor;
|
|
64
|
+
}
|
|
65
|
+
if (localResets.has('structuredProfiles')) {
|
|
66
|
+
delete attributes.structuredProfiles;
|
|
67
|
+
}
|
|
68
|
+
else if (local.structuredProfiles !== undefined) {
|
|
69
|
+
attributes.structuredProfiles = local.structuredProfiles;
|
|
70
|
+
}
|
|
71
|
+
return attributes;
|
|
72
|
+
}
|
|
73
|
+
function parseFgAttributeToken(token) {
|
|
74
|
+
const resetMatch = /^!(flavor|structured_profiles|structuredProfiles)$/.exec(token);
|
|
75
|
+
if (resetMatch) {
|
|
76
|
+
const key = normalizeAttributeKey(resetMatch[1]);
|
|
77
|
+
if (key === undefined) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return [{ kind: 'reset', key }];
|
|
81
|
+
}
|
|
82
|
+
const [rawKey, ...rawValueParts] = token.split('=');
|
|
83
|
+
const rawValue = rawValueParts.join('=');
|
|
84
|
+
if (rawValueParts.length === 0 || DANGEROUS_ATTRIBUTE_KEYS.has(rawKey)) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const key = normalizeAttributeKey(rawKey);
|
|
88
|
+
if (key === undefined) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
if (key === 'flavor') {
|
|
92
|
+
return isMarkdownFlavorSelection(rawValue) ? [{ kind: 'set', key, value: rawValue }] : [];
|
|
93
|
+
}
|
|
94
|
+
const value = normalizeStructuredProfilesValue(rawValue);
|
|
95
|
+
return value === undefined ? [] : [{ kind: 'set', key, value }];
|
|
96
|
+
}
|
|
97
|
+
function normalizeAttributeKey(value) {
|
|
98
|
+
if (value === 'flavor') {
|
|
99
|
+
return 'flavor';
|
|
100
|
+
}
|
|
101
|
+
if (value === 'structured_profiles' || value === 'structuredProfiles') {
|
|
102
|
+
return 'structuredProfiles';
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
function resetAttribute(attributes, key) {
|
|
107
|
+
if (key === 'flavor') {
|
|
108
|
+
delete attributes.flavor;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
delete attributes.structuredProfiles;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function normalizeStructuredProfilesValue(value) {
|
|
115
|
+
if (value === 'auto' || value === 'none') {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
const profiles = value
|
|
119
|
+
.split(',')
|
|
120
|
+
.map((part) => part.trim())
|
|
121
|
+
.filter((part) => part.length > 0);
|
|
122
|
+
return isStructuredProfileSelection(profiles)
|
|
123
|
+
? profiles
|
|
124
|
+
: undefined;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=fgattributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fgattributes.js","sourceRoot":"","sources":["../src/fgattributes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface FgIgnoreRule {
|
|
2
|
+
pattern: string;
|
|
3
|
+
negated: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseFgIgnore(content: string): FgIgnoreRule[];
|
|
6
|
+
export declare function matchFgIgnore(rules: readonly FgIgnoreRule[], relativePath: string, initialIgnored?: boolean): boolean;
|
|
7
|
+
export declare function shouldPruneDirectoryByFgIgnore(rules: readonly FgIgnoreRule[], relativePath: string, initialIgnored?: boolean): boolean;
|
|
8
|
+
//# sourceMappingURL=fgignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fgignore.d.ts","sourceRoot":"","sources":["../src/fgignore.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAc7D;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,YAAY,EAAE,MAAM,EACpB,cAAc,UAAQ,GACrB,OAAO,CAQT;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,YAAY,EAAE,MAAM,EACpB,cAAc,UAAQ,GACrB,OAAO,CAQT"}
|
package/dist/fgignore.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { normalizeConfigLine, patternMatches, patternMatchesDirectory, toPosix, unescapePattern, } from './patterns.js';
|
|
2
|
+
export function parseFgIgnore(content) {
|
|
3
|
+
const rules = [];
|
|
4
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
5
|
+
const line = normalizeConfigLine(rawLine);
|
|
6
|
+
if (line.length === 0) {
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
const negated = line.startsWith('!');
|
|
10
|
+
const pattern = unescapePattern(negated ? line.slice(1) : line);
|
|
11
|
+
if (pattern.length > 0) {
|
|
12
|
+
rules.push({ pattern, negated });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return rules;
|
|
16
|
+
}
|
|
17
|
+
export function matchFgIgnore(rules, relativePath, initialIgnored = false) {
|
|
18
|
+
let ignored = initialIgnored;
|
|
19
|
+
for (const rule of rules) {
|
|
20
|
+
if (patternMatches(rule.pattern, toPosix(relativePath))) {
|
|
21
|
+
ignored = !rule.negated;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return ignored;
|
|
25
|
+
}
|
|
26
|
+
export function shouldPruneDirectoryByFgIgnore(rules, relativePath, initialIgnored = false) {
|
|
27
|
+
let ignored = initialIgnored;
|
|
28
|
+
for (const rule of rules) {
|
|
29
|
+
if (patternMatchesDirectory(rule.pattern, toPosix(relativePath))) {
|
|
30
|
+
ignored = !rule.negated;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return ignored;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=fgignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fgignore.js","sourceRoot":"","sources":["../src/fgignore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,OAAO,EACP,eAAe,GAChB,MAAM,eAAe,CAAC;AAOvB,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAA8B,EAC9B,YAAoB,EACpB,cAAc,GAAG,KAAK;IAEtB,IAAI,OAAO,GAAG,cAAc,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,KAA8B,EAC9B,YAAoB,EACpB,cAAc,GAAG,KAAK;IAEtB,IAAI,OAAO,GAAG,cAAc,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MarkdownFlavorId, type MarkdownFlavorSelection } from './flavors.js';
|
|
2
|
+
import { type FgAttributes } from './fgattributes.js';
|
|
3
|
+
import { type StructuredMarkdownProfileId, type StructuredProfileResolutionSource, type StructuredProfileSelection } from './structured-profiles.js';
|
|
4
|
+
export type EffectiveMarkdownFlavor = MarkdownFlavorId;
|
|
5
|
+
export type FlavorResolutionSource = 'fgattributes' | 'obsidian-marker' | 'syntax-inference' | 'commonmark-fallback';
|
|
6
|
+
export type InactiveFlavorReason = 'non-markdown-language' | 'unsupported-path' | 'fgignore';
|
|
7
|
+
export type MarkdownFlavorResolution = {
|
|
8
|
+
kind: 'active';
|
|
9
|
+
selected: MarkdownFlavorSelection;
|
|
10
|
+
effective: EffectiveMarkdownFlavor;
|
|
11
|
+
source: FlavorResolutionSource;
|
|
12
|
+
structuredProfiles: readonly StructuredMarkdownProfileId[];
|
|
13
|
+
structuredProfileSource: StructuredProfileResolutionSource;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'inactive';
|
|
16
|
+
reason: InactiveFlavorReason;
|
|
17
|
+
};
|
|
18
|
+
export type FlavorResolutionResult = MarkdownFlavorResolution;
|
|
19
|
+
export interface ResolveMarkdownFlavorInput {
|
|
20
|
+
path: string;
|
|
21
|
+
languageId?: string;
|
|
22
|
+
ignored?: boolean;
|
|
23
|
+
hasObsidianMarker?: boolean;
|
|
24
|
+
fgAttributes?: FgAttributes;
|
|
25
|
+
fgAttributesFlavor?: MarkdownFlavorSelection;
|
|
26
|
+
fgAttributesStructuredProfiles?: StructuredProfileSelection;
|
|
27
|
+
flavorSelection?: MarkdownFlavorSelection;
|
|
28
|
+
structuredProfileSelection?: StructuredProfileSelection;
|
|
29
|
+
syntaxText?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function resolveMarkdownFlavor(input: ResolveMarkdownFlavorInput): MarkdownFlavorResolution;
|
|
32
|
+
//# sourceMappingURL=flavor-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flavor-resolution.d.ts","sourceRoot":"","sources":["../src/flavor-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,0BAA0B,EAChC,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,oBAAoB,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,UAAU,CAAC;AAE7F,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,uBAAuB,CAAC;IAClC,SAAS,EAAE,uBAAuB,CAAC;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,kBAAkB,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC3D,uBAAuB,EAAE,iCAAiC,CAAC;CAC5D,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEN,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kBAAkB,CAAC,EAAE,uBAAuB,CAAC;IAC7C,8BAA8B,CAAC,EAAE,0BAA0B,CAAC;IAC5D,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,wBAAwB,CA0DjG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { inferMarkdownFlavorFromSyntax } from './syntax-inference.js';
|
|
2
|
+
import { resolveStructuredProfiles, } from './structured-profiles.js';
|
|
3
|
+
export function resolveMarkdownFlavor(input) {
|
|
4
|
+
if (input.languageId !== undefined && input.languageId !== 'markdown') {
|
|
5
|
+
return { kind: 'inactive', reason: 'non-markdown-language' };
|
|
6
|
+
}
|
|
7
|
+
if (input.ignored === true) {
|
|
8
|
+
return { kind: 'inactive', reason: 'fgignore' };
|
|
9
|
+
}
|
|
10
|
+
const fgAttributesFlavor = input.fgAttributesFlavor ?? input.fgAttributes?.flavor;
|
|
11
|
+
const fgAttributesStructuredProfiles = input.fgAttributesStructuredProfiles ?? input.fgAttributes?.structuredProfiles;
|
|
12
|
+
const selected = input.flavorSelection ?? fgAttributesFlavor ?? 'auto';
|
|
13
|
+
const explicitSelection = selected !== 'auto' ? selected : undefined;
|
|
14
|
+
const structuredProfileState = resolveStructuredProfiles({
|
|
15
|
+
selection: input.structuredProfileSelection ?? 'auto',
|
|
16
|
+
fgAttributesSelection: fgAttributesStructuredProfiles,
|
|
17
|
+
path: input.path,
|
|
18
|
+
syntaxText: input.syntaxText,
|
|
19
|
+
});
|
|
20
|
+
if (explicitSelection !== undefined) {
|
|
21
|
+
return {
|
|
22
|
+
kind: 'active',
|
|
23
|
+
selected,
|
|
24
|
+
effective: explicitSelection,
|
|
25
|
+
source: 'fgattributes',
|
|
26
|
+
...structuredProfileState,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (input.hasObsidianMarker === true) {
|
|
30
|
+
return {
|
|
31
|
+
kind: 'active',
|
|
32
|
+
selected: 'auto',
|
|
33
|
+
effective: 'obsidian',
|
|
34
|
+
source: 'obsidian-marker',
|
|
35
|
+
...structuredProfileState,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const inferred = inferMarkdownFlavorFromSyntax(input.syntaxText);
|
|
39
|
+
if (inferred !== undefined) {
|
|
40
|
+
return {
|
|
41
|
+
kind: 'active',
|
|
42
|
+
selected: 'auto',
|
|
43
|
+
effective: inferred,
|
|
44
|
+
source: 'syntax-inference',
|
|
45
|
+
...structuredProfileState,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
kind: 'active',
|
|
50
|
+
selected: 'auto',
|
|
51
|
+
effective: 'commonmark',
|
|
52
|
+
source: 'commonmark-fallback',
|
|
53
|
+
...structuredProfileState,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=flavor-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flavor-resolution.js","sourceRoot":"","sources":["../src/flavor-resolution.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EACL,yBAAyB,GAI1B,MAAM,0BAA0B,CAAC;AAyClC,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC;IAClF,MAAM,8BAA8B,GAClC,KAAK,CAAC,8BAA8B,IAAI,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC;IACjF,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,IAAI,kBAAkB,IAAI,MAAM,CAAC;IACvE,MAAM,iBAAiB,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;QACvD,SAAS,EAAE,KAAK,CAAC,0BAA0B,IAAI,MAAM;QACrD,qBAAqB,EAAE,8BAA8B;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;IAEH,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ;YACR,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,GAAG,sBAAsB;SAC1B,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,iBAAiB;YACzB,GAAG,sBAAsB;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,kBAAkB;YAC1B,GAAG,sBAAsB;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,qBAAqB;QAC7B,GAAG,sBAAsB;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Explicit Markdown flavor ids supported by shared profile data. */
|
|
2
|
+
export declare const MARKDOWN_FLAVOR_IDS: readonly ["original", "commonmark", "obsidian", "gfm", "glfm", "pandoc", "multimarkdown", "mdx", "kramdown", "markdown-extra", "r-markdown", "reddit", "stack-overflow"];
|
|
3
|
+
/** A concrete Markdown dialect profile id. `auto` is intentionally excluded. */
|
|
4
|
+
export type MarkdownFlavorId = (typeof MARKDOWN_FLAVOR_IDS)[number];
|
|
5
|
+
/** Markdown flavor selector values, including auto-detection state. */
|
|
6
|
+
export declare const MARKDOWN_FLAVOR_SELECTIONS: readonly ["auto", "original", "commonmark", "obsidian", "gfm", "glfm", "pandoc", "multimarkdown", "mdx", "kramdown", "markdown-extra", "r-markdown", "reddit", "stack-overflow"];
|
|
7
|
+
/** User-facing selector state. `auto` resolves to an explicit flavor later. */
|
|
8
|
+
export type MarkdownFlavorSelection = (typeof MARKDOWN_FLAVOR_SELECTIONS)[number];
|
|
9
|
+
/** ADR020 labels in selector display order. */
|
|
10
|
+
export declare const MARKDOWN_FLAVOR_LABELS: Record<MarkdownFlavorSelection, string>;
|
|
11
|
+
/** True when a value is a researched explicit flavor id. */
|
|
12
|
+
export declare function isMarkdownFlavorId(value: unknown): value is MarkdownFlavorId;
|
|
13
|
+
/** True when a value is a supported selector value, including `auto`. */
|
|
14
|
+
export declare function isMarkdownFlavorSelection(value: unknown): value is MarkdownFlavorSelection;
|
|
15
|
+
//# sourceMappingURL=flavors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flavors.d.ts","sourceRoot":"","sources":["../src/flavors.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,0KActB,CAAC;AAEX,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,kLAA4C,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAe1E,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAED,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAI1F"}
|