slug-lib-js 0.0.0-stage → 2.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.
Files changed (33) hide show
  1. package/README.md +25 -2
  2. package/assets/bg/blue.mp4 +0 -0
  3. package/assets/bg/green.mp4 +0 -0
  4. package/assets/bg/poster.jpg +0 -0
  5. package/assets/bg/teal.mp4 +0 -0
  6. package/assets/fonts/auge-bold.otf +0 -0
  7. package/assets/fonts/auge-regular.otf +0 -0
  8. package/assets/fonts/auge-semibold.otf +0 -0
  9. package/assets/fonts/inter-var.ttf +0 -0
  10. package/assets/fonts/jetbrains-mono-var.ttf +0 -0
  11. package/assets/fonts/pacifico.ttf +0 -0
  12. package/assets/fonts/space-grotesk-var.ttf +0 -0
  13. package/assets/logos/slug-lib-js-backup.svg +48 -0
  14. package/assets/logos/slug-lib-js.svg +19 -0
  15. package/assets/site/backup/Pacifico-Regular-95szj24p.ttf +0 -0
  16. package/assets/site/backup/auge-bold-vywa1g7b.otf +0 -0
  17. package/assets/site/backup/auge-regular-hz0spgka.otf +0 -0
  18. package/assets/site/backup/auge-semibold-td2xkdwf.otf +0 -0
  19. package/assets/site/backup/copium-meme.png +0 -0
  20. package/assets/site/backup/engine/controller.api.js +1344 -0
  21. package/assets/site/backup/engine/controller.inject.js +511 -0
  22. package/assets/site/backup/engine/controller.sw.js +418 -0
  23. package/assets/site/backup/engine/corridor.js +13215 -0
  24. package/assets/site/backup/engine/corridor.wasm +0 -0
  25. package/assets/site/backup/site-backup.css +1 -0
  26. package/assets/site/backup/site-backup.js +74 -0
  27. package/assets/site/backup/sw.js +224 -0
  28. package/assets/site/index.html +112 -0
  29. package/assets/site/site.css +226 -0
  30. package/assets/site/site.js +196 -0
  31. package/index.cjs +69 -0
  32. package/index.d.ts +22 -0
  33. package/package.json +29 -4
