@bastiangx/opencode-unmoji 0.1.0 → 0.3.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/README.md +24 -5
- package/dist/core/emoji-data-generated.d.ts.map +1 -1
- package/dist/core/emoji-data-generated.js +7645 -5370
- package/dist/core/emoji-data-generated.js.map +1 -1
- package/dist/core/emoji-data.d.ts +3 -0
- package/dist/core/emoji-data.d.ts.map +1 -1
- package/dist/core/emoji-data.js +46 -2
- package/dist/core/emoji-data.js.map +1 -1
- package/dist/core/processor.d.ts +12 -1
- package/dist/core/processor.d.ts.map +1 -1
- package/dist/core/processor.js +67 -12
- package/dist/core/processor.js.map +1 -1
- package/dist/data/emoji-data-gen.d.ts +6 -0
- package/dist/data/emoji-data-gen.d.ts.map +1 -0
- package/dist/data/emoji-data-gen.js +30638 -0
- package/dist/data/emoji-data-gen.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +135 -4
- package/dist/index.js.map +1 -1
- package/dist/plugin.bundled.js +7949 -5445
- package/dist/src/core/config.d.ts +22 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +82 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/emoji-data.d.ts +11 -0
- package/dist/src/core/emoji-data.d.ts.map +1 -0
- package/dist/src/core/emoji-data.js +105 -0
- package/dist/src/core/emoji-data.js.map +1 -0
- package/dist/src/core/processor.d.ts +16 -0
- package/dist/src/core/processor.d.ts.map +1 -0
- package/dist/src/core/processor.js +115 -0
- package/dist/src/core/processor.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +153 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types/config.d.ts +55 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +36 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/errors.d.ts +59 -0
- package/dist/src/types/errors.d.ts.map +1 -0
- package/dist/src/types/errors.js +6 -0
- package/dist/src/types/errors.js.map +1 -0
- package/dist/src/utils/code-detector.d.ts +17 -0
- package/dist/src/utils/code-detector.d.ts.map +1 -0
- package/dist/src/utils/code-detector.js +288 -0
- package/dist/src/utils/code-detector.js.map +1 -0
- package/dist/src/utils/grapheme.d.ts +20 -0
- package/dist/src/utils/grapheme.d.ts.map +1 -0
- package/dist/src/utils/grapheme.js +82 -0
- package/dist/src/utils/grapheme.js.map +1 -0
- package/dist/streaming/hooks.d.ts +12 -0
- package/dist/streaming/hooks.d.ts.map +1 -0
- package/dist/streaming/hooks.js +8 -0
- package/dist/streaming/hooks.js.map +1 -0
- package/dist/streaming/sanitizer.d.ts +66 -0
- package/dist/streaming/sanitizer.d.ts.map +1 -0
- package/dist/streaming/sanitizer.js +118 -0
- package/dist/streaming/sanitizer.js.map +1 -0
- package/dist/streaming/state.d.ts +10 -0
- package/dist/streaming/state.d.ts.map +1 -0
- package/dist/streaming/state.js +33 -0
- package/dist/streaming/state.js.map +1 -0
- package/dist/types/config.d.ts +21 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +14 -0
- package/dist/types/config.js.map +1 -1
- package/dist/utils/code-detector.d.ts.map +1 -1
- package/dist/utils/code-detector.js +46 -10
- package/dist/utils/code-detector.js.map +1 -1
- package/dist/utils/grapheme.d.ts.map +1 -1
- package/dist/utils/grapheme.js +20 -2
- package/dist/utils/grapheme.js.map +1 -1
- package/package.json +19 -6
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts - Configuration management and validation
|
|
3
|
+
*
|
|
4
|
+
* Handles configuration discovery by merging defaults with global (~/.config)
|
|
5
|
+
* and project-specific (.opencode) settings. Validates schemas using Zod.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Layered configuration merging (Default -> Global -> Project)
|
|
9
|
+
* - Strict schema validation via Zod
|
|
10
|
+
* - Functional error handling using neverthrow Result pattern
|
|
11
|
+
*
|
|
12
|
+
* Main exports:
|
|
13
|
+
* - loadConfig: (projectDir: string) => Result<UnmojiConfig, ConfigError>
|
|
14
|
+
*
|
|
15
|
+
* @see src/types/config.ts
|
|
16
|
+
* @see src/types/errors.ts
|
|
17
|
+
*/
|
|
18
|
+
import { type Result } from "neverthrow";
|
|
19
|
+
import { type UnmojiConfig } from "../types/config.js";
|
|
20
|
+
import type { ConfigError } from "../types/errors.js";
|
|
21
|
+
export declare function loadConfig(projectDir: string): Result<UnmojiConfig, ConfigError>;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,YAAY,CAAC;AAClD,OAAO,EAGN,KAAK,YAAY,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,wBAAgB,UAAU,CACzB,UAAU,EAAE,MAAM,GAChB,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAoCnC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts - Configuration management and validation
|
|
3
|
+
*
|
|
4
|
+
* Handles configuration discovery by merging defaults with global (~/.config)
|
|
5
|
+
* and project-specific (.opencode) settings. Validates schemas using Zod.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Layered configuration merging (Default -> Global -> Project)
|
|
9
|
+
* - Strict schema validation via Zod
|
|
10
|
+
* - Functional error handling using neverthrow Result pattern
|
|
11
|
+
*
|
|
12
|
+
* Main exports:
|
|
13
|
+
* - loadConfig: (projectDir: string) => Result<UnmojiConfig, ConfigError>
|
|
14
|
+
*
|
|
15
|
+
* @see src/types/config.ts
|
|
16
|
+
* @see src/types/errors.ts
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { ok, err } from "neverthrow";
|
|
21
|
+
import { ConfigSchema, DEFAULT_CONFIG, } from "../types/config.js";
|
|
22
|
+
export function loadConfig(projectDir) {
|
|
23
|
+
const configs = [DEFAULT_CONFIG];
|
|
24
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
25
|
+
if (homeDir) {
|
|
26
|
+
const globalConfigPath = join(homeDir, ".config", "opencode", "unmoji.json");
|
|
27
|
+
const globalConfigResult = loadConfigFile(globalConfigPath);
|
|
28
|
+
if (globalConfigResult.isOk()) {
|
|
29
|
+
configs.push(globalConfigResult.value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const projectConfigPath = join(projectDir, ".opencode", "unmoji.json");
|
|
33
|
+
const projectConfigResult = loadConfigFile(projectConfigPath);
|
|
34
|
+
if (projectConfigResult.isOk()) {
|
|
35
|
+
configs.push(projectConfigResult.value);
|
|
36
|
+
}
|
|
37
|
+
const merged = Object.assign({}, ...configs);
|
|
38
|
+
const result = ConfigSchema.safeParse(merged);
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
return err({
|
|
41
|
+
domain: "config",
|
|
42
|
+
code: "INVALID_SCHEMA",
|
|
43
|
+
details: result.error.message,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return ok(result.data);
|
|
47
|
+
}
|
|
48
|
+
function loadConfigFile(path) {
|
|
49
|
+
if (!existsSync(path)) {
|
|
50
|
+
return err({
|
|
51
|
+
domain: "config",
|
|
52
|
+
code: "FILE_NOT_FOUND",
|
|
53
|
+
path,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
let content;
|
|
57
|
+
try {
|
|
58
|
+
content = readFileSync(path, "utf-8");
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return err({
|
|
62
|
+
domain: "config",
|
|
63
|
+
code: "READ_FAILED",
|
|
64
|
+
path,
|
|
65
|
+
reason: String(e),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
let json;
|
|
69
|
+
try {
|
|
70
|
+
json = JSON.parse(content);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return err({
|
|
74
|
+
domain: "config",
|
|
75
|
+
code: "INVALID_JSON",
|
|
76
|
+
path,
|
|
77
|
+
raw: content.slice(0, 100),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return ok(json);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAe,EAAE,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACN,YAAY,EACZ,cAAc,GAEd,MAAM,oBAAoB,CAAC;AAG5B,MAAM,UAAU,UAAU,CACzB,UAAkB;IAElB,MAAM,OAAO,GAA4B,CAAC,cAAc,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5D,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,gBAAgB,GAAG,IAAI,CAC5B,OAAO,EACP,SAAS,EACT,UAAU,EACV,aAAa,CACb,CAAC;QACF,MAAM,kBAAkB,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;YACV,MAAM,EAAE,QAAiB;YACzB,IAAI,EAAE,gBAAyB;YAC/B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;SAC7B,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CACtB,IAAY;IAEZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;YACV,MAAM,EAAE,QAAiB;YACzB,IAAI,EAAE,gBAAyB;YAC/B,IAAI;SACJ,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC;YACV,MAAM,EAAE,QAAiB;YACzB,IAAI,EAAE,aAAsB;YAC5B,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACjB,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACJ,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,CAAC;YACV,MAAM,EAAE,QAAiB;YACzB,IAAI,EAAE,cAAuB;YAC7B,IAAI;YACJ,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,IAA6B,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import type { EmojiDataError } from "../types/errors.js";
|
|
3
|
+
export declare const EXTRA_STRIPPABLE: Set<string>;
|
|
4
|
+
export declare function normalizeEmoji(grapheme: string): string;
|
|
5
|
+
export declare function isStrippable(grapheme: string, emojiSet: Set<string>): boolean;
|
|
6
|
+
export type ReplacementStyle = "github" | "slack" | "discord" | "cldr" | "iamcal" | "joypixels";
|
|
7
|
+
export declare function getEmojiSetSync(): Result<Set<string>, EmojiDataError>;
|
|
8
|
+
export declare function getEmojiMapSync(replacementStyle: ReplacementStyle): Result<Map<string, string>, EmojiDataError>;
|
|
9
|
+
export declare function getEmojiShortcode(emoji: string, map: Map<string, string>): string | null;
|
|
10
|
+
export declare function getReplacement(emoji: string, format: ":name:" | "[:name:]" | "{name}", map: Map<string, string>): string;
|
|
11
|
+
//# sourceMappingURL=emoji-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-data.d.ts","sourceRoot":"","sources":["../../../src/core/emoji-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAiBzD,eAAO,MAAM,gBAAgB,aAI3B,CAAC;AAIH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAe7E;AAED,MAAM,MAAM,gBAAgB,GACzB,QAAQ,GACR,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAiBf,wBAAgB,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAQrE;AAED,wBAAgB,eAAe,CAC9B,gBAAgB,EAAE,gBAAgB,GAChC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAoB7C;AAED,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,MAAM,GAAG,IAAI,CAUf;AAaD,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,EACxC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,MAAM,CAIR"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ok, err } from "neverthrow";
|
|
2
|
+
import { EMOJI_SET, EMOJI_MAP_CLDR, EMOJI_MAP_GITHUB, EMOJI_MAP_IAMCAL, EMOJI_MAP_JOYPIXELS, } from "../../data/emoji-data-gen.js";
|
|
3
|
+
// VS16 (U+FE0F) and VS15 (U+FE0E) - variation selectors that cause lookup mismatches
|
|
4
|
+
const VS16 = "\uFE0F";
|
|
5
|
+
const VS15 = "\uFE0E";
|
|
6
|
+
// Non-emoji glyphs that should still be stripped (not in Unicode Emoji property)
|
|
7
|
+
// U+1F241 = Tortoise Shell Bracketed CJK Unified Ideograph-4E09
|
|
8
|
+
// U+1F250 = Circled Ideograph Advantage
|
|
9
|
+
// U+1F251 = Circled Ideograph Accept
|
|
10
|
+
export const EXTRA_STRIPPABLE = new Set([
|
|
11
|
+
"\u{1F241}", // 🉁
|
|
12
|
+
"\u{1F250}", // 🉐
|
|
13
|
+
"\u{1F251}", // 🉑
|
|
14
|
+
]);
|
|
15
|
+
// Normalize emoji by removing variation selectors (VS16/VS15)
|
|
16
|
+
// Used as fallback when direct Set lookup fails
|
|
17
|
+
export function normalizeEmoji(grapheme) {
|
|
18
|
+
if (!grapheme.includes(VS16) && !grapheme.includes(VS15)) {
|
|
19
|
+
return grapheme;
|
|
20
|
+
}
|
|
21
|
+
return grapheme.replaceAll(VS16, "").replaceAll(VS15, "");
|
|
22
|
+
}
|
|
23
|
+
export function isStrippable(grapheme, emojiSet) {
|
|
24
|
+
// Direct lookup (fast path)
|
|
25
|
+
if (emojiSet.has(grapheme)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// Check extra strippables
|
|
29
|
+
if (EXTRA_STRIPPABLE.has(grapheme)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
// Fallback: normalize and retry (handles VS16/VS15 mismatches)
|
|
33
|
+
const normalized = normalizeEmoji(grapheme);
|
|
34
|
+
if (normalized !== grapheme && emojiSet.has(normalized)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function _getShortcodePreset(style) {
|
|
40
|
+
if (style === "slack")
|
|
41
|
+
return "iamcal";
|
|
42
|
+
if (style === "discord")
|
|
43
|
+
return "joypixels";
|
|
44
|
+
return style;
|
|
45
|
+
}
|
|
46
|
+
const MAP_BY_PRESET = {
|
|
47
|
+
github: EMOJI_MAP_GITHUB,
|
|
48
|
+
cldr: EMOJI_MAP_CLDR,
|
|
49
|
+
iamcal: EMOJI_MAP_IAMCAL,
|
|
50
|
+
joypixels: EMOJI_MAP_JOYPIXELS,
|
|
51
|
+
};
|
|
52
|
+
export function getEmojiSetSync() {
|
|
53
|
+
if (EMOJI_SET.size === 0) {
|
|
54
|
+
return err({
|
|
55
|
+
domain: "emoji-data",
|
|
56
|
+
code: "EMPTY_DATASET",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return ok(EMOJI_SET);
|
|
60
|
+
}
|
|
61
|
+
export function getEmojiMapSync(replacementStyle) {
|
|
62
|
+
const preset = _getShortcodePreset(replacementStyle);
|
|
63
|
+
const map = MAP_BY_PRESET[preset];
|
|
64
|
+
if (!map) {
|
|
65
|
+
return err({
|
|
66
|
+
domain: "emoji-data",
|
|
67
|
+
code: "INVALID_DATA",
|
|
68
|
+
details: `Missing shortcode map for preset ${preset}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (map.size === 0) {
|
|
72
|
+
return err({
|
|
73
|
+
domain: "emoji-data",
|
|
74
|
+
code: "EMPTY_DATASET",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return ok(map);
|
|
78
|
+
}
|
|
79
|
+
export function getEmojiShortcode(emoji, map) {
|
|
80
|
+
const direct = map.get(emoji);
|
|
81
|
+
if (direct) {
|
|
82
|
+
return direct;
|
|
83
|
+
}
|
|
84
|
+
const normalized = normalizeEmoji(emoji);
|
|
85
|
+
if (normalized !== emoji) {
|
|
86
|
+
return map.get(normalized) ?? null;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
function generateHexFallback(emoji) {
|
|
91
|
+
const codepoints = [];
|
|
92
|
+
for (const ch of emoji) {
|
|
93
|
+
const cp = ch.codePointAt(0);
|
|
94
|
+
if (cp !== undefined) {
|
|
95
|
+
codepoints.push(`u${cp.toString(16).padStart(4, "0")}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return `emoji_${codepoints.join("_")}`;
|
|
99
|
+
}
|
|
100
|
+
export function getReplacement(emoji, format, map) {
|
|
101
|
+
const shortcode = getEmojiShortcode(emoji, map);
|
|
102
|
+
const name = shortcode ?? generateHexFallback(emoji);
|
|
103
|
+
return format.replace("name", name);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=emoji-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-data.js","sourceRoot":"","sources":["../../../src/core/emoji-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UnmojiConfig } from "../types/config.js";
|
|
2
|
+
import type { Result } from "neverthrow";
|
|
3
|
+
import type { ProcessingError } from "../types/errors.js";
|
|
4
|
+
export type ProcessStats = {
|
|
5
|
+
removed: number;
|
|
6
|
+
lines: number[];
|
|
7
|
+
keptInlineCode: number;
|
|
8
|
+
keptCodeBlock: number;
|
|
9
|
+
keptQuote: number;
|
|
10
|
+
};
|
|
11
|
+
export type ProcessResult = {
|
|
12
|
+
text: string;
|
|
13
|
+
stats: ProcessStats;
|
|
14
|
+
};
|
|
15
|
+
export declare function processText(text: string, config: UnmojiConfig): Result<ProcessResult, ProcessingError>;
|
|
16
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../src/core/processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAgB1D,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GAClB,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,CA0HxC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ok, err } from "neverthrow";
|
|
2
|
+
import { detectCodeBlocks, detectQuotes, isInPreservedRange, } from "../utils/code-detector.js";
|
|
3
|
+
import { graphemes, mightContainEmoji } from "../utils/grapheme.js";
|
|
4
|
+
import { getEmojiSetSync, getEmojiMapSync, getReplacement, isStrippable, } from "./emoji-data.js";
|
|
5
|
+
export function processText(text, config) {
|
|
6
|
+
if (!text || !mightContainEmoji(text)) {
|
|
7
|
+
return ok({
|
|
8
|
+
text,
|
|
9
|
+
stats: {
|
|
10
|
+
removed: 0,
|
|
11
|
+
lines: [],
|
|
12
|
+
keptInlineCode: 0,
|
|
13
|
+
keptCodeBlock: 0,
|
|
14
|
+
keptQuote: 0,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const emojiSetResult = getEmojiSetSync();
|
|
19
|
+
if (emojiSetResult.isErr()) {
|
|
20
|
+
return err({
|
|
21
|
+
domain: "processing",
|
|
22
|
+
code: "EMOJI_DATA_UNAVAILABLE",
|
|
23
|
+
cause: emojiSetResult.error,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const emojiSet = emojiSetResult.value;
|
|
27
|
+
let emojiMap = null;
|
|
28
|
+
if (config.mode === "replace") {
|
|
29
|
+
const style = config.replacementStyle || "github";
|
|
30
|
+
const emojiMapResult = getEmojiMapSync(style);
|
|
31
|
+
if (emojiMapResult.isErr()) {
|
|
32
|
+
return err({
|
|
33
|
+
domain: "processing",
|
|
34
|
+
code: "EMOJI_DATA_UNAVAILABLE",
|
|
35
|
+
cause: emojiMapResult.error,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
emojiMap = emojiMapResult.value;
|
|
39
|
+
}
|
|
40
|
+
// Detect ranges separately to track kept emojis by type
|
|
41
|
+
const codeBlockRanges = config.preserveCodeBlocks
|
|
42
|
+
? detectCodeBlocks(text, {
|
|
43
|
+
preserveCodeBlocks: true,
|
|
44
|
+
preserveInlineCode: false,
|
|
45
|
+
})
|
|
46
|
+
: [];
|
|
47
|
+
const inlineCodeRanges = config.preserveInlineCode
|
|
48
|
+
? detectCodeBlocks(text, {
|
|
49
|
+
preserveCodeBlocks: false,
|
|
50
|
+
preserveInlineCode: true,
|
|
51
|
+
})
|
|
52
|
+
: [];
|
|
53
|
+
const quoteRanges = detectQuotes(text, {
|
|
54
|
+
preserveBlockquotes: config.skipQuotes,
|
|
55
|
+
preserveInlineQuotes: config.skipQuotes,
|
|
56
|
+
});
|
|
57
|
+
const chunks = [];
|
|
58
|
+
let currentIndex = 0;
|
|
59
|
+
let currentLine = 1;
|
|
60
|
+
let didChange = false;
|
|
61
|
+
let removedCount = 0;
|
|
62
|
+
let keptInlineCode = 0;
|
|
63
|
+
let keptCodeBlock = 0;
|
|
64
|
+
let keptQuote = 0;
|
|
65
|
+
const linesWithEmojisSet = new Set();
|
|
66
|
+
for (const grapheme of graphemes(text)) {
|
|
67
|
+
const graphemeLength = grapheme.length;
|
|
68
|
+
const inCodeBlock = isInPreservedRange(currentIndex, codeBlockRanges);
|
|
69
|
+
const inInlineCode = isInPreservedRange(currentIndex, inlineCodeRanges);
|
|
70
|
+
const inQuote = isInPreservedRange(currentIndex, quoteRanges);
|
|
71
|
+
const inPreserved = inCodeBlock || inInlineCode || inQuote;
|
|
72
|
+
const strippable = isStrippable(grapheme, emojiSet);
|
|
73
|
+
if (inPreserved || !strippable) {
|
|
74
|
+
chunks.push(grapheme);
|
|
75
|
+
// Count preserved emojis by type
|
|
76
|
+
if (inPreserved && strippable) {
|
|
77
|
+
if (inCodeBlock) {
|
|
78
|
+
keptCodeBlock++;
|
|
79
|
+
}
|
|
80
|
+
else if (inInlineCode) {
|
|
81
|
+
keptInlineCode++;
|
|
82
|
+
}
|
|
83
|
+
else if (inQuote) {
|
|
84
|
+
keptQuote++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
didChange = true;
|
|
90
|
+
removedCount++;
|
|
91
|
+
linesWithEmojisSet.add(currentLine);
|
|
92
|
+
if (config.mode === "replace" && emojiMap) {
|
|
93
|
+
const format = config.replacementFormat;
|
|
94
|
+
const replacement = getReplacement(grapheme, format, emojiMap);
|
|
95
|
+
chunks.push(replacement);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (grapheme === "\n") {
|
|
99
|
+
currentLine++;
|
|
100
|
+
}
|
|
101
|
+
currentIndex += graphemeLength;
|
|
102
|
+
}
|
|
103
|
+
const stats = {
|
|
104
|
+
removed: removedCount,
|
|
105
|
+
lines: Array.from(linesWithEmojisSet),
|
|
106
|
+
keptInlineCode,
|
|
107
|
+
keptCodeBlock,
|
|
108
|
+
keptQuote,
|
|
109
|
+
};
|
|
110
|
+
if (!didChange) {
|
|
111
|
+
return ok({ text, stats });
|
|
112
|
+
}
|
|
113
|
+
return ok({ text: chunks.join(""), stats });
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../src/core/processor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACN,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAezB,MAAM,UAAU,WAAW,CAC1B,IAAY,EACZ,MAAoB;IAEpB,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;YACT,IAAI;YACJ,KAAK,EAAE;gBACN,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,EAAE;gBACT,cAAc,EAAE,CAAC;gBACjB,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,CAAC;aACZ;SACD,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,EAAE,CAAC;IAEzC,IAAI,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;YACV,MAAM,EAAE,YAAqB;YAC7B,IAAI,EAAE,wBAAiC;YACvC,KAAK,EAAE,cAAc,CAAC,KAAK;SAC3B,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;IAEtC,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QAClD,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC;gBACV,MAAM,EAAE,YAAqB;gBAC7B,IAAI,EAAE,wBAAiC;gBACvC,KAAK,EAAE,cAAc,CAAC,KAAK;aAC3B,CAAC,CAAC;QACJ,CAAC;QAED,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,wDAAwD;IACxD,MAAM,eAAe,GAAgB,MAAM,CAAC,kBAAkB;QAC7D,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvB,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,KAAK;SACzB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,gBAAgB,GAAgB,MAAM,CAAC,kBAAkB;QAC9D,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvB,kBAAkB,EAAE,KAAK;YACzB,kBAAkB,EAAE,IAAI;SACxB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE;QACtC,mBAAmB,EAAE,MAAM,CAAC,UAAU;QACtC,oBAAoB,EAAE,MAAM,CAAC,UAAU;KACvC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvC,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,WAAW,IAAI,YAAY,IAAI,OAAO,CAAC;QAC3D,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,IAAI,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,iCAAiC;YACjC,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;gBAC/B,IAAI,WAAW,EAAE,CAAC;oBACjB,aAAa,EAAE,CAAC;gBACjB,CAAC;qBAAM,IAAI,YAAY,EAAE,CAAC;oBACzB,cAAc,EAAE,CAAC;gBAClB,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACpB,SAAS,EAAE,CAAC;gBACb,CAAC;YACF,CAAC;QACF,CAAC;aAAM,CAAC;YACP,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;gBACxC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC;QACf,CAAC;QACD,YAAY,IAAI,cAAc,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAiB;QAC3B,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACrC,cAAc;QACd,aAAa;QACb,SAAS;KACT,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,MAAM,qBAAqB,CAAC;AAwHzD,eAAO,MAAM,MAAM,EAAE,MAyGpB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { loadConfig } from "./core/config.js";
|
|
2
|
+
import { processText } from "./core/processor.js";
|
|
3
|
+
const MAX_MARKDOWN_CHARS = 1_000_000;
|
|
4
|
+
const hasMarkdownExtension = (filePath, extensions) => {
|
|
5
|
+
const lowerPath = filePath.toLowerCase();
|
|
6
|
+
for (const ext of extensions) {
|
|
7
|
+
if (lowerPath.endsWith(ext.toLowerCase())) {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
};
|
|
13
|
+
const getStringArg = (args, keys) => {
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
const value = args[key];
|
|
16
|
+
if (typeof value === "string") {
|
|
17
|
+
return { key, value };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
};
|
|
22
|
+
const sendNotification = async (client, sessionID, config, stats) => {
|
|
23
|
+
if (!config.showNotification || stats.removed === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!sessionID || typeof sessionID !== "string") {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!client || typeof client !== "object") {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const emojiWord = stats.removed === 1 ? "emoji" : "emojis";
|
|
33
|
+
let message = `UNMOJI | removed ${stats.removed} ${emojiWord}`;
|
|
34
|
+
if (stats.keptInlineCode > 0) {
|
|
35
|
+
const keptWord = stats.keptInlineCode === 1 ? "emoji" : "emojis";
|
|
36
|
+
message += ` | Kept ${stats.keptInlineCode} inline code ${keptWord}`;
|
|
37
|
+
}
|
|
38
|
+
if (stats.keptQuote > 0) {
|
|
39
|
+
const keptWord = stats.keptQuote === 1 ? "emoji" : "emojis";
|
|
40
|
+
message += ` | Kept ${stats.keptQuote} ${keptWord} in quotes`;
|
|
41
|
+
}
|
|
42
|
+
if (stats.keptCodeBlock > 0) {
|
|
43
|
+
const keptWord = stats.keptCodeBlock === 1 ? "emoji" : "emojis";
|
|
44
|
+
message += ` | Kept ${stats.keptCodeBlock} ${keptWord} in code blocks`;
|
|
45
|
+
}
|
|
46
|
+
if (config.notificationStyle === "thread-verbose") {
|
|
47
|
+
message += `\nLines: ${stats.lines.join(", ")}`;
|
|
48
|
+
}
|
|
49
|
+
const clientObj = client;
|
|
50
|
+
try {
|
|
51
|
+
if (config.notificationStyle === "toast" && clientObj.tui?.showToast) {
|
|
52
|
+
await clientObj.tui.showToast({
|
|
53
|
+
title: "UNMOJI",
|
|
54
|
+
message,
|
|
55
|
+
variant: "info",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else if (clientObj.session?.prompt) {
|
|
59
|
+
await clientObj.session.prompt({
|
|
60
|
+
path: { id: sessionID },
|
|
61
|
+
body: {
|
|
62
|
+
noReply: true,
|
|
63
|
+
parts: [{ type: "text", text: message, ignored: true }],
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Silent no-op - never fail the hook due to notification errors
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export const Unmoji = async ({ client }) => {
|
|
73
|
+
const configResult = loadConfig(process.cwd());
|
|
74
|
+
if (configResult.isErr()) {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
const config = configResult.value;
|
|
78
|
+
if (!config.enabled) {
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
"experimental.text.complete": async (_input, output) => {
|
|
83
|
+
try {
|
|
84
|
+
const result = processText(output.text, config);
|
|
85
|
+
if (result.isOk()) {
|
|
86
|
+
output.text = result.value.text;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"tool.execute.before": async (input, output) => {
|
|
94
|
+
try {
|
|
95
|
+
if (!config.processMarkdown) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const toolName = input.tool;
|
|
99
|
+
const args = output.args;
|
|
100
|
+
if (!args || typeof args !== "object") {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const argsRecord = args;
|
|
104
|
+
const filePathArg = getStringArg(argsRecord, ["filePath", "file_path"]);
|
|
105
|
+
if (!filePathArg) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (!hasMarkdownExtension(filePathArg.value, config.markdownExtensions)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (toolName === "write") {
|
|
112
|
+
const contentArg = getStringArg(argsRecord, ["content"]);
|
|
113
|
+
if (!contentArg) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (contentArg.value.length > MAX_MARKDOWN_CHARS) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const result = processText(contentArg.value, config);
|
|
120
|
+
if (result.isOk()) {
|
|
121
|
+
const processResult = result.value;
|
|
122
|
+
argsRecord[contentArg.key] = processResult.text;
|
|
123
|
+
await sendNotification(client, input.sessionID, config, processResult.stats);
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (toolName === "edit") {
|
|
128
|
+
const newStringArg = getStringArg(argsRecord, [
|
|
129
|
+
"newString",
|
|
130
|
+
"new_string",
|
|
131
|
+
]);
|
|
132
|
+
if (!newStringArg) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (newStringArg.value.length > MAX_MARKDOWN_CHARS) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const result = processText(newStringArg.value, config);
|
|
139
|
+
if (result.isOk()) {
|
|
140
|
+
const processResult = result.value;
|
|
141
|
+
argsRecord[newStringArg.key] = processResult.text;
|
|
142
|
+
await sendNotification(client, input.sessionID, config, processResult.stats);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
export default Unmoji;
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export type ReplacementStyle = "github" | "slack" | "discord" | "cldr" | "iamcal" | "joypixels";
|
|
3
|
+
export type MarkdownExtension = ".md" | ".mdx" | ".mdc" | ".markdown";
|
|
4
|
+
export type NotificationStyle = "thread" | "thread-verbose" | "toast";
|
|
5
|
+
export type UnmojiConfig = {
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
mode: "strip" | "replace";
|
|
8
|
+
replacementStyle: ReplacementStyle;
|
|
9
|
+
replacementFormat: ":name:" | "[:name:]" | "{name}";
|
|
10
|
+
preserveCodeBlocks: boolean;
|
|
11
|
+
preserveInlineCode: boolean;
|
|
12
|
+
skipQuotes: boolean;
|
|
13
|
+
processMarkdown: boolean;
|
|
14
|
+
markdownExtensions: MarkdownExtension[];
|
|
15
|
+
showNotification: boolean;
|
|
16
|
+
notificationStyle: NotificationStyle;
|
|
17
|
+
};
|
|
18
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
19
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
20
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
21
|
+
strip: "strip";
|
|
22
|
+
replace: "replace";
|
|
23
|
+
}>>;
|
|
24
|
+
replacementStyle: z.ZodDefault<z.ZodEnum<{
|
|
25
|
+
github: "github";
|
|
26
|
+
slack: "slack";
|
|
27
|
+
discord: "discord";
|
|
28
|
+
cldr: "cldr";
|
|
29
|
+
iamcal: "iamcal";
|
|
30
|
+
joypixels: "joypixels";
|
|
31
|
+
}>>;
|
|
32
|
+
replacementFormat: z.ZodDefault<z.ZodEnum<{
|
|
33
|
+
":name:": ":name:";
|
|
34
|
+
"[:name:]": "[:name:]";
|
|
35
|
+
"{name}": "{name}";
|
|
36
|
+
}>>;
|
|
37
|
+
preserveCodeBlocks: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
preserveInlineCode: z.ZodDefault<z.ZodBoolean>;
|
|
39
|
+
skipQuotes: z.ZodDefault<z.ZodBoolean>;
|
|
40
|
+
processMarkdown: z.ZodDefault<z.ZodBoolean>;
|
|
41
|
+
markdownExtensions: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
42
|
+
".md": ".md";
|
|
43
|
+
".mdx": ".mdx";
|
|
44
|
+
".mdc": ".mdc";
|
|
45
|
+
".markdown": ".markdown";
|
|
46
|
+
}>>>;
|
|
47
|
+
showNotification: z.ZodDefault<z.ZodBoolean>;
|
|
48
|
+
notificationStyle: z.ZodDefault<z.ZodEnum<{
|
|
49
|
+
thread: "thread";
|
|
50
|
+
"thread-verbose": "thread-verbose";
|
|
51
|
+
toast: "toast";
|
|
52
|
+
}>>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
export declare const DEFAULT_CONFIG: UnmojiConfig;
|
|
55
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,gBAAgB,GACzB,QAAQ,GACR,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACpD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,iBAAiB,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBvB,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,YAY5B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ConfigSchema = z.object({
|
|
3
|
+
enabled: z.boolean().default(true),
|
|
4
|
+
mode: z.enum(["strip", "replace"]).default("strip"),
|
|
5
|
+
replacementStyle: z
|
|
6
|
+
.enum(["github", "slack", "discord", "cldr", "iamcal", "joypixels"])
|
|
7
|
+
.default("github"),
|
|
8
|
+
replacementFormat: z
|
|
9
|
+
.enum([":name:", "[:name:]", "{name}"])
|
|
10
|
+
.default("[:name:]"),
|
|
11
|
+
preserveCodeBlocks: z.boolean().default(true),
|
|
12
|
+
preserveInlineCode: z.boolean().default(true),
|
|
13
|
+
skipQuotes: z.boolean().default(false),
|
|
14
|
+
processMarkdown: z.boolean().default(true),
|
|
15
|
+
markdownExtensions: z
|
|
16
|
+
.array(z.enum([".md", ".mdx", ".mdc", ".markdown"]))
|
|
17
|
+
.default([".md"]),
|
|
18
|
+
showNotification: z.boolean().default(true),
|
|
19
|
+
notificationStyle: z
|
|
20
|
+
.enum(["thread", "thread-verbose", "toast"])
|
|
21
|
+
.default("thread"),
|
|
22
|
+
});
|
|
23
|
+
export const DEFAULT_CONFIG = {
|
|
24
|
+
enabled: true,
|
|
25
|
+
mode: "strip",
|
|
26
|
+
replacementStyle: "github",
|
|
27
|
+
replacementFormat: "[:name:]",
|
|
28
|
+
preserveCodeBlocks: true,
|
|
29
|
+
preserveInlineCode: true,
|
|
30
|
+
skipQuotes: false,
|
|
31
|
+
processMarkdown: true,
|
|
32
|
+
markdownExtensions: [".md"],
|
|
33
|
+
showNotification: true,
|
|
34
|
+
notificationStyle: "thread",
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=config.js.map
|