Fork me on GitHub

Safelinkify

npm version www.webmanajemen.com LICENSE GitHub language count Github Workflow GitHub forks GitHub stars

Customized safelink url redirector. Transform and Anonymize all hyperlinks to outbound pages. Useful for SEO external links and ADS.

Demo

| page | source | samples | | :--- | :--- | :--- | | /page/safelink.html | safelink-decode.js
layout
template
compiler | /page/safelink.html?url=aHR0cHM6Ly... |

Installation

Bundles

| registry | link | commands | | :--- | :--- | :--- | npm | https://www.npmjs.com/package/safelinkify | npm i safelinkify -D | | github | https://github.com/dimaslanjaka/safelink | npm i https://github.com/dimaslanjaka/safelink -D | | tarball | https://github.com/dimaslanjaka/safelink/raw/master/release/safelinkify.tgz | npm i https://github.com/dimaslanjaka/safelink/raw/master/release/safelinkify.tgz -D |

npm

npm install safelinkify -D

Using yarn

yarn add safelinkify --dev

Development

git clone --single-branch --branch main https://github.com/dimaslanjaka/safelink foldername
cd foldername
yarn install # or npm install

| Command | Description | | :------------- | :-------------------- | | yarn start | Serve generated docs | | yarn dev | Watch and build docs | | yarn run docs | Build docs | | yarn run build | Build dist |

Usage

Options

const options = {
  // Exclude patterns (do not anonymize these patterns)
  exclude: [
    'domain.com',
    /another.domain.com/,
    /https?:\/\/?([^*]+)\.)?webmanajemen\.com/,
    /([a-z0-9](?:[a-z0-9-]{1,61}[a-z0-9])?[.])*webmanajemen\.com/
  ],
  // URL redirector
  redirect: 'https://www.webmanajemen.com/page/safelink.html?url=',
  // Debug
  verbose: false,
  // Encryption type: 'base64' | 'aes'
  type: 'base64',
  // Password for AES (default: 'root')
  password: 'unique-password'
};

Browser

Script location: node_modules/safelinkify/dist/bundle.min.js

Include the script:

<script src="dist/bundle.min.js"></script>
<!-- or use CDN -->
<script src="https://raw.githack.com/dimaslanjaka/safelink/main/dist/bundle.min.js"></script>
<script src="https://cdn.statically.io/gh/dimaslanjaka/safelink/main/dist/bundle.min.js"></script>

Usage example:

<script>
  const sf = new safelink(options);
  // Automatically safelinkify all hyperlinks in body
  sf.parse(document.querySelector('body')).then((result) => {
    console.log(result);
    // In-page redirector
    sf.resolveQueryUrl(window.location.href);
  });
</script>

Node.js

Modern framework (vite,webpack,etc)

import * as safelink from 'safelinkify/browser_module';

const sf = new safelinkify.safelink(options);
const processedExternalLinks = sf.parse(`
<a href="www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="http://www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="https://www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="www.example.com/page.php/404"></a>
<a href="http://external.domain.com">internal</a>
<a href="http://www.webmanajemen.com">internal</a>
<a href="http://webmanajemen.com">internal</a>
<a href="#http://webmanajemen.com">#internal</a>
<a href="?http://webmanajemen.com">?internal</a>
<a href="">internal</a>
`);
processedExternalLinks.then(console.log);

Reference Examples

Import

const { safelink } = require('safelinkify');
// or
const { default: safelink } = require('safelinkify/dist/safelink');

Usage Example

import safelinkify from 'safelinkify';
// const safelinkify = require('safelinkify');
const sf = new safelinkify.safelink(options);
const processedExternalLinks = sf.parse(`
<a href="www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="http://www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="https://www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="www.example.com/page.php/404"></a>
<a href="http://external.domain.com">internal</a>
<a href="http://www.webmanajemen.com">internal</a>
<a href="http://webmanajemen.com">internal</a>
<a href="#http://webmanajemen.com">#internal</a>
<a href="?http://webmanajemen.com">?internal</a>
<a href="">internal</a>
`);
processedExternalLinks.then(console.log);

Result:

<a href="www.example.com/page.php?id=xxxx&name=yyyy">external</a>
<a href="https://www.webmanajemen.com/page/safelink.html?url=aHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYWdlLnBocD9pZD14eHh4Jm5hbWU9eXl5eQ==">external</a>
<a href="https://www.webmanajemen.com/page/safelink.html?url=aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGFnZS5waHA/aWQ9eHh4eCZuYW1lPXl5eXk=">external</a>
<a href="www.example.com/page.php/404"></a>
<a href="http://external.domain.com">internal</a>
<a href="http://www.webmanajemen.com">internal</a>
<a href="http://webmanajemen.com">internal</a>
<a href="#http://webmanajemen.com">#internal</a>
<a href="?http://webmanajemen.com">?internal</a>
<a href="">internal</a>

Using Gulp

Reference: Gulp safelink task

import gulp from 'gulp';
import sf from 'safelinkify';
import { toUnix, join } from 'upath';
import through2 from 'through2';

const destDir = join(__dirname, 'build');

gulp.task('safelink', () => {
  const safelink = new sf.safelink({
    exclude: [
      /https?:\/\/?([^*]+)\.)?webmanajemen\.com/,
      /([a-z0-9](?:[a-z0-9-]{1,61}[a-z0-9])?[.])*webmanajemen\.com/
    ],
    redirect: 'https://www.webmanajemen.com/page/safelink.html?url=',
    verbose: false,
    type: 'base64',
    password: 'unique-password'
  });
  return gulp
    .src(['**/*.html'], {
      cwd: destDir,
      ignore: [
        '**/tmp/**',
        '**/node_modules/**',
        '**/monsters/**/*',
        '**/attendants/**/*',
        '**/materials/**/*',
        '**/scenic-spots/**/*',
        '**/static/**/*'
      ]
    })
    .pipe(
      through2.obj(async (file, _enc, next) => {
        if (file.isNull()) return next();
        const content = String(file.contents);
        const parsed = await safelink.parse(content);
        if (parsed) {
          file.contents = Buffer.from(parsed);
          next(null, file);
        } else {
          console.log('cannot parse', toUnix(file.path).replace(toUnix(process.cwd()), ''));
          next();
        }
      })
    )
    .pipe(gulp.dest(destDir));
});

