glotstack 0.0.3 → 0.0.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/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
27
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
28
+ return new (P || (P = Promise))(function (resolve, reject) {
29
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
30
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
31
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
32
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
33
+ });
34
+ };
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const commander_1 = require("commander");
40
+ const path_1 = __importDefault(require("path"));
41
+ const fs_1 = require("fs");
42
+ const findConfig_1 = require("./util/findConfig");
43
+ const process_1 = require("process");
44
+ const object_1 = require("./util/object");
45
+ const yaml_1 = require("./util/yaml");
46
+ const eslint_1 = __importDefault(require("eslint"));
47
+ const readline = __importStar(require("node:readline/promises"));
48
+ const node_process_1 = require("node:process");
49
+ const fetchGlotstack = (apiOrigin, apiKey, body) => __awaiter(void 0, void 0, void 0, function* () {
50
+ const url = `${apiOrigin}/api/translations`;
51
+ console.info(`Fetching translations from: ${url}`);
52
+ const headers = {
53
+ 'Content-Type': 'application/json',
54
+ 'Authorization': `Bearer ${apiKey}`,
55
+ };
56
+ try {
57
+ const res = yield fetch(url, { method: 'POST', body: JSON.stringify(body), headers });
58
+ if (!res.ok)
59
+ throw new Error(`HTTP ${res.status}: ${res.statusText}`);
60
+ return res.json();
61
+ // fs.writeFile(`${outputDir}/source.json`, JSON.stringify(json, null, 2))
62
+ }
63
+ catch (err) {
64
+ console.error('Fetch failed:', err);
65
+ process.exit(1);
66
+ }
67
+ });
68
+ function run(args) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ var _a, _b;
71
+ commander_1.program
72
+ .command('extract-translations')
73
+ .option('--source-path [path]', 'to source files root directory', '.')
74
+ .option('--api-origin [url]', 'glotstack api origin', (_a = process.env.GLOTSTACK_HOST) !== null && _a !== void 0 ? _a : 'https://glotstack.ai')
75
+ .option('--yes', 'skip confirm checks', false)
76
+ .action((options) => __awaiter(this, void 0, void 0, function* () {
77
+ if (!options.apiOrigin) {
78
+ throw new Error('apiOrigin must be specified');
79
+ }
80
+ const linter = new eslint_1.default.ESLint({ overrideConfigFile: path_1.default.join(__dirname, '..', 'eslint-raw-string.mjs') });
81
+ const results = yield linter.lintFiles(["./**/*"]);
82
+ const filesWithIssues = results
83
+ .filter((r) => r.errorCount + r.warningCount > 0)
84
+ .map((r) => r.filePath);
85
+ const rl = readline.createInterface({ input: node_process_1.stdin, output: node_process_1.stdout });
86
+ const askToSend = () => __awaiter(this, void 0, void 0, function* () {
87
+ if (options.yes) {
88
+ return true;
89
+ }
90
+ const response = yield rl.question(`Your source are going to be sent to our LLM -- they should not contain any secrets. Proceed? (yes/no):`);
91
+ if (response === 'yes') {
92
+ return true;
93
+ }
94
+ else if (response !== 'no') {
95
+ console.error('Please respond with yes or no.');
96
+ return askToSend();
97
+ }
98
+ else {
99
+ return false;
100
+ }
101
+ });
102
+ const send = yield askToSend();
103
+ if (send) {
104
+ console.info('Sending files to LLM');
105
+ rl.close();
106
+ }
107
+ else {
108
+ rl.close();
109
+ }
110
+ }));
111
+ commander_1.program
112
+ .command('get-translations')
113
+ .option('--source-path [path]', 'path to en-US.json (or your canonical source json)')
114
+ .option('--api-origin [url]', 'glotstack api origin', (_b = process.env.GLOTSTACK_HOST) !== null && _b !== void 0 ? _b : 'https://glotstack.ai')
115
+ .option('--output-dir [path]', 'path to output directory')
116
+ .option('--api-key [key]', 'api key for glotstack.ai')
117
+ .option('--project-id [id]', '(optional) specific project to use')
118
+ .argument('[output-locales...]', 'locales to get translations for')
119
+ .action((outputLocales, options, command) => __awaiter(this, void 0, void 0, function* () {
120
+ const configPath = (0, findConfig_1.findGlotstackConfig)((0, process_1.cwd)());
121
+ let config = {};
122
+ if (configPath != null) {
123
+ console.info('Loading config file at ', configPath);
124
+ try {
125
+ const text = yield fs_1.promises.readFile(configPath, 'utf-8');
126
+ config = JSON.parse(text);
127
+ console.info('Loaded config file', config);
128
+ }
129
+ catch (err) {
130
+ //pass
131
+ }
132
+ }
133
+ const resolved = (0, object_1.merge)(config, options, { outputLocales });
134
+ const { apiOrigin, sourcePath, outputDir, projectId } = resolved;
135
+ if (resolved.outputLocales.includes('en-US')) {
136
+ console.warn('en-US detected in outputLocales, removing');
137
+ resolved.outputLocales = resolved.outputLocales.filter((x) => x !== 'en-US');
138
+ }
139
+ if (!sourcePath) {
140
+ throw new Error('sourcePath must be specified');
141
+ }
142
+ if (!apiOrigin) {
143
+ throw new Error('apiOrigin must be specified');
144
+ }
145
+ if (!outputDir) {
146
+ throw new Error('outputDir must be specified');
147
+ }
148
+ const absPath = path_1.default.resolve(sourcePath);
149
+ const fileContent = yield fs_1.promises.readFile(absPath, 'utf-8');
150
+ let json = null;
151
+ try {
152
+ json = (0, yaml_1.loadYaml)(fileContent);
153
+ }
154
+ catch (err) {
155
+ try {
156
+ json = JSON.parse(fileContent);
157
+ }
158
+ catch (err) {
159
+ console.error('Unable to parse source file ', absPath, err);
160
+ throw err;
161
+ }
162
+ }
163
+ const body = Object.assign({ locales: resolved.outputLocales, translations: json }, Object.assign({}, (projectId != null ? { projectId } : {})));
164
+ const data = yield fetchGlotstack(apiOrigin, resolved.apiKey, body);
165
+ console.info('Received translations:', data);
166
+ Object.entries(data.data).map(([key, val]) => {
167
+ const p = `${outputDir}/${key}.json`;
168
+ console.info(`Writing file ${p}`);
169
+ fs_1.promises.writeFile(`${outputDir}/${key}.json`, JSON.stringify(val, null, 2));
170
+ });
171
+ }));
172
+ yield commander_1.program.parseAsync(args);
173
+ });
174
+ }
175
+ run(process.argv);
176
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,19 +9,25 @@ export interface Translations {
9
9
  }
