@inlang/sdk 0.35.5 → 0.35.6
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/dist/api.d.ts +2 -13
- package/dist/api.d.ts.map +1 -1
- package/dist/createNewProject.test.js +1 -3
- package/dist/loadProject.d.ts.map +1 -1
- package/dist/loadProject.js +67 -32
- package/dist/loadProject.test.js +6 -2
- package/dist/persistence/batchedIO.d.ts +11 -0
- package/dist/persistence/batchedIO.d.ts.map +1 -0
- package/dist/persistence/batchedIO.js +49 -0
- package/dist/persistence/batchedIO.test.d.ts +2 -0
- package/dist/persistence/batchedIO.test.d.ts.map +1 -0
- package/dist/persistence/batchedIO.test.js +56 -0
- package/dist/persistence/filelock/acquireFileLock.d.ts.map +1 -1
- package/dist/persistence/filelock/acquireFileLock.js +3 -1
- package/dist/persistence/filelock/releaseLock.d.ts.map +1 -1
- package/dist/persistence/filelock/releaseLock.js +2 -1
- package/dist/persistence/store.d.ts +107 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +99 -0
- package/dist/persistence/store.test.d.ts +2 -0
- package/dist/persistence/store.test.d.ts.map +1 -0
- package/dist/persistence/store.test.js +79 -0
- package/dist/persistence/storeApi.d.ts +22 -0
- package/dist/persistence/storeApi.d.ts.map +1 -0
- package/dist/persistence/storeApi.js +1 -0
- package/dist/reactivity/solid.test.js +1 -6
- package/dist/resolve-modules/plugins/resolvePlugins.d.ts.map +1 -1
- package/dist/resolve-modules/plugins/resolvePlugins.js +3 -10
- package/dist/test-utilities/sleep.d.ts +4 -0
- package/dist/test-utilities/sleep.d.ts.map +1 -0
- package/dist/test-utilities/sleep.js +9 -0
- package/dist/v2/helper.d.ts +131 -0
- package/dist/v2/helper.d.ts.map +1 -0
- package/dist/v2/helper.js +75 -0
- package/dist/v2/helper.test.d.ts +2 -0
- package/dist/v2/helper.test.d.ts.map +1 -0
- package/dist/v2/{createMessageBundle.test.js → helper.test.js} +1 -1
- package/dist/v2/index.d.ts +2 -0
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/index.js +2 -1
- package/dist/v2/mocks/index.d.ts +3 -0
- package/dist/v2/mocks/index.d.ts.map +1 -0
- package/dist/v2/mocks/index.js +2 -0
- package/dist/v2/mocks/multipleMatcher/bundle.d.ts +3 -0
- package/dist/v2/mocks/multipleMatcher/bundle.d.ts.map +1 -0
- package/dist/v2/mocks/multipleMatcher/bundle.js +194 -0
- package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts +2 -0
- package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts.map +1 -0
- package/dist/v2/mocks/multipleMatcher/bundle.test.js +10 -0
- package/dist/v2/mocks/plural/bundle.d.ts +1 -1
- package/dist/v2/mocks/plural/bundle.d.ts.map +1 -1
- package/dist/v2/mocks/plural/bundle.js +1 -1
- package/dist/v2/mocks/plural/bundle.test.js +6 -6
- package/dist/v2/shim.d.ts +12 -0
- package/dist/v2/shim.d.ts.map +1 -0
- package/dist/v2/shim.js +151 -0
- package/dist/v2/shim.test.d.ts +2 -0
- package/dist/v2/shim.test.d.ts.map +1 -0
- package/dist/v2/shim.test.js +49 -0
- package/dist/v2/stubQueryApi.d.ts +9 -0
- package/dist/v2/stubQueryApi.d.ts.map +1 -0
- package/dist/v2/stubQueryApi.js +38 -0
- package/dist/v2/types.d.ts +110 -0
- package/dist/v2/types.d.ts.map +1 -1
- package/dist/v2/types.js +9 -0
- package/package.json +8 -7
- package/src/api.ts +2 -13
- package/src/createNewProject.test.ts +1 -4
- package/src/loadProject.test.ts +6 -2
- package/src/loadProject.ts +86 -45
- package/src/persistence/batchedIO.test.ts +63 -0
- package/src/persistence/batchedIO.ts +64 -0
- package/src/persistence/filelock/acquireFileLock.ts +5 -2
- package/src/persistence/filelock/releaseLock.ts +2 -1
- package/src/persistence/store.test.ts +102 -0
- package/src/persistence/store.ts +119 -0
- package/src/persistence/storeApi.ts +19 -0
- package/src/reactivity/solid.test.ts +1 -8
- package/src/resolve-modules/plugins/resolvePlugins.ts +4 -13
- package/src/test-utilities/sleep.ts +11 -0
- package/src/v2/{createMessageBundle.test.ts → helper.test.ts} +1 -1
- package/src/v2/helper.ts +98 -0
- package/src/v2/index.ts +2 -0
- package/src/v2/mocks/index.ts +2 -0
- package/src/v2/mocks/multipleMatcher/bundle.test.ts +11 -0
- package/src/v2/mocks/multipleMatcher/bundle.ts +196 -0
- package/src/v2/mocks/plural/bundle.test.ts +6 -6
- package/src/v2/mocks/plural/bundle.ts +1 -1
- package/src/v2/shim.test.ts +56 -0
- package/src/v2/shim.ts +173 -0
- package/src/v2/stubQueryApi.ts +43 -0
- package/src/v2/types.ts +17 -0
- package/dist/persistence/plugin.d.ts +0 -31
- package/dist/persistence/plugin.d.ts.map +0 -1
- package/dist/persistence/plugin.js +0 -42
- package/dist/persistence/plugin.test.d.ts +0 -2
- package/dist/persistence/plugin.test.d.ts.map +0 -1
- package/dist/persistence/plugin.test.js +0 -49
- package/dist/v2/createMessageBundle.d.ts +0 -25
- package/dist/v2/createMessageBundle.d.ts.map +0 -1
- package/dist/v2/createMessageBundle.js +0 -36
- package/dist/v2/createMessageBundle.test.d.ts +0 -2
- package/dist/v2/createMessageBundle.test.d.ts.map +0 -1
- package/src/persistence/plugin.test.ts +0 -60
- package/src/persistence/plugin.ts +0 -56
- package/src/v2/createMessageBundle.ts +0 -43
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { getDirname } from "@lix-js/fs";
|
|
2
|
-
import { normalizeMessage } from "../storage/helper.js";
|
|
3
|
-
import _debug from "debug";
|
|
4
|
-
const debug = _debug("sdk:persistence");
|
|
5
|
-
export const pluginId = "plugin.sdk.persistence";
|
|
6
|
-
export async function loadMessages(args) {
|
|
7
|
-
let result = [];
|
|
8
|
-
const pathPattern = args.settings[pluginId]?.pathPattern;
|
|
9
|
-
debug("loadMessages", pathPattern);
|
|
10
|
-
try {
|
|
11
|
-
const file = await args.nodeishFs.readFile(pathPattern, { encoding: "utf-8" });
|
|
12
|
-
result = JSON.parse(file);
|
|
13
|
-
}
|
|
14
|
-
catch (error) {
|
|
15
|
-
if (error?.code !== "ENOENT") {
|
|
16
|
-
debug("loadMessages", error);
|
|
17
|
-
throw error;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return result;
|
|
21
|
-
}
|
|
22
|
-
export async function saveMessages(args) {
|
|
23
|
-
const pathPattern = args.settings[pluginId]?.pathPattern;
|
|
24
|
-
debug("saveMessages", pathPattern);
|
|
25
|
-
try {
|
|
26
|
-
await createDirectoryIfNotExits(getDirname(pathPattern), args.nodeishFs);
|
|
27
|
-
await args.nodeishFs.writeFile(pathPattern,
|
|
28
|
-
// 2 spaces indentation
|
|
29
|
-
JSON.stringify(args.messages.map(normalizeMessage), undefined, 2));
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
debug("saveMessages", error);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async function createDirectoryIfNotExits(path, nodeishFs) {
|
|
36
|
-
try {
|
|
37
|
-
await nodeishFs.mkdir(path, { recursive: true });
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// assume that the directory already exists
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../src/persistence/plugin.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "vitest";
|
|
2
|
-
import { createMessage, createNodeishMemoryFs } from "../test-utilities/index.js";
|
|
3
|
-
import { normalizeMessage } from "../storage/helper.js";
|
|
4
|
-
import { pluginId } from "./plugin.js";
|
|
5
|
-
const mockMessages = [
|
|
6
|
-
createMessage("first_message", {
|
|
7
|
-
en: "If this fails I will be sad",
|
|
8
|
-
}),
|
|
9
|
-
createMessage("second_message", {
|
|
10
|
-
en: "Let's see if this works",
|
|
11
|
-
de: "Mal sehen ob das funktioniert",
|
|
12
|
-
}),
|
|
13
|
-
];
|
|
14
|
-
// the test ensures:
|
|
15
|
-
// - messages can be loaded
|
|
16
|
-
// - messages can be saved
|
|
17
|
-
// - after loading and saving messages, the state is the same as before (roundtrip)
|
|
18
|
-
test("roundtrip (saving/loading messages)", async () => {
|
|
19
|
-
const { loadMessages, saveMessages } = await import("./plugin.js");
|
|
20
|
-
const fs = createNodeishMemoryFs();
|
|
21
|
-
const projectDir = "/test/project.inlang";
|
|
22
|
-
const pathPattern = projectDir + "/messages.json";
|
|
23
|
-
const persistedMessages = JSON.stringify(mockMessages.map(normalizeMessage), undefined, 2);
|
|
24
|
-
const settings = {
|
|
25
|
-
sourceLanguageTag: "en",
|
|
26
|
-
languageTags: ["en", "de"],
|
|
27
|
-
modules: [],
|
|
28
|
-
[pluginId]: { pathPattern },
|
|
29
|
-
};
|
|
30
|
-
await fs.mkdir(projectDir, { recursive: true });
|
|
31
|
-
await fs.writeFile(pathPattern, persistedMessages);
|
|
32
|
-
const firstMessageLoad = await loadMessages({
|
|
33
|
-
settings,
|
|
34
|
-
nodeishFs: fs,
|
|
35
|
-
});
|
|
36
|
-
expect(firstMessageLoad).toStrictEqual(mockMessages);
|
|
37
|
-
await saveMessages({
|
|
38
|
-
settings,
|
|
39
|
-
nodeishFs: fs,
|
|
40
|
-
messages: firstMessageLoad,
|
|
41
|
-
});
|
|
42
|
-
const afterRoundtrip = await fs.readFile(pathPattern, { encoding: "utf-8" });
|
|
43
|
-
expect(afterRoundtrip).toStrictEqual(persistedMessages);
|
|
44
|
-
const messagesAfterRoundtrip = await loadMessages({
|
|
45
|
-
settings,
|
|
46
|
-
nodeishFs: fs,
|
|
47
|
-
});
|
|
48
|
-
expect(messagesAfterRoundtrip).toStrictEqual(firstMessageLoad);
|
|
49
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { LanguageTag, MessageBundle, Message } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* create v2 MessageBundle
|
|
4
|
-
* @example createMessageBundle({
|
|
5
|
-
* id: "greeting",
|
|
6
|
-
* messages: [
|
|
7
|
-
* createMessage({locale: "en", text: "Hello world!"})
|
|
8
|
-
* createMessage({locale: "de", text: "Hallo Welt!"})
|
|
9
|
-
* ]
|
|
10
|
-
* })
|
|
11
|
-
*/
|
|
12
|
-
export declare function createMessageBundle(args: {
|
|
13
|
-
id: string;
|
|
14
|
-
messages: Message[];
|
|
15
|
-
alias?: MessageBundle["alias"];
|
|
16
|
-
}): MessageBundle;
|
|
17
|
-
/**
|
|
18
|
-
* create v2 Messsage AST with text-only pattern
|
|
19
|
-
* @example createMessage({locale: "en", text: "Hello world"})
|
|
20
|
-
*/
|
|
21
|
-
export declare function createMessage(args: {
|
|
22
|
-
locale: LanguageTag;
|
|
23
|
-
text: string;
|
|
24
|
-
}): Message;
|
|
25
|
-
//# sourceMappingURL=createMessageBundle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMessageBundle.d.ts","sourceRoot":"","sources":["../../src/v2/createMessageBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAQ,MAAM,YAAY,CAAA;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAC9B,GAAG,aAAa,CAMhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAOlF"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { LanguageTag, MessageBundle, Message, Text } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* create v2 MessageBundle
|
|
4
|
-
* @example createMessageBundle({
|
|
5
|
-
* id: "greeting",
|
|
6
|
-
* messages: [
|
|
7
|
-
* createMessage({locale: "en", text: "Hello world!"})
|
|
8
|
-
* createMessage({locale: "de", text: "Hallo Welt!"})
|
|
9
|
-
* ]
|
|
10
|
-
* })
|
|
11
|
-
*/
|
|
12
|
-
export function createMessageBundle(args) {
|
|
13
|
-
return {
|
|
14
|
-
id: args.id,
|
|
15
|
-
alias: args.alias ?? {},
|
|
16
|
-
messages: args.messages,
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* create v2 Messsage AST with text-only pattern
|
|
21
|
-
* @example createMessage({locale: "en", text: "Hello world"})
|
|
22
|
-
*/
|
|
23
|
-
export function createMessage(args) {
|
|
24
|
-
return {
|
|
25
|
-
locale: args.locale,
|
|
26
|
-
declarations: [],
|
|
27
|
-
selectors: [],
|
|
28
|
-
variants: [{ match: [], pattern: [toTextElement(args.text ?? "")] }],
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function toTextElement(text) {
|
|
32
|
-
return {
|
|
33
|
-
type: "text",
|
|
34
|
-
value: text,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createMessageBundle.test.d.ts","sourceRoot":"","sources":["../../src/v2/createMessageBundle.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "vitest"
|
|
2
|
-
import { createMessage, createNodeishMemoryFs } from "../test-utilities/index.js"
|
|
3
|
-
import { normalizeMessage } from "../storage/helper.js"
|
|
4
|
-
import { pluginId } from "./plugin.js"
|
|
5
|
-
|
|
6
|
-
const mockMessages = [
|
|
7
|
-
createMessage("first_message", {
|
|
8
|
-
en: "If this fails I will be sad",
|
|
9
|
-
}),
|
|
10
|
-
createMessage("second_message", {
|
|
11
|
-
en: "Let's see if this works",
|
|
12
|
-
de: "Mal sehen ob das funktioniert",
|
|
13
|
-
}),
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
// the test ensures:
|
|
17
|
-
// - messages can be loaded
|
|
18
|
-
// - messages can be saved
|
|
19
|
-
// - after loading and saving messages, the state is the same as before (roundtrip)
|
|
20
|
-
test("roundtrip (saving/loading messages)", async () => {
|
|
21
|
-
const { loadMessages, saveMessages } = await import("./plugin.js")
|
|
22
|
-
const fs = createNodeishMemoryFs()
|
|
23
|
-
const projectDir = "/test/project.inlang"
|
|
24
|
-
const pathPattern = projectDir + "/messages.json"
|
|
25
|
-
const persistedMessages = JSON.stringify(mockMessages.map(normalizeMessage), undefined, 2)
|
|
26
|
-
|
|
27
|
-
const settings = {
|
|
28
|
-
sourceLanguageTag: "en",
|
|
29
|
-
languageTags: ["en", "de"],
|
|
30
|
-
modules: [],
|
|
31
|
-
[pluginId]: { pathPattern },
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
await fs.mkdir(projectDir, { recursive: true })
|
|
35
|
-
await fs.writeFile(pathPattern, persistedMessages)
|
|
36
|
-
|
|
37
|
-
const firstMessageLoad = await loadMessages({
|
|
38
|
-
settings,
|
|
39
|
-
nodeishFs: fs,
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
expect(firstMessageLoad).toStrictEqual(mockMessages)
|
|
43
|
-
|
|
44
|
-
await saveMessages({
|
|
45
|
-
settings,
|
|
46
|
-
nodeishFs: fs,
|
|
47
|
-
messages: firstMessageLoad,
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
const afterRoundtrip = await fs.readFile(pathPattern, { encoding: "utf-8" })
|
|
51
|
-
|
|
52
|
-
expect(afterRoundtrip).toStrictEqual(persistedMessages)
|
|
53
|
-
|
|
54
|
-
const messagesAfterRoundtrip = await loadMessages({
|
|
55
|
-
settings,
|
|
56
|
-
nodeishFs: fs,
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
expect(messagesAfterRoundtrip).toStrictEqual(firstMessageLoad)
|
|
60
|
-
})
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { ProjectSettings, Message } from "@inlang/sdk"
|
|
2
|
-
import { getDirname, type NodeishFilesystem } from "@lix-js/fs"
|
|
3
|
-
import { normalizeMessage } from "../storage/helper.js"
|
|
4
|
-
|
|
5
|
-
import _debug from "debug"
|
|
6
|
-
const debug = _debug("sdk:persistence")
|
|
7
|
-
|
|
8
|
-
export const pluginId = "plugin.sdk.persistence"
|
|
9
|
-
|
|
10
|
-
export async function loadMessages(args: {
|
|
11
|
-
settings: ProjectSettings
|
|
12
|
-
nodeishFs: NodeishFilesystem
|
|
13
|
-
}) {
|
|
14
|
-
let result: Message[] = []
|
|
15
|
-
const pathPattern = args.settings[pluginId]?.pathPattern as string
|
|
16
|
-
|
|
17
|
-
debug("loadMessages", pathPattern)
|
|
18
|
-
try {
|
|
19
|
-
const file = await args.nodeishFs.readFile(pathPattern, { encoding: "utf-8" })
|
|
20
|
-
result = JSON.parse(file)
|
|
21
|
-
} catch (error) {
|
|
22
|
-
if ((error as any)?.code !== "ENOENT") {
|
|
23
|
-
debug("loadMessages", error)
|
|
24
|
-
throw error
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return result
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function saveMessages(args: {
|
|
31
|
-
settings: ProjectSettings
|
|
32
|
-
nodeishFs: NodeishFilesystem
|
|
33
|
-
messages: Message[]
|
|
34
|
-
}) {
|
|
35
|
-
const pathPattern = args.settings[pluginId]?.pathPattern as string
|
|
36
|
-
|
|
37
|
-
debug("saveMessages", pathPattern)
|
|
38
|
-
try {
|
|
39
|
-
await createDirectoryIfNotExits(getDirname(pathPattern), args.nodeishFs)
|
|
40
|
-
await args.nodeishFs.writeFile(
|
|
41
|
-
pathPattern,
|
|
42
|
-
// 2 spaces indentation
|
|
43
|
-
JSON.stringify(args.messages.map(normalizeMessage), undefined, 2)
|
|
44
|
-
)
|
|
45
|
-
} catch (error) {
|
|
46
|
-
debug("saveMessages", error)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async function createDirectoryIfNotExits(path: string, nodeishFs: NodeishFilesystem) {
|
|
51
|
-
try {
|
|
52
|
-
await nodeishFs.mkdir(path, { recursive: true })
|
|
53
|
-
} catch {
|
|
54
|
-
// assume that the directory already exists
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { LanguageTag, MessageBundle, Message, Text } from "./types.js"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* create v2 MessageBundle
|
|
5
|
-
* @example createMessageBundle({
|
|
6
|
-
* id: "greeting",
|
|
7
|
-
* messages: [
|
|
8
|
-
* createMessage({locale: "en", text: "Hello world!"})
|
|
9
|
-
* createMessage({locale: "de", text: "Hallo Welt!"})
|
|
10
|
-
* ]
|
|
11
|
-
* })
|
|
12
|
-
*/
|
|
13
|
-
export function createMessageBundle(args: {
|
|
14
|
-
id: string
|
|
15
|
-
messages: Message[]
|
|
16
|
-
alias?: MessageBundle["alias"]
|
|
17
|
-
}): MessageBundle {
|
|
18
|
-
return {
|
|
19
|
-
id: args.id,
|
|
20
|
-
alias: args.alias ?? {},
|
|
21
|
-
messages: args.messages,
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* create v2 Messsage AST with text-only pattern
|
|
27
|
-
* @example createMessage({locale: "en", text: "Hello world"})
|
|
28
|
-
*/
|
|
29
|
-
export function createMessage(args: { locale: LanguageTag; text: string }): Message {
|
|
30
|
-
return {
|
|
31
|
-
locale: args.locale,
|
|
32
|
-
declarations: [],
|
|
33
|
-
selectors: [],
|
|
34
|
-
variants: [{ match: [], pattern: [toTextElement(args.text ?? "")] }],
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function toTextElement(text: string): Text {
|
|
39
|
-
return {
|
|
40
|
-
type: "text",
|
|
41
|
-
value: text,
|
|
42
|
-
}
|
|
43
|
-
}
|