{"id":16170655,"url":"https://github.com/seripap/string-interpolation","last_synced_at":"2025-10-04T18:58:04.181Z","repository":{"id":57098586,"uuid":"128801163","full_name":"seripap/string-interpolation","owner":"seripap","description":"Dynamic string manipulation","archived":false,"fork":false,"pushed_at":"2018-11-14T20:05:42.000Z","size":143,"stargazers_count":5,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-15T18:37:20.549Z","etag":null,"topics":["dynamic","interpolation","replace","replace-text","string"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seripap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-09T16:24:02.000Z","updated_at":"2023-12-04T13:13:05.000Z","dependencies_parsed_at":"2022-08-20T16:51:03.496Z","dependency_job_id":null,"html_url":"https://github.com/seripap/string-interpolation","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/seripap/string-interpolation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seripap%2Fstring-interpolation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seripap%2Fstring-interpolation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seripap%2Fstring-interpolation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seripap%2Fstring-interpolation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seripap","download_url":"https://codeload.github.com/seripap/string-interpolation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seripap%2Fstring-interpolation/sbom","scorecard":{"id":812700,"data":{"date":"2025-08-11","repo":{"name":"github.com/seripap/string-interpolation","commit":"13857f3e181f94b447db3dd124804da2735d6e83"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"80 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-c6rq-rjc2-86v2","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rq8g-5pc5-wrhr","Warn: Project is vulnerable to: GHSA-9vvw-cc9w-f27h","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-hr2v-3952-633q","Warn: Project is vulnerable to: GHSA-qrmc-fj45-qfc2","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-xf7w-r453-m56c","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq","Warn: Project is vulnerable to: GHSA-jp4x-w63m-7wgm","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-f9cm-qmx5-m98h","Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-fhjf-83wg-r2j9","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-6g33-f262-xjp4","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-2m39-62fm-q8r3","Warn: Project is vulnerable to: GHSA-mf6x-7mm4-x2g7","Warn: Project is vulnerable to: GHSA-j44m-qm6p-hp7m","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-g7q5-pjjr-gqvp","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T13:32:21.505Z","repository_id":57098586,"created_at":"2025-08-23T13:32:21.505Z","updated_at":"2025-08-23T13:32:21.505Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278358485,"owners_count":25973949,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dynamic","interpolation","replace","replace-text","string"],"created_at":"2024-10-10T03:19:18.189Z","updated_at":"2025-10-04T18:58:04.135Z","avatar_url":"https://github.com/seripap.png","language":"JavaScript","readme":"# String Interpolation\n\n[![Build Status](https://travis-ci.org/seripap/string-interpolation.svg?branch=master)](https://travis-ci.org/seripap/string-interpolation)\n\nThis package assists with dynamic string interpolation and on the fly value transformation. You're likely to find this useful if you're using a CMS that allows text input and want to transform value entry without writing a lot of code.\n\n## Example\n\nIn a real world scenario, `Hi, my name is {name}.` is coming from a CMS entered by an editor. The content editor knows nothing technical about `{name}` but understands that `{name}` is replaced with an actual name on the client.\n\n```js\nconst Interpolator = require('string-interpolation');\n\n// This isn't needed, unless you need to change your interpolation brackets to something else\nconst options = {\n    delimiter: ['{','}'],\n};\nconst interpolator = new Interpolator(options);\n\nconst replaceThis = `Welcome back, {username}!`;\nconst data = {\n    username: 'Dan',\n};\ninterpolator.parse(replaceThis, data);\n// Welcome back, Dan!\n```\n\n## Documentation\n\n### Options (optional)\n\n- `delimiter`: Array; Must be an array of 2 items. This is the start and end values of the delimiter. Defaults to `{}`\n\n```js\n// Defaults\n{\n    delimiter: ['{','}'],\n}\n```\n\n### Alternative Text\n\nIf data key is not defined, you can provide an alternative value. Just delineate the alternative text with a colon `:` after the data key. Due to current limitations, you cannot use reserved symbols (`|`, `:`) as an alternative text.\n\nIf you need to include reserved symbols as an alt text, feel free to open up a PR for a fix :).\n\n```js\nconst replaceThis = `Hi, my name is {name:Altnerative Text}.`;\nconst interpolator = new Interpolator();\n\ninterpolator.parse(replaceThis);\n// Hi, my name is Alternative Text.\n```\n\n### Modifiers\n\nModifiers are functions that transform interpolated text. These are applied by reducing strings parsed from the interpolator. By specifying a pipe `|`, the parser will transform interpolated text based on modifiers leading the pipe. This will also do transformations on alternative text if provided.\n\n```js\nconst Interpolator = require('string-interpolator');\nconst interpolator = new Interpolator();\n\nconst replaceThis = `Hi, my name is {name|uppercase}.`;\nconst data = {\n    name: 'Dan',\n};\n\ninterpolator.parse(replaceThis, data);\n// Hi, my name is DAN.\n```\n\nYou can add as many modifiers as you'd like by seperating with a comma. Useful if you are using custom modifiers and want to reduce a string, not quite as useful with the example below.\n\n```js\nconst Interpolator = require('string-interpolator');\nconst interpolator = new Interpolator();\n\n// This will transform to title case, and then lowercase\nconst replaceThis = `Hi, my name is {name|title,lowercase}.`;\nconst data = {\n    name: 'Dan',\n};\n\ninterpolator.parse(replaceThis, data);\n// Hi, my name is dan.\n```\n\n#### Built in modifiers\n\n| modifier | description |\n|---|---|\n| title | Converts to title case |\n| uppercase | Converts to uppercase |\n| lowercase | Converts to lowercase |\n\n**All modifiers, whether custom or prebuilt are not case sensitive**. You can name a modifier whatever you'd like but it will all get parsed as lowercased text values.\n\n### Custom modifiers\n\nYou can also build your own modifiers. Modifiers are functions that receives interpolated strings and transforms them.\n\n#### .registerModifier(key, modifier)\n\n- `key`: Unique key that annotates the modifier\n- `modifier`: Function to execute when reducing string\n\nYou can reference the interpolated value and data passed while parsing.\n\n```js\nconst customModifier = (val) =\u003e val.split('').reverse().join('');\n```\n\n#### Simple Example\n\n```js\nconst Interpolator = require('string-interpolator');\nconst interpolator = new Interpolator();\n\nconst replaceThis = `Hi, my name is {name|customModifier}.`;\nconst data = {\n    name: 'Dan',\n};\n\n// `str` in this case will be \"Dan\"\nconst customModifier = str =\u003e str.split('').reverse().join('');\n\n// Register modifier with interpolation service with the name \"customModifier\" This is actually parsed internally as `custommodifier`, but to keep it pretty, you should consider using camel cases.\ninterpolator.registerModifier('customModifier', customModifier);\n\ninterpolator.parse(replaceThis, data);\n// Output: Hi, my name is naD.\n```\n\n#### Advance Example\n\nAssuming you do not want to make data alias to the referenced data point (see below), you can parse the raw data from the modifier itself. Be sure to try/catch.\n\n```js\nconst Interpolator = require('string-interpolator');\nconst interpolator = new Interpolator();\n\nconst replaceThis = `2015 World Series Winner: {2015|year2015}`;\nconst worldSeriesWinner = {\n  winners: [{\n    year: 2015,\n    team: 'Royals'\n  },\n  {\n    year: 2016,\n    team: 'Cubs'\n  },\n  {\n    year: 2017,\n    team: 'Astros'\n  }]\n};\n\n// val will be`2015`, data will be worldSeriesWinner\nconst advanceCustomModifier = (val, data) =\u003e {\n    try {\n      // val is always a string, which is why parseInt is neccessary if referencing a number\n      const winner = data.winners.find(winner =\u003e winner.year === parseInt(val));\n      return winner.team;\n    } catch (e) {\n      console.log(e);\n      return val;\n    }\n}\n\ninterpolator.registerModifier('year2015', advanceCustomModifier);\n\nconst interpolated = interpolator.parse(replaceThis, worldSeriesWinner);\n// Output: 2015 World Series Winner: Royals\n```\n\n### Data Alias\n\nSometimes when data is passed as an object, you'd need to access a specific node or array item.\n\nConsider the expected: `Dan Seripap is from New York, NY`. Let's say our data structure looks like this:\n\n```js\nconst data = {\n    name: {\n        first: 'Dan',\n        last: 'Seripap',\n    },\n    locations: ['New York','NY'],\n}\n```\n\nWe want to interpolate correctly the following text: `Dan Seripap is from New York, NY`. If you know exactly where these nodes exists, you can provide the following string to be interpolated: `{name.first} {name.last} is from {locations[0]} {locations[1]}`.\n\nHowever, sometimes interpolated text is coming from a source where its data origins are unknown. In this case, we need to add some data references to where these data points actually exist.\n\n#### .addAlias(key, ref)\n\n- `key`: Key that indicates a reference to what is being replaced\n- `ref`: Reference to key value from parent object\n\n```js\nconst aliases = [{\n    key: 'firstName',\n    ref: 'name.first'\n},\n{\n    key: 'lastName',\n    ref: 'name.last'\n},\n{\n    key: 'city',\n    ref: 'locations[0]'\n},\n{\n    key: 'state',\n    ref: 'locations[1]'\n}];\n\n// Add aliaseses to interpolator\naliases.forEach(alias =\u003e interpolator.addAlias(alias.key, alias.ref));\n```\n\nThese aliases now define keys to exact locations of where values exists. We can now interpolate the text: `{firstName} {lastName} is from {city} {state}` which yeilds the same results as .\n\n#### .removeAlias(key)\n\nRemoves a referenced alias point by key.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseripap%2Fstring-interpolation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseripap%2Fstring-interpolation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseripap%2Fstring-interpolation/lists"}