10
10
  export interface ContextType {
11
11
  translations: Translations;
12
- requireTranslations: (localeRegion: string) => Promise<unknown>;
13
- setLocale: (locale: LocaleRegion) => Promise<unknown>;
14
12
  locale: string | null;
13
+ loadTranslations: (locale: LocaleRegion) => Promise<Translations>;
14
+ setLocale: (locale: LocaleRegion) => void;
15
+ importMethod: (locale: LocaleRegion) => Promise<Translations>;
15
16
  t: (key: string, options?: {
16
17
  locale?: LocaleRegion;
17
18
  }) => string;
18
19
  }
19
20
  export declare const GlotstackContext: React.Context<ContextType>;
20
- export declare const Provider: ({ children, locale: defaultLocale, onUpdated, initialTranslations, onLocaleChange }: {
21
+ interface GlotstackProviderProps {
21
22
  children: React.ReactNode;
22
- locale: string;
23
- onUpdated: (value: ContextType) => void;
24
23
  initialTranslations?: Translations;
25
- onLocaleChange: (locale: string | null, value: ContextType) => void;
26
- }) => React.JSX.Element;
24
+ initialLocale?: LocaleRegion;
25
+ onTranslationLoaded?: (locale: LocaleRegion, translations: Translations) => void;
26
+ onLocaleChange?: (locale: LocaleRegion) => void;
27
+ importMethod: (locale: LocaleRegion) => Promise<Translations>;
28
+ }
29
+ export declare const access: (key: string, locale: LocaleRegion, translations: Translations) => string;
30
+ export declare const GlotstackProvider: ({ children, initialLocale, initialTranslations, onLocaleChange, onTranslationLoaded, importMethod }: GlotstackProviderProps) => React.JSX.Element;
31
+ export declare const useGlotstack: () => ContextType;
27
32
  export declare const useTranslations: (_options?: Record<never, never>) => ContextType;
