@randajan/say 1.1.1 → 1.1.2

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.
@@ -42,8 +42,8 @@ var Say = class _Say extends Function {
42
42
  const brothers = [];
43
43
  langs = langs ?? [];
44
44
  translations = translations ?? {};
45
- this.defaultLang = defaultLang ?? langs[0];
46
45
  const _say = (phraseId, lang) => _say.say(phraseId, lang);
46
+ _say.defaultLang = defaultLang ?? langs[0];
47
47
  (0, import_props.solids)(_say, {
48
48
  langs,
49
49
  langIndex: makeLangIndex(langs),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.js"],
4
- "sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n this.defaultLang = defaultLang ?? langs[0];\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n _say.defaultLang = defaultLang ?? langs[0];\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAuB;AAEvB,IAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM;AAClC,QAAM,MAAM,CAAC;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,KAAI,MAAM,CAAC,CAAC,IAAI;AACvD,SAAO;AACX;AAEO,IAAM,MAAN,MAAM,aAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9B,YAAY,EAAE,cAAc,MAAM,QAAQ,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG;AACnF,UAAM;AAEN,UAAM,WAAW,CAAC;AAClB,YAAQ,SAAS,CAAC;AAClB,mBAAe,gBAAgB,CAAC;AAGhC,UAAM,OAAO,CAAC,UAAU,SAAS,KAAK,IAAI,UAAU,IAAI;AAExD,SAAK,cAAc,eAAe,MAAM,CAAC;AAEzC,6BAAO,MAAM;AAAA,MACT;AAAA,MACA,WAAW,cAAc,KAAK;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AAED,WAAO,OAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAC3D;AAAA,EAEA,YAAY,UAAU,MAAM;AACxB,UAAM,IAAI,KAAK,UAAU,IAAI;AAC7B,QAAI,KAAK,MAAM;AAAE;AAAA,IAAQ;AACzB,UAAM,MAAM,KAAK,eAAe,QAAQ;AACxC,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AAAE;AAAA,IAAQ;AACnC,WAAO,IAAI,CAAC;AAAA,EAChB;AAAA,EAEA,gBAAgB,UAAU,MAAM,OAAK,oBAAI,QAAQ,GAAG;AAChD,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,CAAC,SAAS,QAAQ;AAAE;AAAA,IAAQ;AAChC,eAAW,OAAO,UAAU;AACxB,YAAM,IAAI,IAAI,QAAQ,UAAU,MAAM,OAAO,IAAI;AACjD,UAAI,KAAK,MAAM;AAAE,eAAO;AAAA,MAAG;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEA,cAAc,UAAU,MAAM,OAAK,oBAAI,QAAQ,GAAG;AAC9C,UAAM,EAAE,OAAO,IAAI;AACnB,WAAO,QAAQ,QAAQ,UAAU,MAAM,OAAO,IAAI;AAAA,EACtD;AAAA,EAEA,QAAQ,UAAU,MAAM,aAAW,MAAM,OAAK,oBAAI,QAAQ,GAAG;AACzD,QAAI,KAAK,IAAI,IAAI,GAAG;AAAE;AAAA,IAAQ,OAAO;AAAE,WAAK,IAAI,IAAI;AAAA,IAAG;AAEvD,UAAM,KAAK,QAAQ,KAAK;AACxB,UAAM,KAAK,KAAK,YAAY,UAAU,EAAE;AACxC,QAAI,MAAM,MAAM;AAAE,aAAO;AAAA,IAAI;AAE7B,UAAM,KAAK,KAAK,gBAAgB,UAAU,IAAI,IAAI;AAClD,QAAI,MAAM,MAAM;AAAE,aAAO;AAAA,IAAI;AAE7B,UAAM,KAAK,KAAK,cAAc,UAAU,IAAI,IAAI;AAChD,QAAI,MAAM,MAAM;AAAE,aAAO;AAAA,IAAI;AAE7B,QAAI,CAAC,YAAY;AAAE;AAAA,IAAQ;AAC3B,UAAM,IAAI,MAAM,WAAW,QAAQ,sBAAsB,EAAE,KAAK;AAAA,EACpE;AAAA,EAEA,SAAS,MAAM;AACX,WAAO,KAAK,OAAO,EAAC,aAAY,KAAI,CAAC;AAAA,EACzC;AAAA,EAEA,OAAO,EAAE,aAAa,OAAO,aAAY,IAAI,CAAC,GAAG;AAC7C,QAAI,CAAC,OAAO;AAAE,cAAQ,KAAK;AAAA,IAAO,WACzB,CAAC,aAAa;AAAE,oBAAc,KAAK;AAAA,IAAa;AACzD,WAAO,IAAI,KAAI,EAAC,aAAa,OAAO,cAAc,QAAO,KAAI,CAAC;AAAA,EAClE;AAAA,EAEA,OAAO,SAAS;AACZ,QAAI,YAAY,MAAM;AAClB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AACA,QAAI,YAAY,KAAK,QAAQ;AACzB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAClE;AACA,QAAI,EAAE,mBAAmB,OAAM;AAC3B,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACnE;AACA,SAAK,SAAS,KAAK,OAAO;AAC1B,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,UAAU,MAAM;AAChB,WAAO,KAAK,QAAQ,UAAU,MAAM,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,MAAM,UAAU,UAAU,MAAM;AAC5B,WAAO,KAAK,QAAQ,UAAU,MAAM,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,IAAI,UAAU,MAAM;AAChB,WAAO,KAAK,MAAM,UAAU,IAAI,QAAQ,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,QAAQ,MAAM;AACV,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AACJ;AAEA,IAAO,gBAAQ;",
6
6
  "names": []
7
7
  }
@@ -18,8 +18,8 @@ var Say = class _Say extends Function {
18
18
  const brothers = [];
19
19
  langs = langs ?? [];
20
20
  translations = translations ?? {};
21
- this.defaultLang = defaultLang ?? langs[0];
22
21
  const _say = (phraseId, lang) => _say.say(phraseId, lang);
22
+ _say.defaultLang = defaultLang ?? langs[0];
23
23
  solids(_say, {
24
24
  langs,
25
25
  langIndex: makeLangIndex(langs),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.js"],
4
- "sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n this.defaultLang = defaultLang ?? langs[0];\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n _say.defaultLang = defaultLang ?? langs[0];\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@randajan/say",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Tiny, chainable phrase lookup helper for simple localization with fallbacks.",
5
5
  "repository": "randajan/say",
6
6
  "type": "module",