timqian commited on
Commit
f51ff8f
1 Parent(s): 2ce75b3

Add extension

Browse files
extension/chart.xkcd.min.js ADDED
The diff for this file is too large to render. See raw diff
 
extension/icon.png ADDED
extension/manifest.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "Like History",
3
+ "description": "A chrome extension showing like history graph of current HuggingFace project",
4
+ "homepage_url": "https://like-history.ai",
5
+ "author": "timqian",
6
+ "version": "2.0",
7
+ "manifest_version": 3,
8
+ "action": {
9
+ "default_popup": "./popup.html"
10
+ },
11
+ "host_permissions": ["https://huggingface.co/"],
12
+ "icons": {
13
+ "128": "icon.png"
14
+ },
15
+ "permissions": ["activeTab"]
16
+ }
extension/popup.html ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <title>Like History</title>
6
+ <style>
7
+ .container {
8
+ display: flex;
9
+ justify-content: center;
10
+ align-items: center;
11
+ width: 600px;
12
+ height: 400px;
13
+ }
14
+ .line-chart {
15
+ display: block;
16
+ margin-left: auto;
17
+ margin-right: auto;
18
+ padding-right: 20pt;
19
+ width: 600px;
20
+ height: 400px;
21
+ }
22
+ h2 {
23
+ text-align: center;
24
+ }
25
+ .website-link {
26
+ font-family: xkcd;
27
+ display: block;
28
+ /** don't show underline**/
29
+ text-decoration: none;
30
+ /** color gray **/
31
+ color: #666666;
32
+ /** bigger size **/
33
+ font-size: 16px;
34
+ /** right **/
35
+ text-align: right;
36
+ /** margin right **/
37
+ margin-right: 10px;
38
+ }
39
+ </style>
40
+ </head>
41
+
42
+ <body>
43
+ <!-- Your popup's HTML content -->
44
+ <div class="container">
45
+ <svg class="line-chart"></svg>
46
+ </div>
47
+ <a class="website-link" style="font-family: 'xkcd';" href="https://like-history.ai"
48
+ target="_blank"
49
+ >&#129303; like-history.ai</a>
50
+ <script src="./chart.xkcd.min.js"></script>
51
+ <script src="./popup.js"></script>
52
+ </body>
53
+
54
+ </html>
extension/popup.js ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // get url of current tab
2
+ chrome.tabs.query({ active: true, currentWindow: true }, async function (tabs) {
3
+ const tab = tabs[0];
4
+ const url = tab.url;
5
+ const prefix = 'https://huggingface.co/';
6
+
7
+ if (!url.startsWith(prefix)) {
8
+ // show error message in .message
9
+ const message = document.querySelector('.container');
10
+ message.innerHTML = '<h2>Not a Hugging Face page.</h2>';
11
+ return;
12
+ }
13
+
14
+ // get project type and path
15
+ const [type, path] = getProjectTypeAndPath(url);
16
+
17
+ if (type === null) {
18
+ // show error message in .message
19
+ const message = document.querySelector('.container');
20
+ message.innerHTML = '<h2>No project found.</h2>';
21
+ return;
22
+ }
23
+
24
+ // get project info
25
+ const res = await fetch(`https://huggingface.co/api/${type}/${path}/likers?expand[]=likeAt`)
26
+ const likers = await res.json()
27
+ let likeHistory = transformLikesData(likers)
28
+
29
+ if (likeHistory.length > 40) {
30
+ // sample 20 points
31
+ const sampledLikeHistory = []
32
+ const step = Math.floor(likeHistory.length / 20)
33
+ for (let i = 0; i < likeHistory.length; i += step) {
34
+ sampledLikeHistory.push(likeHistory[i])
35
+ }
36
+ // Add the last point if it's not included
37
+ if (sampledLikeHistory[sampledLikeHistory.length - 1].x !== likeHistory[likeHistory.length - 1].x) {
38
+ sampledLikeHistory.push(likeHistory[likeHistory.length - 1])
39
+ }
40
+ likeHistory = sampledLikeHistory
41
+ }
42
+
43
+ // if likeHistory is empty, show error message
44
+ if (likeHistory.length === 0) {
45
+ const message = document.querySelector('.container');
46
+ message.innerHTML = '<h2>No likes found.</h2>';
47
+ return
48
+ }
49
+
50
+ const svg = document.querySelector('.line-chart');
51
+
52
+ new chartXkcd.XY(svg, {
53
+ title: 'Like History',
54
+ xLabel: 'Time',
55
+ yLabel: 'Likes',
56
+ data: {
57
+ datasets: [{
58
+ label: path,
59
+ data: likeHistory,
60
+ }],
61
+ },
62
+ options: {
63
+ // unxkcdify: true,
64
+ showLegend: false,
65
+ xTickCount: 3,
66
+ yTickCount: 4,
67
+ legendPosition: chartXkcd.config.positionType.upLeft,
68
+ showLine: true,
69
+ timeFormat: 'MM/DD/YYYY',
70
+ dotSize: 0.5,
71
+ dataColors: [
72
+ "#FBBF24", // Warm Yellow
73
+ "#60A5FA", // Light Blue
74
+ "#14B8A6", // Teal
75
+ "#A78BFA", // Soft Purple
76
+ "#FF8C00", // Orange
77
+ "#64748B", // Slate Gray
78
+ "#FB7185", // Coral Pink
79
+ "#6EE7B7", // Mint Green
80
+ "#2563EB", // Deep Blue
81
+ "#374151" // Charcoal
82
+ ]
83
+ },
84
+ });
85
+
86
+
87
+ });
88
+
89
+ function getProjectTypeAndPath(url) {
90
+ // Define the possible project types
91
+ // Create a URL object to parse the given url
92
+ const parsedUrl = new URL(url);
93
+
94
+ // Extract the pathname from the URL and split it into parts
95
+ const pathParts = parsedUrl.pathname.split('/').filter(part => part.length > 0);
96
+
97
+ if (pathParts.length < 2) {
98
+ return [null, null];
99
+ }
100
+
101
+
102
+ // The project type should be the first part of the path
103
+ const type = pathParts[0];
104
+ console.log(type);
105
+
106
+ if (type !== 'spaces' && type !== 'datasets') {
107
+ // If the type is not spaces or datasets, it should be models
108
+ const actualType = 'models';
109
+ const path = pathParts.slice(0, 2).join('/');
110
+ return [actualType, path];
111
+ } else {
112
+ const path = pathParts.slice(1, 3).join('/');
113
+ return [type, path];
114
+
115
+ }
116
+ }
117
+
118
+ function transformLikesData(likesData) {
119
+ // Step 1
120
+ likesData.sort((a, b) => new Date(a.likedAt) - new Date(b.likedAt));
121
+
122
+ // Step 2
123
+ const cumulativeLikes = {};
124
+ let cumulativeCount = 0;
125
+
126
+ // Step 3
127
+ likesData.forEach(like => {
128
+ const date = like.likedAt
129
+ cumulativeCount++;
130
+ cumulativeLikes[date] = cumulativeCount;
131
+ });
132
+
133
+ // Step 4
134
+ const transformedData = Object.keys(cumulativeLikes).map(date => ({
135
+ x: date,
136
+ y: cumulativeLikes[date].toString()
137
+ }));
138
+
139
+ return transformedData;
140
+ }
package-lock.json CHANGED
@@ -3185,80 +3185,6 @@
3185
  }