33
+ export {};
package/dist/index.js CHANGED
@@ -32,102 +32,96 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
32
32
  });
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.useTranslations = exports.Provider = exports.GlotstackContext = void 0;
35
+ exports.useTranslations = exports.useGlotstack = exports.GlotstackProvider = exports.access = exports.GlotstackContext = void 0;
36
36
  const React = __importStar(require("react"));
37
- const object_1 = require("./util/object");
38
37
  exports.GlotstackContext = React.createContext({
39
38
  translations: {},
40
- requireTranslations: () => Promise.resolve(),
41
- setLocale: (_locale) => Promise.resolve(),
39
+ loadTranslations: () => { throw new Error('no import method set'); },
40
+ setLocale: (_locale) => { throw new Error('import method not set'); },
42
41
  locale: null,
43
- t: () => '',
42
+ importMethod: (_locale) => { throw new Error('import method not set'); },
43
+ t: () => { throw new Error('import method not set'); },
44
44
  });
45
- const Provider = ({ children, locale: defaultLocale, onUpdated, initialTranslations, onLocaleChange }) => {
46
- const [translations, setTranslations] = React.useState(initialTranslations !== null && initialTranslations !== void 0 ? initialTranslations : {});
45
+ const access = (key, locale, translations) => {
46
+ var _a;
47
+ const access = [...key.split('.')];
48
+ const localeTranslations = translations === null || translations === void 0 ? void 0 : translations[locale];
49
+ if (localeTranslations == null) {
50
+ return key;
51
+ }
52
+ const value = access.reduce((acc, key) => {
53
+ // @ts-expect-error expected
54
+ return acc === null || acc === void 0 ? void 0 : acc[key];
55
+ }, localeTranslations);
56
+ return ((_a = value === null || value === void 0 ? void 0 : value.value) !== null && _a !== void 0 ? _a : key);
57
+ };
58
+ exports.access = access;
59
+ const GlotstackProvider = ({ children, initialLocale, initialTranslations, onLocaleChange, onTranslationLoaded, importMethod }) => {
60
+ if (initialLocale == null) {
61
+ throw new Error('initialLocale must be set');
62
+ }
63
+ const [locale, setLocale] = React.useState(initialLocale);
64
+ const translationsRef = React.useRef(initialTranslations);
47
65
  const loadingRef = React.useRef({});
48
- const [locale, setLocalLocale] = React.useState(defaultLocale);
49
- React.useEffect(() => {
50
- setLocalLocale(defaultLocale);
51
- }, [defaultLocale]);
52
- const requireTranslations = React.useMemo(() => {
53
- return (locale) => {
54
- var _a;
55
- const current = translations === null || translations === void 0 ? void 0 : translations[locale];
56
- if (current != null) {
57
- return Promise.resolve();
66
+ const loadTranslations = React.useCallback((locale) => __awaiter(void 0, void 0, void 0, function* () {
67
+ var _a, _b;
68
+ // TODO: if translations are loaded only reload if some condition is
69
+ try {
70
+ if (((_a = loadingRef.current) === null || _a === void 0 ? void 0 : _a[locale]) != null) {
71
+ return (yield ((_b = loadingRef.current) === null || _b === void 0 ? void 0 : _b[locale]));
58
72
  }
59
- if (((_a = loadingRef.current) === null || _a === void 0 ? void 0 : _a[locale]) == null) {
60
- loadingRef.current[locale] = Promise.resolve(`${`domains/application/translations/${locale}.json`}`).then(s => __importStar(require(s)));
73
+ loadingRef.current[locale] = importMethod(locale);
74
+ const result = yield loadingRef.current[locale];
75
+ if (result == null) {
76
+ throw new Error(`Failed to load translation ${locale} ${JSON.stringify(result)}`);
61
77
  }
62
- loadingRef.current[locale].then((Module) => __awaiter(void 0, void 0, void 0, function* () {
63
- if ((Module === null || Module === void 0 ? void 0 : Module.default) != null) {
64
- const data = yield (yield fetch(Module.default)).json();
65
- setTranslations((0, object_1.merge)({}, translations, { [locale]: data }));
66
- }
67
- }));
68
- return loadingRef.current[locale];
69
- };
70
- }, [locale, translations]);
71
- const t = React.useMemo(() => (key, options) => {
72
- var _a;
73
- React.useEffect(() => {
74
- var _a;
75
- if ((options === null || options === void 0 ? void 0 : options.locale) == null) {
76
- return;
78
+ if (translationsRef.current) {
79
+ translationsRef.current[locale] = result;
77
80
  }
78
- (_a = requireTranslations(options === null || options === void 0 ? void 0 : options.locale)) === null || _a === void 0 ? void 0 : _a.then(() => {
79
- if ((options === null || options === void 0 ? void 0 : options.locale) == null) {
80
- return;
81
- }
82
- setLocale(options === null || options === void 0 ? void 0 : options.locale);
83
- });
84
- }, [locale]);
85
- if (translations === null) {
86
- return key;
81
+ onTranslationLoaded === null || onTranslationLoaded === void 0 ? void 0 : onTranslationLoaded(locale, result);
82
+ return result;
87
83
  }
88
- const access = [...key.split('.')];
89
- const localeTranslations = translations === null || translations === void 0 ? void 0 : translations[locale];
90
- if (localeTranslations == null) {
91
- return key;
84
+ catch (err) {
85
+ console.error('Unable to import translations', err);
86
+ throw err;
92
87
  }
93
- const value = access.reduce((acc, key) => {
94
- // @ts-expect-error expected
95
- return acc === null || acc === void 0 ? void 0 : acc[key];
96
- }, localeTranslations);
97
- return ((_a = value === null || value === void 0 ? void 0 : value.value) !== null && _a !== void 0 ? _a : key);
98
- }, [translations, requireTranslations]);
99
- const setLocale = React.useMemo(() => (locale) => {
100
- setLocalLocale(locale);
101
- return requireTranslations(locale).then(_ => {
102
- onLocaleChange(valueRef.current.locale, valueRef.current);
103
- });
104
- }, [setLocalLocale, requireTranslations]);
105
- const valueRef = React.useRef({
106
- requireTranslations,
107
- locale,
108
- translations: initialTranslations !== null && initialTranslations !== void 0 ? initialTranslations : {},
109
- setLocale,
110
- t
111
- });
112
- const current = valueRef.current;
88
+ }), [importMethod, onTranslationLoaded]);
113
89
  React.useEffect(() => {
114
- valueRef.current = {
115
- translations,
116
- requireTranslations,
90
+ const run = () => __awaiter(void 0, void 0, void 0, function* () {
91
+ onLocaleChange === null || onLocaleChange === void 0 ? void 0 : onLocaleChange(locale);
92
+ const result = yield loadTranslations(locale);
93
+ });
94
+ React.startTransition(() => {
95
+ run();
96
+ });
97
+ }, [locale]);
98
+ const context = React.useMemo(() => {
99
+ var _a;
100
+ return {
117
101
  setLocale,
102
+ translations: (_a = translationsRef.current) !== null && _a !== void 0 ? _a : {},
118
103
  locale,
119
- t
104
+ importMethod,
105
+ loadTranslations,
106
+ t: (key, opts) => {
107
+ var _a, _b;
108
+ React.useEffect(() => {
109
+ if ((opts === null || opts === void 0 ? void 0 : opts.locale) == null) {
110
+ return;
111
+ }
112
+ loadTranslations(opts === null || opts === void 0 ? void 0 : opts.locale);
113
+ }, [locale, opts === null || opts === void 0 ? void 0 : opts.locale]);
114
+ return (0, exports.access)(key, (_a = opts === null || opts === void 0 ? void 0 : opts.locale) !== null && _a !== void 0 ? _a : locale, (_b = translationsRef.current) !== null && _b !== void 0 ? _b : {});
115
+ }
120
116
  };
121
- if (!(0, object_1.isEqual)(valueRef.current, current)) {
122
- onUpdated === null || onUpdated === void 0 ? void 0 : onUpdated(valueRef.current);
123
- }
124
- }, [locale, translations, requireTranslations]);
125
- React.useEffect(() => {
126
- requireTranslations(locale);
127
- }, [requireTranslations, locale]);
128
- return React.createElement(exports.GlotstackContext.Provider, { value: valueRef.current }, children);
117
+ }, [locale, importMethod]);
118
+ return React.createElement(exports.GlotstackContext.Provider, { value: context }, children);
119
+ };
120
+ exports.GlotstackProvider = GlotstackProvider;
121
+ const useGlotstack = () => {
122
+ return React.useContext(exports.GlotstackContext);
129
123
  };
130
- exports.Provider = Provider;
124
+ exports.useGlotstack = useGlotstack;
131
125
  const useTranslations = (_options) => {
132
126
  const context = React.useContext(exports.GlotstackContext);
133
127
  return context;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Recursively looks for `.glotstack.json` from the current directory up to the root.
3
+ * @param startDir The directory to start the search from. Defaults to process.cwd().
4
+ * @returns The absolute path to the file if found, or null if not found.
5
+ */
6
+ export declare function findGlotstackConfig(startDir?: string): string | null;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.findGlotstackConfig = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ /**
30
+ * Recursively looks for `.glotstack.json` from the current directory up to the root.
31
+ * @param startDir The directory to start the search from. Defaults to process.cwd().
32
+ * @returns The absolute path to the file if found, or null if not found.
33
+ */
34
+ function findGlotstackConfig(startDir = process.cwd()) {
35
+ let currentDir = path.resolve(startDir);
36
+ while (true) {
37
+ const candidate = path.join(currentDir, '.glotstack.json');
38
+ if (fs.existsSync(candidate)) {
39
+ return candidate;
40
+ }
41
+ const parentDir = path.dirname(currentDir);
42
+ if (parentDir === currentDir) {
43
+ break; // Reached root
44
+ }
45
+ currentDir = parentDir;
46
+ }
47
+ return null;
48
+ }
49
+ exports.findGlotstackConfig = findGlotstackConfig;
50
+ //# sourceMappingURL=findConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findConfig.js","sourceRoot":"","sources":["../../src/util/findConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAClE,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,eAAe;QACxB,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAjBD,kDAiBC"}
@@ -25,7 +25,7 @@ function _merge(target, source) {
25
25
  }
26
26
  function merge(target, ...sources) {
27
27
  return sources.reduce((previous, current) => {
28
- return merge(previous, current);
28
+ return _merge(previous, current);
29
29
  }, target);
30
30
  }
31
31
  exports.merge = merge;
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/util/object.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAFD,4BAEC;AAED,SAAS,MAAM,CAAC,MAAW,EAAE,MAAW;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,SAAgB,KAAK,CAAC,MAAmB,EAAE,GAAG,OAAsB;IAClE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC1C,OAAO,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,EAAE,MAAM,CAAC,CAAA;AACZ,CAAC;AAJD,sBAIC;AAED,SAAgB,OAAO,CAAC,CAAM,EAAE,CAAM;IACpC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAElE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC7D,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAEhD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAnBD,0BAmBC"}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/util/object.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAFD,4BAEC;AAED,SAAS,MAAM,CAAC,MAAW,EAAE,MAAW;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,SAAgB,KAAK,CAAC,MAAmB,EAAE,GAAG,OAAsB;IAClE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC1C,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,MAAM,CAAC,CAAA;AACZ,CAAC;AAJD,sBAIC;AAED,SAAgB,OAAO,CAAC,CAAM,EAAE,CAAM;IACpC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAElE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC7D,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAEhD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAnBD,0BAmBC"}
@@ -0,0 +1 @@
1
+ export declare function loadYaml(yamlString: string): unknown;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadYaml = void 0;
7
+ const js_yaml_1 = __importDefault(require("js-yaml"));
8
+ function loadYaml(yamlString) {
9
+ try {
10
+ return js_yaml_1.default.load(yamlString);
11
+ }
12
+ catch (e) {
13
+ console.error('Error converting yaml to JSON', e);
14
+ throw new Error('Could not convert yaml to JSON');
15
+ }
16
+ }
17
+ exports.loadYaml = loadYaml;
18
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/util/yaml.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA2B;AAG3B,SAAgB,QAAQ,CAAC,UAAkB;IACzC,IAAI,CAAC;QACH,OAAO,iBAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAA;QACjD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;AACH,CAAC;AAPD,4BAOC"}
@@ -0,0 +1,11 @@
1
+ import globals from "globals";
2
+ import tseslint from "typescript-eslint";
3
+ import { defineConfig } from "eslint/config";
4
+ import i18next from 'eslint-plugin-i18next';
5
+
6
+
7
+ export default defineConfig([
8
+ { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], languageOptions: { globals: globals.browser } },
9
+ tseslint.configs.base,
10
+ i18next.configs['flat/recommended'],
11
+ ]);