paraphrase 3.1.1 → 3.1.3

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.
@@ -34,11 +34,12 @@ interface Phraser {
34
34
  *
35
35
  * phraser('Hello, ${name}', {name: 'Martin'})
36
36
  */
37
- export declare function paraphrase(...args: (RegExp | RegExp[] | IParaphraseOptions)[]): Phraser;
38
- export declare const dollar: Phraser;
39
- export declare const double: Phraser;
40
- export declare const single: Phraser;
41
- export declare const percent: Phraser;
42
- export declare const hash: Phraser;
43
- export declare const loose: Phraser;
44
- export {};
37
+ declare function paraphrase(...args: (RegExp | RegExp[] | IParaphraseOptions)[]): Phraser;
38
+ declare const dollar: Phraser;
39
+ declare const double: Phraser;
40
+ declare const single: Phraser;
41
+ declare const percent: Phraser;
42
+ declare const hash: Phraser;
43
+ declare const loose: Phraser;
44
+
45
+ export { dollar, double, hash, loose, paraphrase, percent, single };
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -17,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
17
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
19
 
19
20
  // src/index.ts
20
- var src_exports = {};
21
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
22
23
  dollar: () => dollar,
23
24
  double: () => double,
24
25
  hash: () => hash,
@@ -27,7 +28,7 @@ __export(src_exports, {
27
28
  percent: () => percent,
28
29
  single: () => single
29
30
  });
30
- module.exports = __toCommonJS(src_exports);
31
+ module.exports = __toCommonJS(index_exports);
31
32
 
32
33
  // src/notate/index.ts
33
34
  function notate(source, string = "") {
@@ -46,28 +47,11 @@ function notate(source, string = "") {
46
47
  var isObject = (obj) => `${obj}` === "[object Object]";
47
48
 
48
49
  // src/flavours/index.ts
49
- var flavours = {
50
- /**
51
- * Template: 'Hello, ${name}'
52
- */
53
- dollar: /\${([^{}]*)}/gm,
54
- /**
55
- * Template: 'Hello, {{name}}'
56
- */
57
- double: /{{([^{}]*)}}/gm,
58
- /**
59
- * Template: 'Hello, {name}'
60
- */
61
- single: /{([^{}]*)}/gm,
62
- /**
63
- * Template: 'Hello, #{name}'
64
- */
65
- hash: /#{([^{}]*)}/gm,
66
- /**
67
- * Template: 'Hello, %{name}'
68
- */
69
- percent: /%{([^{}]*)}/gm
70
- };
50
+ var dollarPattern = /\${([^{}]*)}/gm;
51
+ var doublePattern = /{{([^{}]*)}}/gm;
52
+ var singlePattern = /{([^{}]*)}/gm;
53
+ var hashPattern = /#{([^{}]*)}/gm;
54
+ var percentPattern = /%{([^{}]*)}/gm;
71
55
 
72
56
  // src/index.ts
73
57
  var VALID_RESULT_TYPES = Object.seal([
@@ -91,9 +75,7 @@ function paraphrase(...args) {
91
75
  `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`
92
76
  );
93
77
  }
94
- if (!data) {
95
- return string;
96
- }
78
+ if (!data) return string;
97
79
  if (VALID_RESULT_TYPES.includes(typeof data)) {
98
80
  data = [data, ...replacements];
99
81
  }
@@ -112,17 +94,17 @@ function paraphrase(...args) {
112
94
  });
113
95
  return phraser;
114
96
  }
115
- var dollar = paraphrase(flavours.dollar);
116
- var double = paraphrase(flavours.double);
117
- var single = paraphrase(flavours.single);
118
- var percent = paraphrase(flavours.percent);
119
- var hash = paraphrase(flavours.hash);
97
+ var dollar = paraphrase(dollarPattern);
98
+ var double = paraphrase(doublePattern);
99
+ var single = paraphrase(singlePattern);
100
+ var percent = paraphrase(percentPattern);
101
+ var hash = paraphrase(hashPattern);
120
102
  var loose = paraphrase(
121
- flavours.dollar,
122
- flavours.double,
123
- flavours.percent,
124
- flavours.hash,
125
- flavours.single
103
+ dollarPattern,
104
+ doublePattern,
105
+ percentPattern,
106
+ hashPattern,
107
+ singlePattern
126
108
  );
127
109
  // Annotate the CommonJS export names for ESM import in node:
128
110
  0 && (module.exports = {
@@ -134,4 +116,4 @@ var loose = paraphrase(
134
116
  percent,
135
117
  single
136
118
  });
137
- //# sourceMappingURL=index.js.map
119
+ //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["src/index.ts", "src/notate/index.ts", "src/isObject/index.ts", "src/flavours/index.ts"],
4
- "sourcesContent": ["import { notate } from \"./notate/index\";\nimport { isObject } from \"./isObject/index\";\nimport { flavours } from \"./flavours/index\";\n\n/**\n * Valid types of results for the interpolated string\n */\nconst VALID_RESULT_TYPES: [\"string\", \"number\"] = Object.seal([\n \"string\",\n \"number\",\n]);\n\ninterface IParaphraseOptions {\n /**\n * Should continue to resolve result string until replacements have been exhausted\n */\n recursive?: boolean;\n /**\n * Should resolve dot notation within template\n */\n resolve?: boolean;\n /**\n * Should remove unmatched template instances\n */\n clean?: boolean;\n}\n\ninterface Phraser {\n (\n /**\n * Template string to parse\n */\n string: string | undefined,\n /**\n * Data to use for interpolation, preferrably an object, but an array will work too, and a primitive values will be treated as an array of \"...rest\" arguments\n */\n ...data: (Record<string, any> | any)[]\n ): string;\n patterns: RegExp[];\n}\n\n/**\n * Create new paraphrase method instance\n * @param {...RegExp[]} replacers[] One or more patterns to use for string replacement\n * @param {IParaphraseOptions} [options] The last argument can be an options object\n * @returns {Phraser} phraser function instance\n *\n * @example const phraser = paraphrase(/\\${([^{}]*)}/gm);\n *\n * phraser('Hello, ${name}', {name: 'Martin'})\n */\nexport function paraphrase(\n ...args: (RegExp | RegExp[] | IParaphraseOptions)[]\n): Phraser {\n const options: IParaphraseOptions = {\n recursive: true,\n resolve: true,\n clean: false,\n };\n if (args.length && isObject(args[args.length - 1])) {\n Object.assign(options, args.pop() as IParaphraseOptions);\n }\n const patterns = args.flat().filter((arg) => arg instanceof RegExp);\n\n Object.freeze(patterns);\n\n /**\n * phraser description\n * @param {string} string Template\n * @param {Object|(string|number)} data Data for filling\n * @param {...(string|number)} replacements Replacement for filling\n * @return {string} Result\n */\n function phraser(\n string: string = \"\",\n data: string | number | Record<string, any>,\n ...replacements: (string | number)[]\n ): string {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`\n );\n }\n\n if (!data) {\n return string;\n }\n\n if (VALID_RESULT_TYPES.includes(typeof data as any)) {\n data = [data, ...replacements];\n }\n\n /**\n * Replace method build with internal reference to the passed in data structure\n * @param {string} haystack The full string match\n * @param {string} needle The content to identify as data member\n * @return {string} Found value\n */\n function replace(haystack: string, needle: string): string {\n const replacement = options.resolve\n ? notate(data, needle.trim())\n : data[needle.trim()];\n\n return VALID_RESULT_TYPES.includes(typeof replacement as any)\n ? replacement\n : options.clean\n ? \"\"\n : haystack;\n }\n\n const result = (patterns as RegExp[]).reduce(\n (string: string, pattern: RegExp): string =>\n string.replace(pattern, replace),\n string\n );\n\n return !options.recursive || string === result\n ? result\n : phraser(result, data, ...replacements);\n }\n\n Object.defineProperty(phraser, \"patterns\", {\n get: () => patterns,\n });\n\n return phraser as Phraser;\n}\n\nexport const dollar = paraphrase(flavours.dollar);\nexport const double = paraphrase(flavours.double);\nexport const single = paraphrase(flavours.single);\nexport const percent = paraphrase(flavours.percent);\nexport const hash = paraphrase(flavours.hash);\nexport const loose = paraphrase(\n flavours.dollar,\n flavours.double,\n flavours.percent,\n flavours.hash,\n flavours.single\n);\n", "/**\n * Resolve dot notation strings\n *\n * @param {any} context Object to start notation search on (defaults to global scope)\n * @param {string} [string=''] Dot notation representation\n * @return {any} Whatever it finds / undefined\n *\n * @example\n * const obj = {\n * top_level: {\n * nested: {\n * value: 'My Value'\n * }\n * }\n * };\n *\n * notate(obj, 'top_level.nested.value');\n * // 'My Value'\n *\n * notate(obj, 'top_level.missing.value');\n * // undefined\n */\nexport function notate(source: any, string: string = \"\"): any {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `Expected notation query to be a string, instead got ${typeof string} (${string})`\n );\n }\n return string\n .split(\".\")\n .reduce(\n (previous, current) =>\n typeof previous === \"object\" && previous ? previous[current] : previous,\n source\n );\n}\n", "/**\n * Is this a basic object?\n * @param {any} obj Target to test\n * @return {boolean} true if object\n */\nexport const isObject = (obj: any): boolean => `${obj}` === \"[object Object]\";\n", "export const flavours: Record<string, RegExp> = {\n /**\n * Template: 'Hello, ${name}'\n */\n dollar: /\\${([^{}]*)}/gm,\n /**\n * Template: 'Hello, {{name}}'\n */\n double: /{{([^{}]*)}}/gm,\n /**\n * Template: 'Hello, {name}'\n */\n single: /{([^{}]*)}/gm,\n /**\n * Template: 'Hello, #{name}'\n */\n hash: /#{([^{}]*)}/gm,\n /**\n * Template: 'Hello, %{name}'\n */\n percent: /%{([^{}]*)}/gm,\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACsBO,SAAS,OAAO,QAAa,SAAiB,IAAS;AAC5D,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO,WAAW;AAAA,IAC3E;AAAA,EACF;AACA,SAAO,OACJ,MAAM,GAAG,EACT;AAAA,IACC,CAAC,UAAU,YACT,OAAO,aAAa,YAAY,WAAW,SAAS,OAAO,IAAI;AAAA,IACjE;AAAA,EACF;AACJ;;;AC9BO,IAAM,WAAW,CAAC,QAAsB,GAAG,UAAU;;;ACLrD,IAAM,WAAmC;AAAA;AAAA;AAAA;AAAA,EAI9C,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,MAAM;AAAA;AAAA;AAAA;AAAA,EAIN,SAAS;AACX;;;AHdA,IAAM,qBAA2C,OAAO,KAAK;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAyCM,SAAS,cACX,MACM;AACT,QAAM,UAA8B;AAAA,IAClC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG;AAClD,WAAO,OAAO,SAAS,KAAK,IAAI,CAAuB;AAAA,EACzD;AACA,QAAM,WAAW,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ,eAAe,MAAM;AAElE,SAAO,OAAO,QAAQ;AAStB,WAAS,QACP,SAAiB,IACjB,SACG,cACK;AACR,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,2DAA2D,OAAO,WAAW;AAAA,MAC/E;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,mBAAmB,SAAS,OAAO,IAAW,GAAG;AACnD,aAAO,CAAC,MAAM,GAAG,YAAY;AAAA,IAC/B;AAQA,aAAS,QAAQ,UAAkB,QAAwB;AACzD,YAAM,cAAc,QAAQ,UACxB,OAAO,MAAM,OAAO,KAAK,CAAC,IAC1B,KAAK,OAAO,KAAK,CAAC;AAEtB,aAAO,mBAAmB,SAAS,OAAO,WAAkB,IACxD,cACA,QAAQ,QACR,KACA;AAAA,IACN;AAEA,UAAM,SAAU,SAAsB;AAAA,MACpC,CAACA,SAAgB,YACfA,QAAO,QAAQ,SAAS,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,CAAC,QAAQ,aAAa,WAAW,SACpC,SACA,QAAQ,QAAQ,MAAM,GAAG,YAAY;AAAA,EAC3C;AAEA,SAAO,eAAe,SAAS,YAAY;AAAA,IACzC,KAAK,MAAM;AAAA,EACb,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,UAAU,WAAW,SAAS,OAAO;AAC3C,IAAM,OAAO,WAAW,SAAS,IAAI;AACrC,IAAM,QAAQ;AAAA,EACnB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;",
6
- "names": ["string"]
7
- }
1
+ {"version":3,"sources":["src/index.ts","src/notate/index.ts","src/isObject/index.ts","src/flavours/index.ts"],"sourcesContent":["import { notate } from \"./notate/index.ts\";\nimport { isObject } from \"./isObject/index.ts\";\nimport {\n dollarPattern,\n doublePattern,\n percentPattern,\n hashPattern,\n singlePattern,\n} from \"./flavours/index.ts\";\n\n/**\n * Valid types of results for the interpolated string\n */\nconst VALID_RESULT_TYPES: [\"string\", \"number\"] = Object.seal([\n \"string\",\n \"number\",\n]);\n\ninterface IParaphraseOptions {\n /**\n * Should continue to resolve result string until replacements have been exhausted\n */\n recursive?: boolean;\n /**\n * Should resolve dot notation within template\n */\n resolve?: boolean;\n /**\n * Should remove unmatched template instances\n */\n clean?: boolean;\n}\n\ninterface Phraser {\n (\n /**\n * Template string to parse\n */\n string: string | undefined,\n /**\n * Data to use for interpolation, preferrably an object, but an array will work too, and a primitive values will be treated as an array of \"...rest\" arguments\n */\n ...data: (Record<string, any> | any)[]\n ): string;\n patterns: RegExp[];\n}\n\n/**\n * Create new paraphrase method instance\n * @param {...RegExp[]} replacers[] One or more patterns to use for string replacement\n * @param {IParaphraseOptions} [options] The last argument can be an options object\n * @returns {Phraser} phraser function instance\n *\n * @example const phraser = paraphrase(/\\${([^{}]*)}/gm);\n *\n * phraser('Hello, ${name}', {name: 'Martin'})\n */\nexport function paraphrase(\n ...args: (RegExp | RegExp[] | IParaphraseOptions)[]\n): Phraser {\n const options: IParaphraseOptions = {\n recursive: true,\n resolve: true,\n clean: false,\n };\n if (args.length && isObject(args[args.length - 1])) {\n Object.assign(options, args.pop() as IParaphraseOptions);\n }\n const patterns = args.flat().filter((arg) => arg instanceof RegExp);\n\n Object.freeze(patterns);\n\n /**\n * phraser description\n * @param {string} string Template\n * @param {Object|(string|number)} data Data for filling\n * @param {...(string|number)} replacements Replacement for filling\n * @return {string} Result\n */\n function phraser(\n string: string = \"\",\n data: string | number | Record<string, any>,\n ...replacements: (string | number)[]\n ): string {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`,\n );\n }\n\n if (!data) return string;\n\n if (VALID_RESULT_TYPES.includes(typeof data as any)) {\n data = [data, ...replacements];\n }\n\n /**\n * Replace method build with internal reference to the passed in data structure\n * @param {string} haystack The full string match\n * @param {string} needle The content to identify as data member\n * @return {string} Found value\n */\n function replace(haystack: string, needle: string): string {\n const replacement = options.resolve\n ? notate(data, needle.trim())\n : (data as Record<string, any>)[needle.trim()];\n\n return VALID_RESULT_TYPES.includes(typeof replacement as any)\n ? replacement\n : options.clean\n ? \"\"\n : haystack;\n }\n\n const result = (patterns as RegExp[]).reduce(\n (string: string, pattern: RegExp): string =>\n string.replace(pattern, replace),\n string,\n );\n\n return !options.recursive || string === result\n ? result\n : phraser(result, data, ...replacements);\n }\n\n Object.defineProperty(phraser, \"patterns\", {\n get: () => patterns,\n });\n\n return phraser as Phraser;\n}\n\nexport const dollar = paraphrase(dollarPattern);\nexport const double = paraphrase(doublePattern);\nexport const single = paraphrase(singlePattern);\nexport const percent = paraphrase(percentPattern);\nexport const hash = paraphrase(hashPattern);\nexport const loose = paraphrase(\n dollarPattern,\n doublePattern,\n percentPattern,\n hashPattern,\n singlePattern,\n);\n","/**\n * Resolve dot notation strings\n *\n * @param {any} context Object to start notation search on (defaults to global scope)\n * @param {string} [string=''] Dot notation representation\n * @return {any} Whatever it finds / undefined\n *\n * @example\n * const obj = {\n * top_level: {\n * nested: {\n * value: 'My Value'\n * }\n * }\n * };\n *\n * notate(obj, 'top_level.nested.value');\n * // 'My Value'\n *\n * notate(obj, 'top_level.missing.value');\n * // undefined\n */\nexport function notate(source: any, string: string = \"\"): any {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `Expected notation query to be a string, instead got ${typeof string} (${string})`,\n );\n }\n return string\n .split(\".\")\n .reduce(\n (previous, current) =>\n typeof previous === \"object\" && previous ? previous[current] : previous,\n source,\n );\n}\n","/**\n * Is this a basic object?\n * @param {any} obj Target to test\n * @return {boolean} true if object\n */\nexport const isObject = (obj: any): boolean => `${obj}` === \"[object Object]\";\n","/**\n * Template: 'Hello, ${name}'\n */\nexport const dollarPattern = /\\${([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, {{name}}'\n */\nexport const doublePattern = /{{([^{}]*)}}/gm;\n\n/**\n * Template: 'Hello, {name}'\n */\nexport const singlePattern = /{([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, #{name}'\n */\nexport const hashPattern = /#{([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, %{name}'\n */\nexport const percentPattern = /%{([^{}]*)}/gm;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACsBO,SAAS,OAAO,QAAa,SAAiB,IAAS;AAC5D,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO,MAAM,KAAK,MAAM;AAAA,IACjF;AAAA,EACF;AACA,SAAO,OACJ,MAAM,GAAG,EACT;AAAA,IACC,CAAC,UAAU,YACT,OAAO,aAAa,YAAY,WAAW,SAAS,OAAO,IAAI;AAAA,IACjE;AAAA,EACF;AACJ;;;AC9BO,IAAM,WAAW,CAAC,QAAsB,GAAG,GAAG,OAAO;;;ACFrD,IAAM,gBAAgB;AAKtB,IAAM,gBAAgB;AAKtB,IAAM,gBAAgB;AAKtB,IAAM,cAAc;AAKpB,IAAM,iBAAiB;;;AHV9B,IAAM,qBAA2C,OAAO,KAAK;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAyCM,SAAS,cACX,MACM;AACT,QAAM,UAA8B;AAAA,IAClC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG;AAClD,WAAO,OAAO,SAAS,KAAK,IAAI,CAAuB;AAAA,EACzD;AACA,QAAM,WAAW,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ,eAAe,MAAM;AAElE,SAAO,OAAO,QAAQ;AAStB,WAAS,QACP,SAAiB,IACjB,SACG,cACK;AACR,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,2DAA2D,OAAO,MAAM,KAAK,MAAM;AAAA,MACrF;AAAA,IACF;AAEA,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI,mBAAmB,SAAS,OAAO,IAAW,GAAG;AACnD,aAAO,CAAC,MAAM,GAAG,YAAY;AAAA,IAC/B;AAQA,aAAS,QAAQ,UAAkB,QAAwB;AACzD,YAAM,cAAc,QAAQ,UACxB,OAAO,MAAM,OAAO,KAAK,CAAC,IACzB,KAA6B,OAAO,KAAK,CAAC;AAE/C,aAAO,mBAAmB,SAAS,OAAO,WAAkB,IACxD,cACA,QAAQ,QACN,KACA;AAAA,IACR;AAEA,UAAM,SAAU,SAAsB;AAAA,MACpC,CAACA,SAAgB,YACfA,QAAO,QAAQ,SAAS,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,CAAC,QAAQ,aAAa,WAAW,SACpC,SACA,QAAQ,QAAQ,MAAM,GAAG,YAAY;AAAA,EAC3C;AAEA,SAAO,eAAe,SAAS,YAAY;AAAA,IACzC,KAAK,MAAM;AAAA,EACb,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,UAAU,WAAW,cAAc;AACzC,IAAM,OAAO,WAAW,WAAW;AACnC,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["string"]}
package/index.mjs CHANGED
@@ -15,28 +15,11 @@ function notate(source, string = "") {
15
15
  var isObject = (obj) => `${obj}` === "[object Object]";
16
16
 
17
17
  // src/flavours/index.ts
18
- var flavours = {
19
- /**
20
- * Template: 'Hello, ${name}'
21
- */
22
- dollar: /\${([^{}]*)}/gm,
23
- /**
24
- * Template: 'Hello, {{name}}'
25
- */
26
- double: /{{([^{}]*)}}/gm,
27
- /**
28
- * Template: 'Hello, {name}'
29
- */
30
- single: /{([^{}]*)}/gm,
31
- /**
32
- * Template: 'Hello, #{name}'
33
- */
34
- hash: /#{([^{}]*)}/gm,
35
- /**
36
- * Template: 'Hello, %{name}'
37
- */
38
- percent: /%{([^{}]*)}/gm
39
- };
18
+ var dollarPattern = /\${([^{}]*)}/gm;
19
+ var doublePattern = /{{([^{}]*)}}/gm;
20
+ var singlePattern = /{([^{}]*)}/gm;
21
+ var hashPattern = /#{([^{}]*)}/gm;
22
+ var percentPattern = /%{([^{}]*)}/gm;
40
23
 
41
24
  // src/index.ts
42
25
  var VALID_RESULT_TYPES = Object.seal([
@@ -60,9 +43,7 @@ function paraphrase(...args) {
60
43
  `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`
61
44
  );
62
45
  }
63
- if (!data) {
64
- return string;
65
- }
46
+ if (!data) return string;
66
47
  if (VALID_RESULT_TYPES.includes(typeof data)) {
67
48
  data = [data, ...replacements];
68
49
  }
@@ -81,17 +62,17 @@ function paraphrase(...args) {
81
62
  });
82
63
  return phraser;
83
64
  }
84
- var dollar = paraphrase(flavours.dollar);
85
- var double = paraphrase(flavours.double);
86
- var single = paraphrase(flavours.single);
87
- var percent = paraphrase(flavours.percent);
88
- var hash = paraphrase(flavours.hash);
65
+ var dollar = paraphrase(dollarPattern);
66
+ var double = paraphrase(doublePattern);
67
+ var single = paraphrase(singlePattern);
68
+ var percent = paraphrase(percentPattern);
69
+ var hash = paraphrase(hashPattern);
89
70
  var loose = paraphrase(
90
- flavours.dollar,
91
- flavours.double,
92
- flavours.percent,
93
- flavours.hash,
94
- flavours.single
71
+ dollarPattern,
72
+ doublePattern,
73
+ percentPattern,
74
+ hashPattern,
75
+ singlePattern
95
76
  );
96
77
  export {
97
78
  dollar,
@@ -102,4 +83,4 @@ export {
102
83
  percent,
103
84
  single
104
85
  };
105
- //# sourceMappingURL=index.mjs.map
86
+ //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["src/notate/index.ts", "src/isObject/index.ts", "src/flavours/index.ts", "src/index.ts"],
4
- "sourcesContent": ["/**\n * Resolve dot notation strings\n *\n * @param {any} context Object to start notation search on (defaults to global scope)\n * @param {string} [string=''] Dot notation representation\n * @return {any} Whatever it finds / undefined\n *\n * @example\n * const obj = {\n * top_level: {\n * nested: {\n * value: 'My Value'\n * }\n * }\n * };\n *\n * notate(obj, 'top_level.nested.value');\n * // 'My Value'\n *\n * notate(obj, 'top_level.missing.value');\n * // undefined\n */\nexport function notate(source: any, string: string = \"\"): any {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `Expected notation query to be a string, instead got ${typeof string} (${string})`\n );\n }\n return string\n .split(\".\")\n .reduce(\n (previous, current) =>\n typeof previous === \"object\" && previous ? previous[current] : previous,\n source\n );\n}\n", "/**\n * Is this a basic object?\n * @param {any} obj Target to test\n * @return {boolean} true if object\n */\nexport const isObject = (obj: any): boolean => `${obj}` === \"[object Object]\";\n", "export const flavours: Record<string, RegExp> = {\n /**\n * Template: 'Hello, ${name}'\n */\n dollar: /\\${([^{}]*)}/gm,\n /**\n * Template: 'Hello, {{name}}'\n */\n double: /{{([^{}]*)}}/gm,\n /**\n * Template: 'Hello, {name}'\n */\n single: /{([^{}]*)}/gm,\n /**\n * Template: 'Hello, #{name}'\n */\n hash: /#{([^{}]*)}/gm,\n /**\n * Template: 'Hello, %{name}'\n */\n percent: /%{([^{}]*)}/gm,\n};\n", "import { notate } from \"./notate/index\";\nimport { isObject } from \"./isObject/index\";\nimport { flavours } from \"./flavours/index\";\n\n/**\n * Valid types of results for the interpolated string\n */\nconst VALID_RESULT_TYPES: [\"string\", \"number\"] = Object.seal([\n \"string\",\n \"number\",\n]);\n\ninterface IParaphraseOptions {\n /**\n * Should continue to resolve result string until replacements have been exhausted\n */\n recursive?: boolean;\n /**\n * Should resolve dot notation within template\n */\n resolve?: boolean;\n /**\n * Should remove unmatched template instances\n */\n clean?: boolean;\n}\n\ninterface Phraser {\n (\n /**\n * Template string to parse\n */\n string: string | undefined,\n /**\n * Data to use for interpolation, preferrably an object, but an array will work too, and a primitive values will be treated as an array of \"...rest\" arguments\n */\n ...data: (Record<string, any> | any)[]\n ): string;\n patterns: RegExp[];\n}\n\n/**\n * Create new paraphrase method instance\n * @param {...RegExp[]} replacers[] One or more patterns to use for string replacement\n * @param {IParaphraseOptions} [options] The last argument can be an options object\n * @returns {Phraser} phraser function instance\n *\n * @example const phraser = paraphrase(/\\${([^{}]*)}/gm);\n *\n * phraser('Hello, ${name}', {name: 'Martin'})\n */\nexport function paraphrase(\n ...args: (RegExp | RegExp[] | IParaphraseOptions)[]\n): Phraser {\n const options: IParaphraseOptions = {\n recursive: true,\n resolve: true,\n clean: false,\n };\n if (args.length && isObject(args[args.length - 1])) {\n Object.assign(options, args.pop() as IParaphraseOptions);\n }\n const patterns = args.flat().filter((arg) => arg instanceof RegExp);\n\n Object.freeze(patterns);\n\n /**\n * phraser description\n * @param {string} string Template\n * @param {Object|(string|number)} data Data for filling\n * @param {...(string|number)} replacements Replacement for filling\n * @return {string} Result\n */\n function phraser(\n string: string = \"\",\n data: string | number | Record<string, any>,\n ...replacements: (string | number)[]\n ): string {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`\n );\n }\n\n if (!data) {\n return string;\n }\n\n if (VALID_RESULT_TYPES.includes(typeof data as any)) {\n data = [data, ...replacements];\n }\n\n /**\n * Replace method build with internal reference to the passed in data structure\n * @param {string} haystack The full string match\n * @param {string} needle The content to identify as data member\n * @return {string} Found value\n */\n function replace(haystack: string, needle: string): string {\n const replacement = options.resolve\n ? notate(data, needle.trim())\n : data[needle.trim()];\n\n return VALID_RESULT_TYPES.includes(typeof replacement as any)\n ? replacement\n : options.clean\n ? \"\"\n : haystack;\n }\n\n const result = (patterns as RegExp[]).reduce(\n (string: string, pattern: RegExp): string =>\n string.replace(pattern, replace),\n string\n );\n\n return !options.recursive || string === result\n ? result\n : phraser(result, data, ...replacements);\n }\n\n Object.defineProperty(phraser, \"patterns\", {\n get: () => patterns,\n });\n\n return phraser as Phraser;\n}\n\nexport const dollar = paraphrase(flavours.dollar);\nexport const double = paraphrase(flavours.double);\nexport const single = paraphrase(flavours.single);\nexport const percent = paraphrase(flavours.percent);\nexport const hash = paraphrase(flavours.hash);\nexport const loose = paraphrase(\n flavours.dollar,\n flavours.double,\n flavours.percent,\n flavours.hash,\n flavours.single\n);\n"],
5
- "mappings": ";AAsBO,SAAS,OAAO,QAAa,SAAiB,IAAS;AAC5D,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO,WAAW;AAAA,IAC3E;AAAA,EACF;AACA,SAAO,OACJ,MAAM,GAAG,EACT;AAAA,IACC,CAAC,UAAU,YACT,OAAO,aAAa,YAAY,WAAW,SAAS,OAAO,IAAI;AAAA,IACjE;AAAA,EACF;AACJ;;;AC9BO,IAAM,WAAW,CAAC,QAAsB,GAAG,UAAU;;;ACLrD,IAAM,WAAmC;AAAA;AAAA;AAAA;AAAA,EAI9C,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,MAAM;AAAA;AAAA;AAAA;AAAA,EAIN,SAAS;AACX;;;ACdA,IAAM,qBAA2C,OAAO,KAAK;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAyCM,SAAS,cACX,MACM;AACT,QAAM,UAA8B;AAAA,IAClC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG;AAClD,WAAO,OAAO,SAAS,KAAK,IAAI,CAAuB;AAAA,EACzD;AACA,QAAM,WAAW,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ,eAAe,MAAM;AAElE,SAAO,OAAO,QAAQ;AAStB,WAAS,QACP,SAAiB,IACjB,SACG,cACK;AACR,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,2DAA2D,OAAO,WAAW;AAAA,MAC/E;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,mBAAmB,SAAS,OAAO,IAAW,GAAG;AACnD,aAAO,CAAC,MAAM,GAAG,YAAY;AAAA,IAC/B;AAQA,aAAS,QAAQ,UAAkB,QAAwB;AACzD,YAAM,cAAc,QAAQ,UACxB,OAAO,MAAM,OAAO,KAAK,CAAC,IAC1B,KAAK,OAAO,KAAK,CAAC;AAEtB,aAAO,mBAAmB,SAAS,OAAO,WAAkB,IACxD,cACA,QAAQ,QACR,KACA;AAAA,IACN;AAEA,UAAM,SAAU,SAAsB;AAAA,MACpC,CAACA,SAAgB,YACfA,QAAO,QAAQ,SAAS,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,CAAC,QAAQ,aAAa,WAAW,SACpC,SACA,QAAQ,QAAQ,MAAM,GAAG,YAAY;AAAA,EAC3C;AAEA,SAAO,eAAe,SAAS,YAAY;AAAA,IACzC,KAAK,MAAM;AAAA,EACb,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,SAAS,WAAW,SAAS,MAAM;AACzC,IAAM,UAAU,WAAW,SAAS,OAAO;AAC3C,IAAM,OAAO,WAAW,SAAS,IAAI;AACrC,IAAM,QAAQ;AAAA,EACnB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;",
6
- "names": ["string"]
7
- }
1
+ {"version":3,"sources":["src/notate/index.ts","src/isObject/index.ts","src/flavours/index.ts","src/index.ts"],"sourcesContent":["/**\n * Resolve dot notation strings\n *\n * @param {any} context Object to start notation search on (defaults to global scope)\n * @param {string} [string=''] Dot notation representation\n * @return {any} Whatever it finds / undefined\n *\n * @example\n * const obj = {\n * top_level: {\n * nested: {\n * value: 'My Value'\n * }\n * }\n * };\n *\n * notate(obj, 'top_level.nested.value');\n * // 'My Value'\n *\n * notate(obj, 'top_level.missing.value');\n * // undefined\n */\nexport function notate(source: any, string: string = \"\"): any {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `Expected notation query to be a string, instead got ${typeof string} (${string})`,\n );\n }\n return string\n .split(\".\")\n .reduce(\n (previous, current) =>\n typeof previous === \"object\" && previous ? previous[current] : previous,\n source,\n );\n}\n","/**\n * Is this a basic object?\n * @param {any} obj Target to test\n * @return {boolean} true if object\n */\nexport const isObject = (obj: any): boolean => `${obj}` === \"[object Object]\";\n","/**\n * Template: 'Hello, ${name}'\n */\nexport const dollarPattern = /\\${([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, {{name}}'\n */\nexport const doublePattern = /{{([^{}]*)}}/gm;\n\n/**\n * Template: 'Hello, {name}'\n */\nexport const singlePattern = /{([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, #{name}'\n */\nexport const hashPattern = /#{([^{}]*)}/gm;\n\n/**\n * Template: 'Hello, %{name}'\n */\nexport const percentPattern = /%{([^{}]*)}/gm;\n","import { notate } from \"./notate/index.ts\";\nimport { isObject } from \"./isObject/index.ts\";\nimport {\n dollarPattern,\n doublePattern,\n percentPattern,\n hashPattern,\n singlePattern,\n} from \"./flavours/index.ts\";\n\n/**\n * Valid types of results for the interpolated string\n */\nconst VALID_RESULT_TYPES: [\"string\", \"number\"] = Object.seal([\n \"string\",\n \"number\",\n]);\n\ninterface IParaphraseOptions {\n /**\n * Should continue to resolve result string until replacements have been exhausted\n */\n recursive?: boolean;\n /**\n * Should resolve dot notation within template\n */\n resolve?: boolean;\n /**\n * Should remove unmatched template instances\n */\n clean?: boolean;\n}\n\ninterface Phraser {\n (\n /**\n * Template string to parse\n */\n string: string | undefined,\n /**\n * Data to use for interpolation, preferrably an object, but an array will work too, and a primitive values will be treated as an array of \"...rest\" arguments\n */\n ...data: (Record<string, any> | any)[]\n ): string;\n patterns: RegExp[];\n}\n\n/**\n * Create new paraphrase method instance\n * @param {...RegExp[]} replacers[] One or more patterns to use for string replacement\n * @param {IParaphraseOptions} [options] The last argument can be an options object\n * @returns {Phraser} phraser function instance\n *\n * @example const phraser = paraphrase(/\\${([^{}]*)}/gm);\n *\n * phraser('Hello, ${name}', {name: 'Martin'})\n */\nexport function paraphrase(\n ...args: (RegExp | RegExp[] | IParaphraseOptions)[]\n): Phraser {\n const options: IParaphraseOptions = {\n recursive: true,\n resolve: true,\n clean: false,\n };\n if (args.length && isObject(args[args.length - 1])) {\n Object.assign(options, args.pop() as IParaphraseOptions);\n }\n const patterns = args.flat().filter((arg) => arg instanceof RegExp);\n\n Object.freeze(patterns);\n\n /**\n * phraser description\n * @param {string} string Template\n * @param {Object|(string|number)} data Data for filling\n * @param {...(string|number)} replacements Replacement for filling\n * @return {string} Result\n */\n function phraser(\n string: string = \"\",\n data: string | number | Record<string, any>,\n ...replacements: (string | number)[]\n ): string {\n if (typeof string !== \"string\") {\n throw new TypeError(\n `paraphrase expects first argument to be a string, got a ${typeof string} (${string})`,\n );\n }\n\n if (!data) return string;\n\n if (VALID_RESULT_TYPES.includes(typeof data as any)) {\n data = [data, ...replacements];\n }\n\n /**\n * Replace method build with internal reference to the passed in data structure\n * @param {string} haystack The full string match\n * @param {string} needle The content to identify as data member\n * @return {string} Found value\n */\n function replace(haystack: string, needle: string): string {\n const replacement = options.resolve\n ? notate(data, needle.trim())\n : (data as Record<string, any>)[needle.trim()];\n\n return VALID_RESULT_TYPES.includes(typeof replacement as any)\n ? replacement\n : options.clean\n ? \"\"\n : haystack;\n }\n\n const result = (patterns as RegExp[]).reduce(\n (string: string, pattern: RegExp): string =>\n string.replace(pattern, replace),\n string,\n );\n\n return !options.recursive || string === result\n ? result\n : phraser(result, data, ...replacements);\n }\n\n Object.defineProperty(phraser, \"patterns\", {\n get: () => patterns,\n });\n\n return phraser as Phraser;\n}\n\nexport const dollar = paraphrase(dollarPattern);\nexport const double = paraphrase(doublePattern);\nexport const single = paraphrase(singlePattern);\nexport const percent = paraphrase(percentPattern);\nexport const hash = paraphrase(hashPattern);\nexport const loose = paraphrase(\n dollarPattern,\n doublePattern,\n percentPattern,\n hashPattern,\n singlePattern,\n);\n"],"mappings":";AAsBO,SAAS,OAAO,QAAa,SAAiB,IAAS;AAC5D,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO,MAAM,KAAK,MAAM;AAAA,IACjF;AAAA,EACF;AACA,SAAO,OACJ,MAAM,GAAG,EACT;AAAA,IACC,CAAC,UAAU,YACT,OAAO,aAAa,YAAY,WAAW,SAAS,OAAO,IAAI;AAAA,IACjE;AAAA,EACF;AACJ;;;AC9BO,IAAM,WAAW,CAAC,QAAsB,GAAG,GAAG,OAAO;;;ACFrD,IAAM,gBAAgB;AAKtB,IAAM,gBAAgB;AAKtB,IAAM,gBAAgB;AAKtB,IAAM,cAAc;AAKpB,IAAM,iBAAiB;;;ACV9B,IAAM,qBAA2C,OAAO,KAAK;AAAA,EAC3D;AAAA,EACA;AACF,CAAC;AAyCM,SAAS,cACX,MACM;AACT,QAAM,UAA8B;AAAA,IAClC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG;AAClD,WAAO,OAAO,SAAS,KAAK,IAAI,CAAuB;AAAA,EACzD;AACA,QAAM,WAAW,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ,eAAe,MAAM;AAElE,SAAO,OAAO,QAAQ;AAStB,WAAS,QACP,SAAiB,IACjB,SACG,cACK;AACR,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,2DAA2D,OAAO,MAAM,KAAK,MAAM;AAAA,MACrF;AAAA,IACF;AAEA,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI,mBAAmB,SAAS,OAAO,IAAW,GAAG;AACnD,aAAO,CAAC,MAAM,GAAG,YAAY;AAAA,IAC/B;AAQA,aAAS,QAAQ,UAAkB,QAAwB;AACzD,YAAM,cAAc,QAAQ,UACxB,OAAO,MAAM,OAAO,KAAK,CAAC,IACzB,KAA6B,OAAO,KAAK,CAAC;AAE/C,aAAO,mBAAmB,SAAS,OAAO,WAAkB,IACxD,cACA,QAAQ,QACN,KACA;AAAA,IACR;AAEA,UAAM,SAAU,SAAsB;AAAA,MACpC,CAACA,SAAgB,YACfA,QAAO,QAAQ,SAAS,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,CAAC,QAAQ,aAAa,WAAW,SACpC,SACA,QAAQ,QAAQ,MAAM,GAAG,YAAY;AAAA,EAC3C;AAEA,SAAO,eAAe,SAAS,YAAY;AAAA,IACzC,KAAK,MAAM;AAAA,EACb,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,SAAS,WAAW,aAAa;AACvC,IAAM,UAAU,WAAW,cAAc;AACzC,IAAM,OAAO,WAAW,WAAW;AACnC,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["string"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paraphrase",
3
- "version": "3.1.1",
3
+ "version": "3.1.3",
4
4
  "description": "🧩 Create flavoured string template interpolation",
5
5
  "keywords": [
6
6
  "string",
@@ -39,25 +39,24 @@
39
39
  "default": "./index.js"
40
40
  }
41
41
  },
42
- "types": "./types/index.d.ts",
42
+ "types": "./index.d.ts",
43
43
  "files": [
44
44
  "index.js",
45
45
  "index.js.map",
46
46
  "index.mjs",
47
47
  "index.mjs.map",
48
- "types/index.d.ts"
48
+ "index.d.ts"
49
49
  ],
50
50
  "scripts": {
51
- "test": "jest",
51
+ "test": "node --test **/test.ts",
52
52
  "format": "prettier --write .",
53
- "build": "./scripts/build.sh",
53
+ "build": "tsup src/index.ts --format cjs,esm --dts --out-dir . --sourcemap",
54
54
  "prepublishOnly": "npm run build"
55
55
  },
56
56
  "devDependencies": {
57
- "@types/jest": "^29.4.0",
58
- "esbuild": "^0.17.4",
59
- "jest": "^29.4.0",
60
- "prettier": "^2.8.3",
61
- "ts-jest": "^29.0.5"
57
+ "@types/node": "^25.0.10",
58
+ "prettier": "^3.0.3",
59
+ "tsup": "^8.5.1",
60
+ "typescript": "^5.9.3"
62
61
  }
63
62
  }