3186
  }
3187
  },
3188
- "node_modules/@rollup/plugin-babel": {
3189
- "version": "5.3.1",
3190
- "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
3191
- "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
3192
- "dependencies": {
3193
- "@babel/helper-module-imports": "^7.10.4",
3194
- "@rollup/pluginutils": "^3.1.0"
3195
- },
3196
- "engines": {
3197
- "node": ">= 10.0.0"
3198
- },
3199
- "peerDependencies": {
3200
- "@babel/core": "^7.0.0",
3201
- "@types/babel__core": "^7.1.9",
3202
- "rollup": "^1.20.0||^2.0.0"
3203
- },
3204
- "peerDependenciesMeta": {
3205
- "@types/babel__core": {
3206
- "optional": true
3207
- }
3208
- }
3209
- },
3210
- "node_modules/@rollup/plugin-node-resolve": {
3211
- "version": "11.2.1",
3212
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
3213
- "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
3214
- "dependencies": {
3215
- "@rollup/pluginutils": "^3.1.0",
3216
- "@types/resolve": "1.17.1",
3217
- "builtin-modules": "^3.1.0",
3218
- "deepmerge": "^4.2.2",
3219
- "is-module": "^1.0.0",
3220
- "resolve": "^1.19.0"
3221
- },
3222
- "engines": {
3223
- "node": ">= 10.0.0"
3224
- },
3225
- "peerDependencies": {
3226
- "rollup": "^1.20.0||^2.0.0"
3227
- }
3228
- },
3229
- "node_modules/@rollup/plugin-replace": {
3230
- "version": "2.4.2",
3231
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
3232
- "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
3233
- "dependencies": {
3234
- "@rollup/pluginutils": "^3.1.0",
3235
- "magic-string": "^0.25.7"
3236
- },
3237
- "peerDependencies": {
3238
- "rollup": "^1.20.0 || ^2.0.0"
3239
- }
3240
- },
3241
- "node_modules/@rollup/pluginutils": {
3242
- "version": "3.1.0",
3243
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
3244
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
3245
- "dependencies": {
3246
- "@types/estree": "0.0.39",
3247
- "estree-walker": "^1.0.1",
3248
- "picomatch": "^2.2.2"
3249
- },
3250
- "engines": {
3251
- "node": ">= 8.0.0"
3252
- },
3253
- "peerDependencies": {
3254
- "rollup": "^1.20.0||^2.0.0"
3255
- }
3256
- },
3257
- "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
3258
- "version": "0.0.39",
3259
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
3260
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
3261
- },
3262
  "node_modules/@rushstack/eslint-patch": {
3263
  "version": "1.3.3",
3264
  "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
@@ -13302,9 +13228,9 @@
13302
  }