@@ -0,0 +1,196 @@
1
+ /* slug-lib-js site bundle — docs demo with bundled helpers */
2
+ (function () {
3
+ "use strict";
4
+
5
+ var DEFAULT_SEP = "-";
6
+
7
+ function slugify(str, opts) {
8
+ opts = opts || {};
9
+ if (str == null) return "";
10
+ var separator = opts.separator || DEFAULT_SEP;
11
+ var lower = opts.lower !== false;
12
+ var strict = !!opts.strict;
13
+ var trim = opts.trim !== false;
14
+ var s = String(str).normalize("NFKD").replace(/[̀-ͯ]/g, "");
15
+ s = s.replace(/[^a-zA-Z0-9]+/g, separator);
16
+ if (lower) s = s.toLowerCase();
17
+ if (strict) s = s.replace(/[^a-z0-9]/g, "");
18
+ if (trim) s = s.replace(new RegExp("^" + separator + "+|" + separator + "+$", "g"), "");
19
+ return s;
20
+ }
21
+
22
+ function deslugify(slug, opts) {
23
+ opts = opts || {};
24
+ if (slug == null) return "";
25
+ var separator = opts.separator || DEFAULT_SEP;
26
+ var capitalize = !!opts.capitalize;
27
+ var words = String(slug).split(new RegExp(separator + "+")).filter(Boolean);
28
+ if (capitalize) {
29
+ words = words.map(function (w) { return w[0].toUpperCase() + w.slice(1); });
30
+ }
31
+ return words.join(" ");
32
+ }
33
+
34
+ function isSlug(str, opts) {
35
+ opts = opts || {};
36
+ if (typeof str !== "string" || !str) return false;
37
+ var separator = opts.separator || DEFAULT_SEP;
38
+ var allowUpper = !!opts.allowUpper;
39
+ var esc = separator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
40
+ return new RegExp("^[a-z0-9" + (allowUpper ? "A-Z" : "") + "]+(" + esc + "[a-z0-9" + (allowUpper ? "A-Z" : "") + "]+)*$").test(str);
41
+ }
42
+
43
+ function uniqueSlug(base, taken) {
44
+ taken = taken || [];
45
+ var used = {};
46
+ taken.forEach(function (t) { used[String(t)] = true; });
47
+ var root = slugify(base) || "item";
48
+ if (!used[root]) return root;
49
+ var i = 2;
50
+ while (used[root + "-" + i]) i++;
51
+ return root + "-" + i;
52
+ }
53
+
54
+ function slugWords(slug, opts) {
55
+ return deslugify(slug, opts).split(" ").filter(Boolean);
56
+ }
57
+
58
+ function slugLength(slug) {
59
+ return String(slug || "").length;
60
+ }
61
+
62
+ function truncateSlug(slug, max, opts) {
63
+ opts = opts || {};
64
+ var s = String(slug || "");
65
+ if (s.length <= max) return s;
66
+ var sep = opts.separator || DEFAULT_SEP;
67
+ var cut = s.slice(0, max).replace(new RegExp(sep + "[^" + sep + "]*$"), "");
68
+ return cut || s.slice(0, max);
69
+ }
70
+
71
+ function randomSlug(len, alphabet) {
72
+ len = len || 8;
73
+ var chars = alphabet || "abcdefghijklmnopqrstuvwxyz0123456789";
74
+ var buf = new Uint8Array(len);
75
+ crypto.getRandomValues(buf);
76
+ var out = "";
77
+ for (var i = 0; i < len; i++) out += chars[buf[i] % chars.length];
78
+ return out;
79
+ }
80
+
81
+ var API = [
82
+ ["slugify", "slugify(str, opts?)", "Normalize + transliterate to a slug.", "core"],
83
+ ["deslugify", "deslugify(slug, opts?)", "Split a slug back into words.", "core"],
84
+ ["isSlug", "isSlug(str, opts?)", "Validate slug shape.", "core"],
85
+ ["uniqueSlug", "uniqueSlug(base, taken?)", "First free -2, -3, ... variant.", "core"],
86
+ ["slugWords", "slugWords(slug, opts?)", "Slug as a word array.", "inspect"],
87
+ ["slugLength", "slugLength(slug)", "Character count.", "inspect"],
88
+ ["truncateSlug", "truncateSlug(slug, max)", "Cut on a separator boundary.", "inspect"],
89
+ ["randomSlug", "randomSlug(len?, alphabet?)", "Crypto-random slug.", "generate"],
90
+ ];
91
+
92
+ var GROUP_LABEL = { core: "core", inspect: "inspect", generate: "generate" };
93
+
94
+ function esc(s) {
95
+ return String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
96
+ }
97
+
98
+ function mount() {
99
+ var tbody = document.getElementById("api-rows");
100
+ if (tbody) {
101
+ var lastGroup = null;
102
+ API.forEach(function (row) {
103
+ if (GROUP_LABEL[row[3]] !== lastGroup) {
104
+ lastGroup = GROUP_LABEL[row[3]];
105
+ var h = document.createElement("tr");
106
+ var hc = document.createElement("td");
107
+ hc.colSpan = 3;
108
+ hc.className = "group";
109
+ hc.textContent = lastGroup;
110
+ h.appendChild(hc);
111
+ tbody.appendChild(h);
112
+ }
113
+ var tr = document.createElement("tr");
114
+ tr.innerHTML =
115
+ '<td class="name">' + esc(row[0]) + "</td>" +
116
+ '<td class="sig">' + esc(row[1]) + "</td>" +
117
+ '<td class="what">' + esc(row[2]) + "</td>";
118
+ tbody.appendChild(tr);
119
+ });
120
+ }
121
+
122
+ var set = function (id, text) {
123
+ var el = document.getElementById(id);
124
+ if (el) el.textContent = text;
125
+ };
126
+
127
+ set(
128
+ "demo-cn",
129
+ 'slugify("Hello World!")\n' +
130
+ "=> \"" + slugify("Hello World!") + "\"\n" +
131
+ 'slugify("Café Über Alles")\n' +
132
+ "=> \"" + slugify("Café Über Alles") + "\""
133
+ );
134
+
135
+ set(
136
+ "demo-fmt",
137
+ 'deslugify("my-first-post")\n' +
138
+ "=> \"" + deslugify("my-first-post") + "\"\n" +
139
+ 'isSlug("my-post-2") => ' + isSlug("my-post-2") + "\n" +
140
+ 'isSlug("My Post") => ' + isSlug("My Post")
141
+ );
142
+
143
+ set(
144
+ "demo-time",
145
+ 'uniqueSlug("My Post", taken)\n' +
146
+ 'taken = ["my-post", "my-post-2"]\n' +
147
+ "=> \"" + uniqueSlug("My Post", ["my-post", "my-post-2"]) + "\"\n" +
148
+ 'randomSlug(8) => "' + randomSlug(8) + '"'
149
+ );
150
+
151
+ set(
152
+ "demo-deb",
153
+ 'truncateSlug("a-very-long-post-title-here", 20)\n' +
154
+ "=> \"" + truncateSlug("a-very-long-post-title-here", 20) + "\"\n" +
155
+ 'slugWords("hello-brave-new-world")\n' +
156
+ "=> " + JSON.stringify(slugWords("hello-brave-new-world"))
157
+ );
158
+
159
+ var btn = document.getElementById("copy-install");
160
+ if (btn) {
161
+ btn.addEventListener("click", function () {
162
+ var text = "npm install slug-lib-js";
163
+ var done = function () {
164
+ btn.textContent = "copied";
165
+ btn.classList.add("done");
166
+ setTimeout(function () {
167
+ btn.textContent = "copy";
168
+ btn.classList.remove("done");
169
+ }, 1400);
170
+ };
171
+ if (navigator.clipboard && navigator.clipboard.writeText) {
172
+ navigator.clipboard.writeText(text).then(done, fallback);
173
+ } else {
174
+ fallback();
175
+ }
176
+ function fallback() {
177
+ var ta = document.createElement("textarea");
178
+ ta.value = text;
179
+ ta.style.position = "fixed";
180
+ ta.style.opacity = "0";
181
+ document.body.appendChild(ta);
182
+ ta.select();
183
+ try { document.execCommand("copy"); } catch (e) {}
184
+ document.body.removeChild(ta);
185
+ done();
186
+ }
187
+ });
188
+ }
189
+ }
190
+
191
+ if (document.readyState === "loading") {
192
+ document.addEventListener("DOMContentLoaded", mount);
193
+ } else {
194
+ mount();
195
+ }
196
+ })();
package/index.cjs ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ const DEFAULT_SEP = "-";
4
+
5
+ function slugify(str, opts = {}) {
6
+ if (str == null) return "";
7
+ const { separator = DEFAULT_SEP, lower = true, strict = false, trim = true } = opts;
8
+ let s = String(str).normalize("NFKD").replace(/[̀-ͯ]/g, "");
9
+ s = s.replace(/[^a-zA-Z0-9]+/g, separator);
10
+ if (lower) s = s.toLowerCase();
11
+ if (strict) s = s.replace(new RegExp(`[^a-z0-9]`, "g"), "");
12
+ if (trim) s = s.replace(new RegExp(`^${separator}+|${separator}+$`, "g"), "");
13
+ return s;
14
+ }
15
+
16
+ function deslugify(slug, opts = {}) {
17
+ if (slug == null) return "";
18
+ const { separator = DEFAULT_SEP, capitalize = false } = opts;
19
+ let words = String(slug).split(new RegExp(`${separator}+`)).filter(Boolean);
20
+ if (capitalize) words = words.map((w) => w[0].toUpperCase() + w.slice(1));
21
+ return words.join(" ");
22
+ }
23
+
24
+ function isSlug(str, opts = {}) {
25
+ if (typeof str !== "string" || !str) return false;
26
+ const { separator = DEFAULT_SEP, allowUpper = false } = opts;
27
+ const esc = separator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
28
+ return new RegExp(`^[a-z0-9${allowUpper ? "A-Z" : ""}]+(${esc}[a-z0-9${allowUpper ? "A-Z" : ""}]+)*$`).test(str);
29
+ }
30
+
31
+ function uniqueSlug(base, taken = []) {
32
+ const used = new Set(taken.map((t) => String(t)));
33
+ const root = slugify(base) || "item";
34
+ if (!used.has(root)) return root;
35
+ let i = 2;
36
+ while (used.has(`${root}-${i}`)) i++;
37
+ return `${root}-${i}`;
38
+ }
39
+
40
+ function slugWords(slug, opts = {}) {
41
+ return deslugify(slug, opts).split(" ").filter(Boolean);
42
+ }
43
+
44
+ function slugLength(slug) {
45
+ return String(slug || "").length;
46
+ }
47
+
48
+ function truncateSlug(slug, max, opts = {}) {
49
+ const s = String(slug || "");
50
+ if (s.length <= max) return s;
51
+ const sep = opts.separator || DEFAULT_SEP;
52
+ const cut = s.slice(0, max).replace(new RegExp(`${sep}[^${sep}]*$`), "");
53
+ return cut || s.slice(0, max);
54
+ }
55
+
56
+ function randomSlug(len = 8, alphabet) {
57
+ const chars = alphabet || "abcdefghijklmnopqrstuvwxyz0123456789";
58
+ const buf = new Uint8Array(len);
59
+ const c = (globalThis.crypto || require("crypto").webcrypto);
60
+ c.getRandomValues(buf);
61
+ let out = "";
62
+ for (let i = 0; i < len; i++) out += chars[buf[i] % chars.length];
63
+ return out;
64
+ }
65
+
66
+ module.exports = {
67
+ slugify, deslugify, isSlug, uniqueSlug,
68
+ slugWords, slugLength, truncateSlug, randomSlug,
69
+ };
package/index.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export interface SlugifyOptions {
2
+ separator?: string;
3
+ lower?: boolean;
4
+ strict?: boolean;
5
+ trim?: boolean;
6
+ }
7
+ export interface DeslugifyOptions {
8
+ separator?: string;
9
+ capitalize?: boolean;
10
+ }
11
+ export interface IsSlugOptions {
12
+ separator?: string;
13
+ allowUpper?: boolean;
14
+ }
15
+ export declare function slugify(str: unknown, opts?: SlugifyOptions): string;
16
+ export declare function deslugify(slug: unknown, opts?: DeslugifyOptions): string;
17
+ export declare function isSlug(str: unknown, opts?: IsSlugOptions): boolean;
18
+ export declare function uniqueSlug(base: unknown, taken?: unknown[]): string;
19
+ export declare function slugWords(slug: unknown, opts?: DeslugifyOptions): string[];
20
+ export declare function slugLength(slug: unknown): number;
21
+ export declare function truncateSlug(slug: unknown, max: number, opts?: DeslugifyOptions): string;
22
+ export declare function randomSlug(len?: number, alphabet?: string): string;
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "slug-lib-js",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2.1.3",
4
+ "description": "Small, dependency-free slug and URL-safe string utilities.",
5
+ "main": "index.cjs",
6
+ "types": "index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./index.d.ts",
10
+ "import": "./index.cjs",
11
+ "require": "./index.cjs"
12
+ }
13
+ },
14
+ "files": [
15
+ "index.cjs",
16
+ "index.d.ts",
17
+ "README.md",
18
+ "assets"
19
+ ],
20
+ "keywords": [
21
+ "slug",
22
+ "slugify",
23
+ "url",
24
+ "string",
25
+ "transliterate",
26
+ "zero-dependency"
27
+ ],
28
+ "license": "MIT",
29
+ "engines": { "node": ">=14" },
30
+ "sideEffects": false
31
+ }