Safelink Playground

Using QueryResolver only for redirect page
Query URL Resolver Samples
To Encode Or Wrong URL
Decode base64
Decode AES
Decode AES using hash
External Link Samples (Hover)
example google facebook
Internal Link Samples (Hover)
Homepage Search
global parseQuerytypeof window.parseQuery
global resolveQueryUrltypeof window.resolveQueryUrl

Current Page Script

    
<script src="dist/bundle.min.js"></script>
<script>/* eslint-disable @typescript-eslint/triple-slash-reference */
/// <reference path="../../dist/index.d.ts" />

document.addEventListener('DOMContentLoaded', function () {
  const table = document.querySelector('table#table');
  table.querySelector('#resolveQueryUrl').innerHTML = typeof window.resolveQueryUrl;
  table.querySelector('#parseQuery').innerHTML = typeof window.parseQuery;

  /**
   * Check if variable is ES5 class
   * @param {any} f
   * @returns {boolean}
   */
  function isClass(f) {
    return (
      typeof f === 'function' &&
      (() => {
        try {
          f();
          return false;
        } catch {
          return true;
        }
      })()
    );
  }

  const isSafelinkClass = isClass(window.safelink);
  table.innerHTML += `<tr><td>global safelink</td> <td><code class="language-javascript">isClass(window.safelink)</code></td><td>is ES5 Class: ${isSafelinkClass}</td></tr>`;
  table.innerHTML += `<tr><td>global safelink</td> <td><code class="language-javascript">typeof window.safelink</code></td><td>${typeof window.safelink}</td></tr>`;

  if (isSafelinkClass) {
    const instance = new window.safelink({
      // exclude patterns (dont anonymize these patterns)
      exclude: [/([a-z0-9](?:[a-z0-9-]{1,61}[a-z0-9])?[.])*webmanajemen\.com/],
      // url redirector
      redirect: 'https://www.webmanajemen.com/page/safelink.html?url=',
      // debug
      verbose: false,
      // encryption type = 'base64' | 'aes'
      type: 'base64',
      // password aes, default = root
      password: 'unique-password'
    });
    instance.parse(document.querySelector('div#external'));
    instance.parse(document.querySelector('div#internal'));

    const currentQuery = JSON.stringify(instance.resolveQueryUrl(location.href), null, 2);
    table.innerHTML += `<tr id="current-queries"><td>Redirector Resolver <a href="#query-url" class="btn btn-sm btn-warning">Change</a></td> <td><code>window.safelink.resolveQueryUrl(location.href)</code></td><td><pre><code class="language-json">${currentQuery}</code></pre></td></tr>`;

    const param = new URLSearchParams(window.location.search);
    if (param.has('o') || param.has('url') || location.href.match(/#(o|url)=/)) {
      document.getElementById('current-queries').scrollIntoView();
    }
  }

  Array.from(document.links).forEach((el) => {
    if (!el.innerHTML.length) {
      el.textContent = el.getAttribute('href');
      el.addEventListener('click', (e) => {
        e.preventDefault();
        window.location.href = el.href;
        if (el.href.match(/#(o|url)=/)) location.reload();
      });
    }
  });
});
</script>
    
  

CHANGELOG of safelinkify

1.2.1

  • [ 2023-09-07 12:44:48 ] a4878d7 add changelog v1.2.1

  • [ 2023-10-17 18:30:11 ] d47e4a9 chore: update dependencies

  • [ 2023-10-17 18:33:46 ] 65912cf try add exports property

  • [ 2023-10-17 18:35:21 ] 0e6c920 install husky and lint-staged

  • [ 2023-10-17 18:39:14 ] e63f256 chore: url starts with ? and # should be internal/not anonymize

  • [ 2023-10-17 18:40:07 ] 54ea68e

    remove @types/prettier prettier v3 has internal definition files

  • [ 2023-10-17 18:41:05 ] 977f69f remove unused files in monorepo

  • [ 2023-10-17 18:44:52 ] 07990b6 url starts with ? and # should be internal

  • [ 2023-10-17 18:45:24 ] ba73a6a ignore lint dist files

  • [ 2025-02-07 12:18:59 ] 15470c5 docs: change sample link to blame

  • [ 2025-07-19 11:30:46 ] 1de95da fix: update code actions on save settings to never organize imports and explicitly fix all

  • [ 2025-07-19 11:35:11 ] 1afad2c fix: replace cross-spawn with child_process and improve package checks

  • [ 2025-07-19 11:37:03 ] 8ed6ec1 fix: update build-release workflow to improve path handling and node version configuration

  • [ 2025-07-19 11:54:55 ] 416ec72 feat: add instructions for conventional commits and Node.js configuration

  • [ 2025-07-19 12:46:18 ] 01d0dff

    refactor(changelog): rewrite changelog generation with version grouping

    • Replace static markdown with dynamic extraction of versions and commits from git log.
    • Group commits by detected version bumps.
    • Output detailed changelog with commit links and dates.
    • Write raw log to tmp/original.md for debugging.
    • Improve version extraction and sorting logic.
  • [ 2025-07-19 12:57:11 ] a54e015

    chore(changelog): improve extraction logic

    • Exclude "update build from http(s)://" commits from changelog.
    • Prevent duplicate commit messages in version sections by overwriting previous entries with the latest hash and date.
  • [ 2025-07-19 12:59:58 ] e65b788

    fix(changelog): detect version bumps for plain semantic version strings

    • Added support to treat commits like 1.2.3 as version bumps in changelog generation
  • [ 2025-07-19 13:17:04 ] 5372def

    feat(changelog): improve commit parsing with author info and better filtering

    • Include author and committer names in git log extraction
    • Filter out commits from dependabot[bot] and specific non-changelog patterns
    • Improve detection of version bumps with stricter version format
    • Enhance duplication detection by matching cleaned message lines
    • Render multiline commit messages correctly in changelog
  • [ 2025-07-19 13:18:57 ] a00193a feat: add binary-collections dependency

  • [ 2025-07-19 13:20:21 ] 4cd2414 chore: remove auto generated CHANGELOG.md file

  • [ 2025-07-19 13:22:03 ] d87c48b chore(package): update scripts for prepack and prepublish hooks

  • [ 2025-07-19 13:24:58 ] c9f86a2 feat: add resolutions for binary-collections, markdown-it, and sbg-utility dependencies

  • [ 2025-07-19 13:26:00 ] 8db48de refactor: ignore dist files

  • [ 2025-07-19 13:28:10 ] 359b90a fix: ensure proper initialization of MarkdownIt with commonmark option

  • [ 2025-07-19 13:33:42 ] 6128fa6 fix: handle optional constructor parameter and improve redirect option handling

  • [ 2025-07-19 13:33:52 ] 3d5d78b feat: add import test for safelinkify and demonstrate encodeURL functionality

  • [ 2025-07-19 13:50:58 ] 14c127d feat(test): mjs import

  • [ 2025-07-19 13:53:54 ] dbde81e

    refactor(eslint): migrate to flat config and update dependencies

    • Removed legacy .eslintrc.js and .eslintignore files
    • Introduced eslint.config.mjs using FlatConfig with ESLint v9
    • Updated .vscode/settings.json to enable flat config support
    • Updated ESLint and related dependencies to latest versions
    • Aligned Prettier and TypeScript settings with new ESLint config
    • Enhanced ignore patterns and plugin rules for consistency
  • [ 2025-07-19 14:03:15 ] 8c28067 feat(test): initialize jest

  • [ 2025-07-19 14:06:12 ] 10baaa6

    test(extractDomain): add unit tests and improve robustness

    • Added extractDomain.test.ts with multiple test cases for different URL formats
    • Enhanced extractDomain to handle:
      • Non-string input
      • Empty or malformed URLs
      • Edge cases like missing hostname
    • Ensured undefined is returned when domain extraction fails
  • [ 2025-07-19 14:10:26 ] 47f5f17

    test(string): add unit tests and fix type for string.ts

    • Added unit tests for:
      • bufferToString
      • capitalizer (with custom separators)
      • escapeRegex (method 1 and 2)
      • streamToString using a Readable stream
    • Updated type definition of streamToString to accept NodeJS.ReadableStream
  • [ 2025-07-19 14:12:59 ] 755bb0d

    fix(parseQuery): improve accuracy and add unit tests

    • Ensure hash query parameters override search params
    • Safely check for existence of key using hasOwnProperty
    • Return undefined for missing keys instead of falling back to entire object
    • Added comprehensive unit tests covering:
      • Empty and invalid URLs
      • Query string parsing
      • Hash parsing
      • Key-specific query extraction
      • Precedence of hash over search
  • [ 2025-07-19 14:22:26 ] dcd5dda

    test(safelink): add unit tests and refactor direct tests

    • Added comprehensive unit tests for the safelink class covering:
      • Initialization and option merging
      • URL exclusion logic with strings and regex
      • Encoding and HTML anonymization
    • Moved direct script tests (index.test.ts and safelink.test.ts) to test/*.direct.ts
      • Updated imports to point to ../src instead of local
    • Verified HTML parsing behavior preserves excluded links and anonymizes others
  • [ 2025-07-19 14:25:01 ] c056e37

    test(toURL): add unit tests and improve fallback handling

    • Added unit tests for toURL, isValidHttpUrl, and fixUrl covering:
      • Valid and invalid URL inputs
      • Handling of URL objects
      • Normalization of slashes in URLs
    • Updated toURL to explicitly return null when input is not a supported URL pattern
  • [ 2025-07-19 14:40:40 ] 398b410 fix(parse): correct type import for NodeJS.ReadStream in parse method

  • [ 2025-07-19 14:46:28 ] 3a8dc3b

    docs(readme): improve structure, examples, and formatting

    • Clarified installation instructions for both npm and yarn
    • Refined usage documentation with clear code samples for browser and Node.js
    • Added Gulp integration example with updated formatting and comments
    • Improved formatting consistency across code blocks, tables, and sections
    • Updated examples to reflect real output and enhance readability
  • [ 2025-07-19 15:24:48 ] 4ac69fd

    build: support modern bundlers (Vite, Webpack) via rollup build

    • Added rollup config to bundle safelink-browser-module for both CJS and ESM
    • Exported browser_module in package.json with proper types and dual module formats
    • Extended README with example usage for modern frameworks (e.g., Vite/Webpack)
    • Updated build script to include rollup
    • Added necessary dev dependencies: rollup, @rollup/plugin-* and rollup-plugin-dts
  • [ 2025-07-19 15:25:41 ] 4bc96b8

    chore: upgrade Yarn to version 4.9.2 and enable global cache

    • Updated .yarnrc.yml to enable global cache and changed Yarn path to 4.9.2.
    • Updated package.json to reflect the new Yarn version in packageManager.

1.1.19

  • [ 2023-09-06 07:08:04 ] 72e5d15 add import test

  • [ 2023-09-06 07:29:47 ] 392acce

    fix: miss-configured types

    • recreate types manual from dist
  • [ 2023-09-06 07:33:27 ] 10a6704 update packer

  • [ 2023-09-06 08:49:52 ] 1561979 split parse url to new function

  • [ 2023-09-06 08:51:23 ] 32e54a0 split parse url to new function

  • [ 2023-09-06 08:53:36 ] 121fdf6

    chore(minor): v1.2.0

    • split parse url to new function
  • [ 2023-09-07 00:34:22 ] c66d5f5 update hostname type

  • [ 2023-09-07 00:36:54 ] 26c8440 try apply global vars

  • [ 2023-09-07 00:40:22 ] da35016 ignore dist on monorepo

  • [ 2023-09-07 06:37:20 ] 794976b add intellij idea key binding

  • [ 2023-09-07 06:47:08 ] f7d4b5b import yarn config

  • [ 2023-09-07 06:49:43 ] e678a41 update missing definition files

  • [ 2023-09-07 06:50:24 ] a6a6159 ignore lock file

  • [ 2023-09-07 06:53:28 ] 9625faa eslint --fix

  • [ 2023-09-07 06:56:08 ] 0d494e1 refactor: disable tabs

  • [ 2023-09-07 06:56:31 ] 682a0cd change types and downgrade prettier@^2

  • [ 2023-09-07 07:05:25 ] a10ed34 moved globals contents to index

  • [ 2023-09-07 07:14:51 ] b6b6701 update custom types

  • [ 2023-09-07 07:16:08 ] 599d3f1 fix: NodeJS definition file imports

  • [ 2023-09-07 07:19:44 ] 98a9023 ignore yarn version cache

1.1.16

  • [ 2023-02-18 17:09:01 ] 76d3341 chore: merge from monorepo

  • [ 2023-02-18 17:09:51 ] 811fcd4 chore: update dependencies

  • [ 2023-02-20 08:41:49 ] c5e2d66 chore(deps):

  • [ 2023-02-20 09:00:19 ] 2366702 chore:

  • [ 2023-02-20 09:01:28 ] 569daa7 chore:

  • [ 2023-02-21 00:55:49 ] 31b1105 chore:

  • [ 2023-02-21 09:46:41 ] ff635c3 chore: ignore tsbuildinfo files to packed

  • [ 2023-02-28 03:32:19 ] 183a662 feat: add @types/markdown-it

  • [ 2023-04-14 02:03:07 ] 4de4b56 chore: using wildcard version git-command-helper

  • [ 2023-04-18 17:36:55 ] f484e25 chore: update dependencies

  • [ 2023-04-18 18:09:14 ] 4f63e04 chore: bump v1.1.18

  • [ 2023-04-20 14:56:38 ] 054e546 chore: change cross-spawn source

  • [ 2023-04-28 17:24:19 ] 99d6ae7 chore: update build

  • [ 2023-05-07 04:22:31 ] 7f8cc5a chore: update dependencies

  • [ 2023-05-07 09:26:31 ] e045886 chore: moved persistent-cache to dev

  • [ 2023-05-08 11:14:10 ] 32c13a2 refactor: re-order dependencies

  • [ 2023-05-09 18:46:27 ] 76946a5 chore: update dependencies

  • [ 2023-05-26 00:16:50 ] 1dbeeb2 chore: update dependencies

  • [ 2023-05-26 00:22:08 ] f20f7ab chore: update dependencies

  • [ 2023-08-20 07:00:40 ] e8d6899 docs: add samples

  • [ 2023-08-20 07:01:01 ] 5e411cb fix: table

  • [ 2023-08-27 17:42:56 ] d757e86 drop tsBuildInfoFile

  • [ 2023-08-27 17:45:23 ] f9559f6 drop references

  • [ 2023-08-27 17:48:52 ] cf8d3e2 fix partial type validation

  • [ 2023-08-27 17:50:16 ] 1405ccc simplify validate

  • [ 2023-08-27 17:51:17 ] a37ff2e make return Nullable

  • [ 2023-08-27 17:51:50 ] 15a129a validate property using in operator

  • [ 2023-08-27 17:53:02 ] 1e500b7 simplify validate

  • [ 2023-08-27 17:54:18 ] 432eaf1 force cast to dynamic object

  • [ 2023-08-27 17:54:50 ] bd15bed chore: update build

  • [ 2023-08-27 17:55:45 ] 525ab8b enable declaration

  • [ 2023-08-31 10:26:04 ] dc7626c update typescript

  • [ 2023-09-03 18:57:20 ] c616967 update dependencies

  • [ 2023-09-04 05:15:38 ] 4044979 downgrade typescript

  • [ 2023-09-05 00:47:00 ] 830d978 update linter modules

  • [ 2023-09-05 01:35:39 ] 279d84c ignore *.tsbuildinfo

  • [ 2023-09-05 01:36:03 ] 7820a2e update build

  • [ 2023-09-05 02:00:55 ] 02dad73

    fix(TS2550): add lib es2020

    • Property 'matchAll' does not exist on type 'string'
    • Property 'fromEntries' does not exist on type 'ObjectConstructor
  • [ 2023-09-05 02:01:36 ] 04328a2 disable typechecking, enable esmodule interop

  • [ 2023-09-05 02:03:59 ] 1cc4b13 fix(window const): add lib DOM

  • [ 2023-09-05 02:09:33 ] 2148e75 update build

  • [ 2023-09-06 06:14:21 ] 2b43d67 update build

  • [ 2023-09-06 06:18:38 ] 570bc07 add declaration dir

  • [ 2023-09-06 06:19:46 ] beef52e fixed build

  • [ 2023-09-06 06:31:46 ] 631dd88 add declaration dir

1.1.15

  • [ 2023-02-17 23:56:54 ] 13511c1 chore: update from monorepo
  • [ 2023-02-17 23:57:33 ] 22b11a4 chore: update deps
  • [ 2023-02-18 17:03:12 ] fba0925 docs: recommend install as dev

1.1.14

  • [ 2023-02-10 19:39:04 ] c3feda1 fix: fix module resolutions
  • [ 2023-02-12 18:20:24 ] 4cd36c4 fix: resolve module resolutions

1.1.13

  • [ 2023-01-01 01:10:07 ] e82a341 move inconsistent checksum to optional packages

  • [ 2023-01-01 01:16:58 ] 29bf15c update docs

  • [ 2023-01-01 01:49:45 ] 5e86fa1 update docs

  • [ 2023-01-22 15:39:11 ] d98a27b chore(deps): update dependencies

  • [ 2023-01-22 16:56:57 ] 8ec10dd chore(script): remove postinstall

  • [ 2023-01-22 17:00:13 ] 8fa5c06 chore(script): rename postbuild to pack

  • [ 2023-01-22 18:02:19 ] edaad9e chore(webpack): fix dependencies

  • [ 2023-01-22 18:07:08 ] b7da1bc feat(license): change to MIT

  • [ 2023-01-22 21:33:21 ] 1a29a89 chore(deps): update deps

  • [ 2023-01-22 23:59:15 ] d1e09df chore(dist): update bundle

  • [ 2023-01-23 03:05:01 ] 7803ff8 fix(deps): fix module resolutions

  • [ 2023-01-23 03:10:32 ] c727224 refactor(ci): remove prebuild script

  • [ 2023-01-23 03:51:54 ] 6edeb5f fix(script): remove preupdate script

  • [ 2023-01-23 04:18:09 ] b6df36c add recommendation

  • [ 2023-01-23 05:04:40 ] 2f56bc0 feat: add glob

  • [ 2023-01-23 05:05:38 ] efbcca4 fix(dist): update build

  • [ 2023-01-23 05:28:23 ] 9c1987b refactor(dist): fresh build with new dependencies

  • [ 2023-01-23 06:33:10 ] a034f87

    refactor: renaming static-blog-generator branches

    master -> beta release -> master

  • [ 2023-01-23 19:18:09 ] 5e59acd chore: update tarball

  • [ 2023-01-24 12:21:32 ] fe41f6e chore(deps): update dependencies

  • [ 2023-01-24 13:19:09 ] 38a9251 chore(deps): update submodules and dependencies

  • [ 2023-01-24 16:28:29 ] 8e967d2 chore(deps): update dependencies

  • [ 2023-01-24 18:49:16 ] 58a94df chore(dist): update dependencies

  • [ 2023-01-24 18:50:45 ] 58db45b feat(ci): init CI for monorepo

  • [ 2023-01-24 19:11:17 ] acc3286 chore(deps): installing non sbg module from registry with wildcard version

  • [ 2023-01-24 23:18:15 ] d72dd7c chore(dist): update deps

  • [ 2023-01-25 01:19:20 ] 80db377 chore(dist): fresh pack

  • [ 2023-01-25 12:23:40 ] e6bbd1a chore(deps): update dependencies

  • [ 2023-01-25 13:03:28 ] ca10029 chore(dist): update build

  • [ 2023-01-25 13:51:29 ] 03dcf79 chore(ci): update build actions

  • [ 2023-01-25 16:30:16 ] 8f98307 chore(dist): update git-command-helper API

  • [ 2023-01-25 16:30:39 ] c2c798a chore(dist): update git-command-helper API

  • [ 2023-01-25 16:51:29 ] 54ccfd6 chore: update build and dependencies

  • [ 2023-01-26 05:35:06 ] c65cea6 test: fixed CLI test using npx

  • [ 2023-01-28 14:09:26 ] 123e613 chore(deps): update dependencies

  • [ 2023-01-28 17:34:57 ] a2a4899 refactor(hbx): init ci

  • [ 2023-01-30 12:42:22 ] 43ce14f chore(deps): update dependencies

  • [ 2023-01-30 18:40:02 ] 165c1f6 fix(ci): re-bootstrap using lerna

  • [ 2023-01-31 13:41:32 ] 66cc59b chore: update dependencies

  • [ 2023-01-31 13:47:08 ] 884819f fix(ci): change token

  • [ 2023-01-31 21:45:35 ] f95c8dd fix: prepare using yarn

  • [ 2023-02-02 05:09:10 ] 481fb1c refactor: migrate using yarn workspace

  • [ 2023-02-02 15:08:31 ] f7b72e4 chore: try build with yarn

  • [ 2023-02-02 17:33:33 ] efa454d

    refactor: update and pack

    add non-included submodules update dependencies create new tarball packs

  • [ 2023-02-02 17:49:28 ] 97193a5 chore: change highlight.js to fixed version 11.7.0

  • [ 2023-02-02 22:02:26 ] 5188dee refactor: delete unused tarball

  • [ 2023-02-02 22:13:23 ] 4a860f1 remove unused files

  • [ 2023-02-03 18:59:12 ] 3ea47ef chore(deps): update dependencies

  • [ 2023-02-03 21:32:15 ] 264179c chore: create fresh tarballs

  • [ 2023-02-03 21:54:47 ] e5a3c19 refactor: update packer

  • [ 2023-02-04 08:10:29 ] df944da refactor: remove .yarn caches

  • [ 2023-02-04 14:36:17 ] a4c2bd8 chore: update dependencies and packer

  • [ 2023-02-04 19:12:41 ] f096111 refactor: pack using yarn

  • [ 2023-02-04 22:04:01 ] eb8338b chore: update dependencies

  • [ 2023-02-05 23:02:23 ] f2f39ef chore: fresh build

  • [ 2023-02-06 18:53:10 ] 438afe3 chore: update dependencies

  • [ 2023-02-07 11:10:33 ] 584861e chore(deps): update dependencies

  • [ 2023-02-08 18:33:31 ] 2b7c984 chore: fresh stable build

  • [ 2023-02-10 19:11:52 ] df5f989 refactor: install yarn version

1.1.12

  • [ 2022-12-31 22:38:09 ] 8eeda8a update deps
  • [ 2022-12-31 23:08:30 ] ff2e631 update deps

1.1.11

  • [ 2022-12-29 16:06:22 ] 24d1142 update task
  • [ 2022-12-29 16:32:31 ] 2fde010 update docs
  • [ 2022-12-29 16:40:29 ] 90de175 update typedoc
  • [ 2022-12-29 16:43:18 ] b8b3363 update typedocs
  • [ 2022-12-29 16:45:17 ] c3333a8 rename tests to src-docs
  • [ 2022-12-29 16:53:59 ] 7920b72 update deps
  • [ 2022-12-29 16:57:21 ] e7c87fe update deps
  • [ 2022-12-29 18:24:59 ] dcb3e45 update deps
  • [ 2022-12-31 20:25:39 ] 4614820 Update postinstall.js
  • [ 2022-12-31 21:02:21 ] 1027a10 Update .prettierrc.json
  • [ 2022-12-31 22:31:37 ] 055d6d7 prepare update 1.1.12

1.1.10

  • [ 2022-12-26 12:58:46 ] 5c7522e update changelog
  • [ 2022-12-26 13:02:29 ] 074689d rename README.md to lowercase
  • [ 2022-12-26 13:13:41 ] c3d4870 Update script.js
  • [ 2022-12-27 18:13:26 ] f6eadd8 update scripts
  • [ 2022-12-28 03:17:12 ] 32d231a Update readme.md
  • [ 2022-12-28 03:23:55 ] e7ef4a8 update deps
  • [ 2022-12-28 03:25:15 ] b7b2260 Update readme.md
  • [ 2022-12-28 03:29:52 ] 311f600 Update readme.md
  • [ 2022-12-28 03:31:19 ] 1cd8dca Update readme.md
  • [ 2022-12-28 03:33:15 ] 9aef05f Update readme.md
  • [ 2022-12-28 03:33:41 ] fabe245 Update readme.md
  • [ 2022-12-28 03:34:49 ] b32220a Update readme.md
  • [ 2022-12-28 03:35:18 ] 103c90c Update readme.md
  • [ 2022-12-28 03:47:23 ] 1abb55d update changelog
  • [ 2022-12-28 03:49:27 ] 1861105 update deps
  • [ 2022-12-28 03:50:28 ] f33f6b5 update deps
  • [ 2022-12-28 13:29:54 ] b45016f Update readme.md
  • [ 2022-12-28 13:30:38 ] 0802620 Update readme.md
  • [ 2022-12-28 13:36:54 ] b8061cc Update readme.md
  • [ 2022-12-28 13:38:17 ] f2a41d7 Update readme.md
  • [ 2022-12-29 12:27:34 ] c07e62c add lib dom
  • [ 2022-12-29 12:32:54 ] 491a749 rename lib.dom.d.ts
  • [ 2022-12-29 12:51:38 ] c3da040 rename lib.dom.d.ts
  • [ 2022-12-29 12:58:33 ] d18f2a0 update docs
  • [ 2022-12-29 13:12:04 ] c27ea0e using my global typedocs
  • [ 2022-12-29 13:17:02 ] f5863f5 migrate to our global docs
  • [ 2022-12-29 13:18:14 ] 794a2bc update scripts
  • [ 2022-12-29 13:18:50 ] 44e4511 fix merge conflict
  • [ 2022-12-29 13:19:35 ] 4b07f7e fix merge conflict
  • [ 2022-12-29 13:20:20 ] 6d5a019 update nodemon config
  • [ 2022-12-29 13:20:54 ] 5ffe197 update nodemon config
  • [ 2022-12-29 13:22:24 ] a7c9192 fix merge conflict
  • [ 2022-12-29 13:26:33 ] 1cdf7ae add exclusion
  • [ 2022-12-29 13:49:19 ] 0e1783a update project references
  • [ 2022-12-29 13:53:29 ] 5fb4928 update callback
  • [ 2022-12-29 13:58:33 ] dd725d1 index.ts rename to serve.ts
  • [ 2022-12-29 14:11:24 ] 1d955d5 re-init eslint
  • [ 2022-12-29 14:14:37 ] 461a369 using typedoc api than cli
  • [ 2022-12-29 14:17:34 ] 5f51f56 fix spawn import conflict
  • [ 2022-12-29 14:26:39 ] dab2911 update postbuild
  • [ 2022-12-29 14:54:20 ] d56dc9a update deps, docs builder
  • [ 2022-12-29 15:00:59 ] 5c41e15 fix miss-configured paths
  • [ 2022-12-29 15:25:28 ] a6dce30 builder using javascript instead typescript
  • [ 2022-12-29 15:38:35 ] e19a0fd update docs builder
  • [ 2022-12-29 15:40:30 ] 02f864c run changelog.js first
  • [ 2022-12-29 15:45:27 ] 1e2f289 update test
  • [ 2022-12-29 15:45:44 ] c2f2739 update changelog
  • [ 2022-12-29 15:50:13 ] 84bee86 update docs
  • [ 2022-12-29 15:52:43 ] d1e2841 update project docs
  • [ 2022-12-29 15:55:28 ] f21956f fix infinite loop
  • [ 2022-12-29 15:57:41 ] 1e51695 update build
  • [ 2022-12-29 16:00:20 ] 2bbb5ac update deps

1.1.9

  • [ 2022-12-26 12:35:58 ] 5253b1d declare to global scope safelink and safelinkify

  • [ 2022-12-26 12:55:41 ] 050a356

    export safelink and safelinkify to global scrope

    • update docs
  • [ 2022-12-26 12:55:50 ] 28be9cc

    export safelink and safelinkify to global scrope

    • update docs

1.1.8

  • [ 2022-12-21 11:48:28 ] 7fcb525 add changelog builder
  • [ 2022-12-21 11:53:31 ] 62ab8f2 Update changelog
  • [ 2022-12-21 12:02:39 ] 20064ec Update docs and changelog
  • [ 2022-12-21 12:06:25 ] 6323d22 Update docs
  • [ 2022-12-21 12:27:37 ] fe68ba9 Update docs
  • [ 2022-12-21 12:48:00 ] 2a3ea1a using customized package cross-spawn
  • [ 2022-12-21 13:10:23 ] 534a6e6 Update docs
  • [ 2022-12-21 13:17:22 ] fd76b3b Update docs
  • [ 2022-12-21 13:19:47 ] 858ead5 Update build

1.1.7

  • [ 2022-12-21 10:18:48 ] 9d5848d Update docs
  • [ 2022-12-21 10:23:57 ] 13adeeb move types to globals

1.1.6

  • [ 2022-11-20 11:38:32 ] 7bc960f Update README.md
  • [ 2022-11-20 11:41:15 ] 8d3c848 Update README.md
  • [ 2022-12-21 10:12:29 ] 694c87c update deps and scripts
  • [ 2022-12-21 10:13:04 ] 377a912 move and export all types from/to globals
  • [ 2022-12-21 10:14:48 ] 9051509 Update README.md
  • [ 2022-12-21 10:16:11 ] 3faabe5 Update README.md
  • [ 2022-12-21 10:16:56 ] 98d00d5 push release too

1.1.5

  • [ 2022-11-09 16:30:14 ] b5b6896 add OR
  • [ 2022-11-09 16:31:28 ] ae6fca5 add null validation
  • [ 2022-11-09 16:32:08 ] 6011523 Update safelink.yml
  • [ 2022-11-09 16:33:27 ] 61c0d03 Using npm
  • [ 2022-11-09 16:37:43 ] ecc409f add commits
  • [ 2022-11-09 16:38:18 ] abd46eb update build
  • [ 2022-11-09 16:53:11 ] d63681d Update safelink.yml
  • [ 2022-11-09 16:53:44 ] 5acfae9 Update safelink.yml
  • [ 2022-11-09 16:54:14 ] 96ba98c Update safelink.yml
  • [ 2022-11-09 16:59:58 ] 600ae45 Update safelink.yml
  • [ 2022-11-09 17:06:39 ] 4c865fe update build

1.1.4

  • [ 2022-10-17 01:49:39 ] 3cafc9d Update README.md
  • [ 2022-10-17 01:55:33 ] 5298e34 Update CHANGELOG.md
  • [ 2022-10-17 01:58:21 ] 2974c3a update docs
  • [ 2022-10-26 09:03:33 ] d50f681 update dependencies

1.1.3

  • [ 2022-05-21 11:32:57 ] bcde9f0 update 1.1.3 ES5
  • [ 2022-05-21 11:33:54 ] 35da245 compile to es5
  • [ 2022-05-25 00:25:15 ] eed24bc +lib
  • [ 2022-05-28 15:39:28 ] d50c52d fix module resolutions
  • [ 2022-05-28 15:47:45 ] eacf6bb fix build
  • [ 2022-05-28 17:52:09 ] 311c604 update d.ts
  • [ 2022-05-31 07:40:04 ] 786d238 export options
  • [ 2022-06-03 07:40:56 ] 1322357 migrate to yarn v2
  • [ 2022-06-03 08:03:10 ] 4313451 fix yarn v2 exclusions
  • [ 2022-06-03 08:32:17 ] 3bdbb35 update module resolutions
  • [ 2022-06-03 08:51:04 ] f9564bf enable global cache
  • [ 2022-06-10 16:37:52 ] 301f8a4 using npm instead of yarn
  • [ 2022-06-14 18:29:13 ] 29b7fae fresh build
  • [ 2022-06-14 18:29:42 ] b3b8803 add test unit
  • [ 2022-06-14 18:31:01 ] 3db17d7 fresh install
  • [ 2022-06-14 18:34:14 ] aa36bea fresh install
  • [ 2022-10-17 00:55:56 ] 3344980 convert parse to async
  • [ 2022-10-17 00:59:02 ] 6447426 -test
  • [ 2022-10-17 01:16:56 ] c98019c update dependencies
  • [ 2022-10-17 01:40:24 ] 6753a42 fix nulled process
  • [ 2022-10-17 01:43:15 ] 1bd954d add docs
  • [ 2022-10-17 01:44:54 ] 9e460f4 update docs
  • [ 2022-10-17 01:45:16 ] 8aa82c4 update docs

1.1.2

  • [ 2022-05-19 11:19:01 ] 5b3eb76 fix anonymizing same link on non-hyperlink
  • [ 2022-05-19 11:21:52 ] bdfa182 update docs
  • [ 2022-05-19 11:24:45 ] 0a24dcd update docs
  • [ 2022-05-19 11:26:16 ] a87c735 update docs
  • [ 2022-05-21 10:14:05 ] 41facd5 export interface Nullable

1.1.1

  • [ 2022-05-19 10:31:47 ] de49114 update 1.1.1
  • [ 2022-05-19 10:35:02 ] 58e9c38 update docs
  • [ 2022-05-19 10:35:35 ] 80cd1ec update docs
  • [ 2022-05-19 10:35:42 ] 96a7465 update docs
  • [ 2022-05-19 10:48:47 ] 73ea90c update docs
  • [ 2022-05-19 10:49:28 ] e18de77 update docs
  • [ 2022-05-19 11:17:25 ] 2482a80 fix anonymizing same link on non-hyperlink
  • [ 2022-05-19 11:17:46 ] 2e64dce fix anonymizing same link on non-hyperlink

1.1.0

  • [ 2022-05-19 08:59:17 ] 2611fef update changelog
  • [ 2022-05-19 09:03:15 ] 8e3977b fix documenter
  • [ 2022-05-19 10:22:24 ] 4b1be16 fix nodejs process
  • [ 2022-05-19 10:26:25 ] 546e33d Update README.md
  • [ 2022-05-19 10:26:57 ] 8a2fb17 update docs
  • [ 2022-05-19 10:28:55 ] b5d6362 fix update
  • [ 2022-05-19 10:30:25 ] c910922 update 1.1.1

1.0.9

  • [ 2022-05-19 08:57:37 ] 2ec240d +changelog

1.0.8

  • [ 2022-05-19 06:42:08 ] b7ab961 update linux
  • [ 2022-05-19 08:24:16 ] 772e5dc Update README.md
  • [ 2022-05-19 08:40:03 ] db5f5ca fix for nodeJS
  • [ 2022-05-19 08:40:33 ] 46a521f fix
  • [ 2022-05-19 08:53:37 ] df13456 fix nodejs process
  • [ 2022-05-19 08:53:49 ] 9a68d2b update docs
  • [ 2022-05-19 08:55:51 ] e607c06 update docs
  • [ 2022-05-19 08:55:57 ] 76cec9f update docs

1.0.7

  • [ 2022-04-26 01:12:56 ] 74f2cad update docs
  • [ 2022-04-26 01:13:12 ] 89431f1 update docs
  • [ 2022-04-26 01:22:18 ] 9c850a7 Update README.md
  • [ 2022-04-26 04:40:09 ] 89ac38b Update README.md
  • [ 2022-04-26 14:30:25 ] 458bd2c [gh-pages] +toastr
  • [ 2022-05-04 04:41:07 ] 37c3fb0 fix deps
  • [ 2022-05-04 05:07:05 ] 054611e +encode single url
  • [ 2022-05-04 05:10:04 ] 01f504e +string type for dynamic typescript

1.0.6

  • [ 2022-04-26 00:44:01 ] c962efc improve summoner
  • [ 2022-04-26 01:02:26 ] 294d5f9 [fix][1.0.7] resolveQueryUrl
  • [ 2022-04-26 01:03:55 ] 3653aac -log
  • [ 2022-04-26 01:04:53 ] 3946a35 skip non-exist search and hashes

1.0.5

  • [ 2022-04-24 20:31:41 ] 5747ffa prepare update 1.0.6
  • [ 2022-04-24 20:34:30 ] 0d54a08 update docs

1.0.4

  • [ 2022-04-24 08:00:47 ] b689834 update docs

  • [ 2022-04-24 08:27:16 ] 4243ec6 +log summoner

  • [ 2022-04-24 12:07:35 ] 7ecd564 reload after summoner closed

  • [ 2022-04-24 12:29:27 ] 0e12853 [dev] fix summoner

  • [ 2022-04-24 12:42:18 ] be3db52 anonymize only for url start with http/s

  • [ 2022-04-24 12:45:12 ] 1a1ccaa [ejs] responsive improvement

  • [ 2022-04-24 12:50:50 ] 001deea [filter] only process url with protocols

  • [ 2022-04-24 12:53:00 ] 3bdf2db [dev] fix MaxListenersExceededWarning

  • [ 2022-04-24 12:55:36 ] 2c9960f [node] filter improvement

  • [ 2022-04-24 13:02:55 ] 0b59ef4 migrate build to gulp

  • [ 2022-04-24 13:15:55 ] a7f28a3 [migrate] prefer old builder, webpack on-fly

  • [ 2022-04-24 13:21:49 ] 91a5238 [webpack] improvement log

  • [ 2022-04-24 13:27:13 ] 7b6bb11 [gulp] detach index.ts

  • [ 2022-04-24 13:29:28 ] 1f841c1 Update gulpfile.ts

  • [ 2022-04-24 13:54:47 ] 69e9ee1 split webpack watcher

  • [ 2022-04-24 14:20:24 ] 0759d51

    [webpack] integrate webpack watcher to browser-sync [webpack] watcher improvements

  • [ 2022-04-24 14:53:04 ] acd17c6 [dev] bring barck old watcher

  • [ 2022-04-24 15:01:47 ] 1383db2 update docs

  • [ 2022-04-24 15:02:25 ] 9822e8c Update README.md

  • [ 2022-04-24 16:59:23 ] e3f1a1b detach private script from compiler

  • [ 2022-04-24 17:00:19 ] c6ca0e6 update compiled

  • [ 2022-04-24 17:10:22 ] f89cf49 restore docs index

1.0.3

  • [ 2022-04-23 04:04:59 ] ee55c98 update 1.0.3
  • [ 2022-04-23 04:05:42 ] 5544bd6 update 1.0.3
  • [ 2022-04-23 05:11:07 ] 6b18aaa prepare redirector
  • [ 2022-04-23 19:34:27 ] 53ed674 Update README.md
  • [ 2022-04-23 19:37:35 ] 5d7f3ed Update README.md
  • [ 2022-04-23 19:41:03 ] b1516da Update README.md
  • [ 2022-04-23 19:41:37 ] cee579e Update README.md
  • [ 2022-04-23 20:23:25 ] 4201016 skip CNAME
  • [ 2022-04-23 20:54:47 ] 5570edc Update README.md
  • [ 2022-04-23 23:49:18 ] b6153b3 fix yarn start
  • [ 2022-04-24 01:23:12 ] 848022d fix file watchers
  • [ 2022-04-24 01:23:47 ] 4dd3fca [windows] eol
  • [ 2022-04-24 01:34:55 ] 2ac5c01 fix import by typescript
  • [ 2022-04-24 01:58:38 ] 2d508ec fix node instance
  • [ 2022-04-24 02:15:49 ] 9682678 +fix fs webpack, +nodemon ignore
  • [ 2022-04-24 02:22:23 ] 095009f fix nodemon
  • [ 2022-04-24 02:29:52 ] 3fc9d30 remove dumper
  • [ 2022-04-24 04:45:01 ] cb3d57d +ribbon
  • [ 2022-04-24 05:07:19 ] 2ce0af3 [node] fix process content from string
  • [ 2022-04-24 05:23:16 ] 4fe6f3f [node] fix parsing from string
  • [ 2022-04-24 05:27:13 ] 70a8997 [gulp] dont copy d.ts
  • [ 2022-04-24 05:29:24 ] 45a42d7 Update README.md
  • [ 2022-04-24 05:30:32 ] 23e23d1 Update README.md
  • [ 2022-04-24 06:08:37 ] 2a33248 fix index docs
  • [ 2022-04-24 07:03:18 ] 4e16d79 -nodemon no more limitation of watched files
  • [ 2022-04-24 07:09:10 ] 465d757 update docs
  • [ 2022-04-24 07:27:01 ] cf8aced update docs
  • [ 2022-04-24 07:28:13 ] 29a3116 Update README.md
  • [ 2022-04-24 07:30:06 ] 2b69679 Update README.md
  • [ 2022-04-24 07:33:04 ] e92c6cf migrate to subfolder

1.0.2

  • [ 2022-04-23 02:06:58 ] d55f1fd update 1.0.2
  • [ 2022-04-23 02:10:01 ] ad07842 +docs
  • [ 2022-04-23 03:14:51 ] addce76 +layout redirector

0.0.0

  • [ 2022-04-23 00:37:50 ] 2e489c4 Update safelink.yml
  • [ 2022-04-23 00:47:49 ] 5fad709 +submodule
  • [ 2022-04-23 00:49:56 ] 4a0be51 update deployment
  • [ 2022-04-23 00:51:40 ] 235d262 [workflow] update
  • [ 2022-04-23 01:15:41 ] f9687a2 [workflow] test
  • [ 2022-04-23 01:17:32 ] 62e09f3 [workflow] test
  • [ 2022-04-23 01:28:34 ] 2266479 [workflow] test
  • [ 2022-04-23 01:40:39 ] 4034239 + .nojekyll
  • [ 2022-04-23 01:43:18 ] a711a54 fix bundle location
  • [ 2022-04-23 01:53:21 ] 36caf76 [workflow] just test
  • [ 2022-04-23 02:04:22 ] 8af8a28 fix EJSHelper location