13303
  },
13304
  "node_modules/postcss": {
13305
- "version": "8.4.29",
13306
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz",
13307
- "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==",
13308
  "funding": [
13309
  {
13310
  "type": "opencollective",
@@ -15350,75 +15276,6 @@
15350
  "url": "https://github.com/sponsors/isaacs"
15351
  }
15352
  },
15353
- "node_modules/rollup": {
15354
- "version": "2.79.1",
15355
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
15356
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
15357
- "bin": {
15358
- "rollup": "dist/bin/rollup"
15359
- },
15360
- "engines": {
15361
- "node": ">=10.0.0"
15362
- },
15363
- "optionalDependencies": {
15364
- "fsevents": "~2.3.2"
15365
- }
15366
- },
15367
- "node_modules/rollup-plugin-terser": {
15368
- "version": "7.0.2",
15369
- "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
15370
- "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
15371
- "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
15372
- "dependencies": {
15373
- "@babel/code-frame": "^7.10.4",
15374
- "jest-worker": "^26.2.1",
15375
- "serialize-javascript": "^4.0.0",
15376
- "terser": "^5.0.0"
15377
- },
15378
- "peerDependencies": {
15379
- "rollup": "^2.0.0"
15380
- }
15381
- },
15382
- "node_modules/rollup-plugin-terser/node_modules/has-flag": {
15383
- "version": "4.0.0",
15384
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
15385
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
15386
- "engines": {
15387
- "node": ">=8"
15388
- }
15389
- },
15390
- "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
15391
- "version": "26.6.2",
15392
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
15393
- "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
15394
- "dependencies": {
15395
- "@types/node": "*",
15396
- "merge-stream": "^2.0.0",
15397
- "supports-color": "^7.0.0"
15398
- },
15399
- "engines": {
15400
- "node": ">= 10.13.0"
15401
- }
15402
- },
15403
- "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
15404
- "version": "4.0.0",
15405
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
15406
- "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
15407
- "dependencies": {
15408
- "randombytes": "^2.1.0"
15409
- }
15410
- },
15411
- "node_modules/rollup-plugin-terser/node_modules/supports-color": {
15412
- "version": "7.2.0",
15413
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
15414
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
15415
- "dependencies": {
15416
- "has-flag": "^4.0.0"
15417
- },
15418
- "engines": {
15419
- "node": ">=8"
15420
- }
15421
- },
15422
  "node_modules/run-parallel": {
15423
  "version": "1.2.0",
15424
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -17593,6 +17450,80 @@
17593
  "ajv": ">=8"
17594
  }
17595
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17596
  "node_modules/workbox-build/node_modules/ajv": {
17597
  "version": "8.12.0",
17598
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
@@ -17622,11 +17553,69 @@
17622
  "node": ">=10"
17623
  }
17624
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17625
  "node_modules/workbox-build/node_modules/json-schema-traverse": {
17626
  "version": "1.0.0",
17627
  "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
17628
  "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
17629
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17630
  "node_modules/workbox-build/node_modules/source-map": {
17631
  "version": "0.8.0-beta.0",
17632
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
@@ -17638,6 +17627,17 @@
17638
  "node": ">= 8"
17639
  }
17640
  },
 
 
 
 
 
 
 
 
 
 
 
17641
  "node_modules/workbox-build/node_modules/tr46": {
17642
  "version": "1.0.1",
17643
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
 
3185
  }
3186
  }
3187
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3188
  "node_modules/@rushstack/eslint-patch": {
3189
  "version": "1.3.3",
3190
  "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
 
13228
  }
13229
  },
13230
  "node_modules/postcss": {
13231
+ "version": "8.4.31",
13232
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
13233
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
13234
  "funding": [
13235
  {
13236
  "type": "opencollective",
 
15276
  "url": "https://github.com/sponsors/isaacs"
15277
  }
15278
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15279
  "node_modules/run-parallel": {
15280
  "version": "1.2.0",
15281
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 
17450
  "ajv": ">=8"
17451
  }
17452
  },
17453
+ "node_modules/workbox-build/node_modules/@rollup/plugin-babel": {
17454
+ "version": "5.3.1",
17455
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
17456
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
17457
+ "dependencies": {
17458
+ "@babel/helper-module-imports": "^7.10.4",
17459
+ "@rollup/pluginutils": "^3.1.0"
17460
+ },
17461
+ "engines": {
17462
+ "node": ">= 10.0.0"
17463
+ },
17464
+ "peerDependencies": {
17465
+ "@babel/core": "^7.0.0",
17466
+ "@types/babel__core": "^7.1.9",
17467
+ "rollup": "^1.20.0||^2.0.0"
17468
+ },
17469
+ "peerDependenciesMeta": {
17470
+ "@types/babel__core": {
17471
+ "optional": true
17472
+ }
17473
+ }
17474
+ },
17475
+ "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": {
17476
+ "version": "11.2.1",
17477
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
17478
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
17479
+ "dependencies": {
17480
+ "@rollup/pluginutils": "^3.1.0",
17481
+ "@types/resolve": "1.17.1",
17482
+ "builtin-modules": "^3.1.0",
17483
+ "deepmerge": "^4.2.2",
17484
+ "is-module": "^1.0.0",
17485
+ "resolve": "^1.19.0"
17486
+ },
17487
+ "engines": {
17488
+ "node": ">= 10.0.0"
17489
+ },
17490
+ "peerDependencies": {
17491
+ "rollup": "^1.20.0||^2.0.0"
17492
+ }
17493
+ },
17494
+ "node_modules/workbox-build/node_modules/@rollup/plugin-replace": {
17495
+ "version": "2.4.2",
17496
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
17497
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
17498
+ "dependencies": {
17499
+ "@rollup/pluginutils": "^3.1.0",
17500
+ "magic-string": "^0.25.7"
17501
+ },
17502
+ "peerDependencies": {
17503
+ "rollup": "^1.20.0 || ^2.0.0"
17504
+ }
17505
+ },
17506
+ "node_modules/workbox-build/node_modules/@rollup/pluginutils": {
17507
+ "version": "3.1.0",
17508
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
17509
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
17510
+ "dependencies": {
17511
+ "@types/estree": "0.0.39",
17512
+ "estree-walker": "^1.0.1",
17513
+ "picomatch": "^2.2.2"
17514
+ },
17515
+ "engines": {
17516
+ "node": ">= 8.0.0"
17517
+ },
17518
+ "peerDependencies": {
17519
+ "rollup": "^1.20.0||^2.0.0"
17520
+ }
17521
+ },
17522
+ "node_modules/workbox-build/node_modules/@types/estree": {
17523
+ "version": "0.0.39",
17524
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
17525
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
17526
+ },
17527
  "node_modules/workbox-build/node_modules/ajv": {
17528
  "version": "8.12.0",
17529
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
 
17553
  "node": ">=10"
17554
  }
17555
  },
17556
+ "node_modules/workbox-build/node_modules/has-flag": {
17557
+ "version": "4.0.0",
17558
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
17559
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
17560
+ "engines": {
17561
+ "node": ">=8"
17562
+ }
17563
+ },
17564
+ "node_modules/workbox-build/node_modules/jest-worker": {
17565
+ "version": "26.6.2",
17566
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
17567
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
17568
+ "dependencies": {
17569
+ "@types/node": "*",
17570
+ "merge-stream": "^2.0.0",
17571
+ "supports-color": "^7.0.0"
17572
+ },
17573
+ "engines": {
17574
+ "node": ">= 10.13.0"
17575
+ }
17576
+ },
17577
  "node_modules/workbox-build/node_modules/json-schema-traverse": {
17578
  "version": "1.0.0",
17579
  "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
17580
  "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
17581
  },
17582
+ "node_modules/workbox-build/node_modules/rollup": {
17583
+ "version": "2.79.1",
17584
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
17585
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
17586
+ "bin": {
17587
+ "rollup": "dist/bin/rollup"
17588
+ },
17589
+ "engines": {
17590
+ "node": ">=10.0.0"
17591
+ },
17592
+ "optionalDependencies": {
17593
+ "fsevents": "~2.3.2"
17594
+ }
17595
+ },
17596
+ "node_modules/workbox-build/node_modules/rollup-plugin-terser": {
17597
+ "version": "7.0.2",
17598
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
17599
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
17600
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
17601
+ "dependencies": {
17602
+ "@babel/code-frame": "^7.10.4",
17603
+ "jest-worker": "^26.2.1",
17604
+ "serialize-javascript": "^4.0.0",
17605
+ "terser": "^5.0.0"
17606
+ },
17607
+ "peerDependencies": {
17608
+ "rollup": "^2.0.0"
17609
+ }
17610
+ },
17611
+ "node_modules/workbox-build/node_modules/serialize-javascript": {
17612
+ "version": "4.0.0",
17613
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
17614
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
17615
+ "dependencies": {
17616
+ "randombytes": "^2.1.0"
17617
+ }
17618
+ },
17619
  "node_modules/workbox-build/node_modules/source-map": {
17620
  "version": "0.8.0-beta.0",
17621
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
 
17627
  "node": ">= 8"
17628
  }
17629
  },
17630
+ "node_modules/workbox-build/node_modules/supports-color": {
17631
+ "version": "7.2.0",
17632
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
17633
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
17634
+ "dependencies": {
17635
+ "has-flag": "^4.0.0"
17636
+ },
17637
+ "engines": {
17638
+ "node": ">=8"
17639
+ }
17640
+ },
17641
  "node_modules/workbox-build/node_modules/tr46": {
17642
  "version": "1.0.1",
17643
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
privacy_policy.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## like-history.ai Privacy Policy
2
+ Effective Date: [Insert Effective Date]
3
+ At like-history.ai, we are committed to protecting your privacy. This Privacy Policy outlines our practices concerning the non-collection of personal information.
4
+ Non-Collection of Personal Information
5
+ like-history.ai does not collect any personal information from our users. As a visitor to our [website/application/service], you can engage in many activities without providing any personal information.
6
+ Information Not Collected
7
+ When you use our [website/application/service], we do not collect any information such as:
8
+ Name
9
+ Address
10
+ Telephone number
11
+ Email address
12
+ Credit card information
13
+ Any other personal information that can be used to identify you
14
+ Cookies and Tracking Technology
15
+ Since we do not collect any personal information, we also do not use cookies or any tracking technology that can be used to personally identify you.
16
+ Third-Party Links
17
+ Our [website/application/service] may contain links to third-party websites. We are not responsible for the privacy practices or the content of these external websites. We recommend that you review the privacy policies of these third-party sites to understand their data collection and usage practices.
18
+ Changes to Our Privacy Policy
19
+ We reserve the right to modify this Privacy Policy at any time. If we decide to change our Privacy Policy, we will post those changes on this page and/or update the Privacy Policy modification date below.
20
+ Modification Date: [Insert Last Modification Date]
21
+ Contact Us
22
+ If you have any questions regarding this Privacy Policy, please contact us at:
23
+ [Your Contact Information]
24
+ Please note that by using our [website/application/service], you consent to our Non-Collection of Personal Information Policy.
25
+ like-history.ai takes your privacy concerns seriously and we strive to ensure that your experience with our [website/application/service] is as secure and satisfactory as possible.
26
+ Thank you for choosing like-history.ai.
27
+ Please make sure to customize the placeholders with your actual company details and review the policy to ensure it accurately reflects your practices and complies with your local laws and regulations. If you have any unique conditions or services that may impact privacy, consider consulting with a legal professional to tailor the policy to your specific situation.