diff --git a/.jsonschema.json b/.jsonschema.json index 58b00dc84806..4ea3788872c9 100644 --- a/.jsonschema.json +++ b/.jsonschema.json @@ -19,7 +19,7 @@ }, "source": { "description": "The website from which the icon was sourced", - "$ref": "#/definitions/url" + "$ref": "#/definitions/sourceUrl" }, "guidelines": { "description": "The brand guidelines", @@ -229,6 +229,20 @@ "description": "The name of the brand", "type": "string" }, + "sourceUrl": { + "$id": "#sourceUrl", + "description": "URL for icon source. If is a GitHub URL, is validated to contain a commit hash, to be an issue comment or to be a GitHub organization URL", + "type": "string", + "if": { + "pattern": "^https://github\\.com/(?!(features/actions)|(sponsors)|(logos)$)" + }, + "then": { + "pattern": "^https://github\\.com/[^/]+/[^/]+/(blob/[a-f\\d]{40}/[^\\s]+)|(tree/[a-f\\d]{40}(/[^\\s]+)?)|(((issues)|(pull))/\\d+#issuecomment-\\d+)$" + }, + "else": { + "$ref": "#/definitions/url" + } + }, "url": { "$id": "#url", "description": "HTTPS-only URL for a source", diff --git a/_data/simple-icons.json b/_data/simple-icons.json index afb6b860c5ca..4d8c2e6d2bdd 100644 --- a/_data/simple-icons.json +++ b/_data/simple-icons.json @@ -3,7 +3,7 @@ { "title": ".ENV", "hex": "ECD53F", - "source": "https://github.com/motdotla/dotenv", + "source": "https://github.com/motdotla/dotenv/tree/40e75440337d1de2345dc8326d6108331f583fd8", "aliases": { "aka": [ "Dotenv" @@ -1010,7 +1010,7 @@ { "title": "Ardour", "hex": "C61C3E", - "source": "https://github.com/Ardour/ardour/tree/master/tools/misc_resources/" + "source": "https://github.com/Ardour/ardour/tree/d39f064756c88197adfe13fe695b86bd8cb3bb81/tools/misc_resources" }, { "title": "Arduino", @@ -1226,7 +1226,7 @@ { "title": "Awesome Lists", "hex": "FC60A8", - "source": "https://github.com/sindresorhus/awesome/tree/master/media" + "source": "https://github.com/sindresorhus/awesome/tree/52b6dbacde01c2595f2133a5378cb8d2f89906fa/media" }, { "title": "awesomeWM", @@ -1823,6 +1823,11 @@ "source": "https://www.caffeine.tv/", "guidelines": "https://www.caffeine.tv/newsroom.html" }, + { + "title": "Cairo Graphics", + "hex": "F39914", + "source": "https://github.com/freedesktop/cairo/blob/44f808fce9f437e14f2b0ef4e1583def8ab578ae/doc/tutorial/slides/cairo-title.svg" + }, { "title": "Cairo Metro", "hex": "C10C0C", @@ -2181,7 +2186,7 @@ { "title": "CNCF", "hex": "231F20", - "source": "https://github.com/cncf/artwork/blob/master/examples/other.md#cncf-logos", + "source": "https://github.com/cncf/artwork/blob/d2ed716cc0769e6c65d2e58f9a503fca02b60a56/examples/other.md#cncf-logos", "guidelines": "https://www.cncf.io/brand-guidelines/" }, { @@ -2315,8 +2320,8 @@ }, { "title": "CodeSandbox", - "hex": "000000", - "source": "https://codesandbox.io" + "hex": "151515", + "source": "https://codesandbox.io/CodeSandbox-Press-Kit.zip" }, { "title": "Codeship", @@ -2639,7 +2644,7 @@ { "title": "D-EDGE", "hex": "432975", - "source": "https://github.com/d-edge/JoinUs/blob/main/d-edge.svg" + "source": "https://github.com/d-edge/JoinUs/blob/4d8b5cf7145db26649fe9f1587194e44dbbe3565/d-edge.svg" }, { "title": "D-Wave Systems", @@ -2685,7 +2690,7 @@ { "title": "Dart", "hex": "0175C2", - "source": "https://github.com/dart-lang/site-shared/tree/master/src/_assets/image/dart/logo" + "source": "https://github.com/dart-lang/site-shared/tree/18458ff440afd3d06f04e5cb871c4c5eda29c9d5/src/_assets/image/dart/logo" }, { "title": "Darty", @@ -3044,7 +3049,7 @@ { "title": "DocuSign", "hex": "FFCC22", - "source": "https://github.com/simple-icons/simple-icons/issues/1098" + "source": "https://www.docusign.com/sites/all/themes/custom/docusign/favicons/mstile-310x310.png" }, { "title": "Dogecoin", @@ -3304,7 +3309,7 @@ { "title": "Electron Fiddle", "hex": "E79537", - "source": "https://github.com/electron/fiddle" + "source": "https://github.com/electron/fiddle/blob/19360ade76354240630e5660469b082128e1e57e/assets/icons/fiddle.svg" }, { "title": "electron-builder", @@ -3335,7 +3340,7 @@ { "title": "Elixir", "hex": "4B275F", - "source": "https://github.com/elixir-lang/elixir-lang.github.com/tree/master/images/logo" + "source": "https://github.com/elixir-lang/elixir-lang.github.com/tree/031746384ee23b9be19298c92a9699c56cc05845/images/logo" }, { "title": "Ello", @@ -4654,6 +4659,12 @@ "hex": "FF3633", "source": "https://www.graylog.org" }, + { + "title": "Greenhouse", + "hex": "24A47F", + "source": "https://brand.greenhouse.io/brand-portal/p/6", + "guidelines": "https://brand.greenhouse.io/brand-portal/p/5" + }, { "title": "GreenSock", "hex": "88CE02", @@ -4740,7 +4751,7 @@ { "title": "Gutenberg", "hex": "000000", - "source": "https://github.com/WordPress/gutenberg/blob/master/docs/final-g-wapuu-black.svg" + "source": "https://github.com/WordPress/gutenberg/blob/7829913ae117dfb561d14c600eea7b281afd6556/docs/final-g-wapuu-black.svg" }, { "title": "Habr", @@ -5004,6 +5015,11 @@ "hex": "E40521", "source": "https://www.honda.ie/" }, + { + "title": "Honey", + "hex": "FF6801", + "source": "https://www.joinhoney.com/" + }, { "title": "Hootsuite", "hex": "143059", @@ -5497,7 +5513,7 @@ { "title": "Jamstack", "hex": "F0047F", - "source": "https://github.com/jamstack/jamstack.org/tree/main/src/site/img/logo" + "source": "https://github.com/jamstack/jamstack.org/tree/9e761f6b77ad11e8dc6d3a953e61e53f1d99a1e6/src/site/img/logo" }, { "title": "Jasmine", @@ -6043,7 +6059,7 @@ { "title": "Kubernetes", "hex": "326CE5", - "source": "https://github.com/kubernetes/kubernetes/tree/master/logo" + "source": "https://github.com/kubernetes/kubernetes/tree/cac53883f4714452f3084a22e4be20d042a9df33/logo" }, { "title": "Kubuntu", @@ -6527,7 +6543,7 @@ { "title": "Magisk", "hex": "00AF9C", - "source": "https://github.com/topjohnwu/Magisk/blob/master/app/src/main/res/drawable/ic_magisk.xml" + "source": "https://github.com/topjohnwu/Magisk/blob/23ad611566b557f26d268920692b25aa89fc0070/app/src/main/res/drawable/ic_magisk.xml" }, { "title": "Mail.Ru", @@ -7357,7 +7373,7 @@ { "title": "Neutralinojs", "hex": "F89901", - "source": "https://github.com/neutralinojs/neutralinojs" + "source": "https://github.com/neutralinojs/design-guide/blob/52a7232598ff22cddd810a3079e09a2cc2892609/logo/neutralinojs_logo_vector.svg" }, { "title": "New Balance", @@ -7481,7 +7497,7 @@ { "title": "NixOS", "hex": "5277C3", - "source": "https://github.com/NixOS/nixos-homepage/tree/master/logo" + "source": "https://github.com/NixOS/nixos-homepage/tree/58cfdb770aba28b73446a1b3ee65a5cec4f0d44f/logo" }, { "title": "Node-RED", @@ -7590,7 +7606,7 @@ { "title": "Nunjucks", "hex": "1C4913", - "source": "https://github.com/mozilla/nunjucks/blob/master/docs/img/favicon.png" + "source": "https://github.com/mozilla/nunjucks/blob/fd500902d7c88672470c87170796de52fc0f791a/docs/img/favicon.png" }, { "title": "Nutanix", @@ -7761,7 +7777,7 @@ { "title": "Open Containers Initiative", "hex": "262261", - "source": "https://github.com/opencontainers/artwork/tree/master/oci/icon" + "source": "https://github.com/opencontainers/artwork/tree/d8ccfe94471a0236b1d4a3f0f90862c4fe5486ce/oci/icon" }, { "title": "Open Source Initiative", @@ -7889,7 +7905,7 @@ { "title": "Openverse", "hex": "FFE033", - "source": "https://github.com/WordPress/openverse/blob/main/brand/icon.svg", + "source": "https://github.com/WordPress/openverse/blob/5db2545d6b73ec4aa5e908822683ee9d18af301d/brand/icon.svg", "guidelines": "https://www.figma.com/file/GIIQ4sDbaToCfFQyKMvzr8/Openverse-Design-Library?node-id=312%3A487" }, { @@ -7974,7 +7990,7 @@ { "title": "OSMC", "hex": "17394A", - "source": "https://github.com/osmc/osmc/tree/master/assets" + "source": "https://github.com/osmc/website/tree/e7d0d8002660c979ae5119e28d1c69c893ac9f76/content/themes/osmc/assets/img/logo" }, { "title": "osu!", @@ -8026,7 +8042,7 @@ { "title": "Packagist", "hex": "F28D1A", - "source": "https://github.com/composer/packagist/issues/1147", + "source": "https://github.com/composer/packagist/issues/1147#issuecomment-747951608", "license": { "type": "MIT" } @@ -8067,7 +8083,7 @@ { "title": "Palantir", "hex": "101113", - "source": "https://github.com/palantir/conjure/blob/master/docs/media/palantir-logo.svg" + "source": "https://github.com/palantir/conjure/blob/1b0d450dc52c4822b4c9d1da8c61ad7f78855fe5/docs/media/palantir-logo.svg" }, { "title": "Palo Alto Software", @@ -8699,6 +8715,11 @@ "hex": "F7B93E", "source": "https://github.com/prettier/prettier-logo/blob/06997b307e0608ebee2044dafa0b9429d6b5a103/images/prettier-icon-clean-centred.svg" }, + { + "title": "Prevention", + "hex": "44C1C5", + "source": "https://prevention.com" + }, { "title": "Prezi", "hex": "3181FF", @@ -8995,7 +9016,7 @@ { "title": "QMK", "hex": "333333", - "source": "https://github.com/qmk/qmk_firmware" + "source": "https://github.com/qmk/qmk.fm/blob/d6f7b646aa03f2941bb3977ba13a07ca351f20ae/assets/images/badge-dark.svg" }, { "title": "Qt", @@ -9296,7 +9317,7 @@ { "title": "Redux", "hex": "764ABC", - "source": "https://github.com/reactjs/redux/tree/master/logo" + "source": "https://github.com/reduxjs/redux/tree/8ad084251a5b3e4617157fc52795b6284e68bc1e/logo" }, { "title": "Redux-Saga", @@ -9394,7 +9415,7 @@ { "title": "Resurrection Remix OS", "hex": "000000", - "source": "https://github.com/ResurrectionRemix" + "source": "https://avatars.githubusercontent.com/u/4931972" }, { "title": "RetroArch", @@ -9645,7 +9666,7 @@ { "title": "Ruby Sinatra", "hex": "000000", - "source": "https://github.com/sinatra/resources/tree/master/logo" + "source": "https://github.com/sinatra/resources/tree/64c22f9b4bf2e52b5c0c875ba16671f295689efb/logo" }, { "title": "RubyGems", @@ -9938,7 +9959,7 @@ { "title": "Sensu", "hex": "89C967", - "source": "https://github.com/sensu/sensu-go/blob/master/dashboard/src/assets/logo/graphic/green.svg" + "source": "https://github.com/sensu/web/blob/c823738c11e576d6b2e5d4ca2d216dbd472c0b11/src/assets/logo/graphic/green.svg" }, { "title": "Sentry", @@ -9954,7 +9975,7 @@ { "title": "Sequelize", "hex": "52B0E7", - "source": "https://github.com/sequelize/sequelize/pull/12871" + "source": "https://github.com/sequelize/website/blob/e6a482fa58a839b15ace80e3c8901ed2887be45e/static/img/logo-simple.svg" }, { "title": "Server Fault", @@ -10468,7 +10489,7 @@ { "title": "Spinnaker", "hex": "139BB4", - "source": "https://github.com/spinnaker/spinnaker.github.io/tree/master/assets/images" + "source": "https://github.com/spinnaker/spinnaker.github.io/tree/0cdd37af7541293a810494a1bb4d7df9ef553d60/assets/images" }, { "title": "Spinrilla", @@ -10851,6 +10872,11 @@ "hex": "151F6D", "source": "https://www.supermicro.com/manuals/supermicro_logo_guidelines.pdf" }, + { + "title": "SurrealDB", + "hex": "FF00A0", + "source": "https://surrealdb.com/media" + }, { "title": "SurveyMonkey", "hex": "00BF6F", @@ -11642,7 +11668,7 @@ { "title": "uBlock Origin", "hex": "800000", - "source": "https://github.com/gorhill/uBlock/blob/master/src/img/ublock.svg" + "source": "https://github.com/gorhill/uBlock/blob/59aa235952a9289cfe72e4fb9f8a7d8f4c80be9a/src/img/ublock.svg" }, { "title": "Ubuntu", @@ -12160,7 +12186,7 @@ { "title": "wasmCloud", "hex": "00BC8E", - "source": "https://github.com/wasmCloud/branding/", + "source": "https://github.com/wasmCloud/branding/tree/0827503c63f55471a0c709e97d609f56d716be40", "guidelines": "https://github.com/wasmCloud/branding/" }, { @@ -12539,7 +12565,7 @@ { "title": "Xamarin", "hex": "3498DB", - "source": "https://github.com/dotnet/swag/tree/master/xamarin" + "source": "https://github.com/dotnet-foundation/swag/tree/0d21c59a604f348f509d772c12a99b888ed9f21f/xamarin" }, { "title": "XAML", @@ -12599,7 +12625,7 @@ { "title": "XO", "hex": "5ED9C7", - "source": "https://github.com/xojs/xo" + "source": "https://github.com/xojs/xo/tree/f9c7db99255d009b3c81535ced021c3f6ade57b4" }, { "title": "XRP", @@ -12798,7 +12824,7 @@ { "title": "ZeroMQ", "hex": "DF0000", - "source": "https://github.com/zeromq/zeromq.org/blob/master/static/safari-pinned-tab.svg" + "source": "https://github.com/zeromq/zeromq.org/blob/00f635314a0b0b801d411c7efef314dfd9625404/static/safari-pinned-tab.svg" }, { "title": "Zerply", diff --git a/icons/cairographics.svg b/icons/cairographics.svg new file mode 100644 index 000000000000..c68a827aad00 --- /dev/null +++ b/icons/cairographics.svg @@ -0,0 +1 @@ +Cairo Graphics \ No newline at end of file diff --git a/icons/codesandbox.svg b/icons/codesandbox.svg index 970408815fee..99d85c3697d4 100644 --- a/icons/codesandbox.svg +++ b/icons/codesandbox.svg @@ -1 +1 @@ -CodeSandbox \ No newline at end of file +CodeSandbox \ No newline at end of file diff --git a/icons/greenhouse.svg b/icons/greenhouse.svg new file mode 100644 index 000000000000..e859f5007813 --- /dev/null +++ b/icons/greenhouse.svg @@ -0,0 +1 @@ +Greenhouse \ No newline at end of file diff --git a/icons/honey.svg b/icons/honey.svg new file mode 100644 index 000000000000..4443fe348ad9 --- /dev/null +++ b/icons/honey.svg @@ -0,0 +1 @@ +Honey \ No newline at end of file diff --git a/icons/prevention.svg b/icons/prevention.svg new file mode 100644 index 000000000000..59e1b5c4503b --- /dev/null +++ b/icons/prevention.svg @@ -0,0 +1 @@ +Prevention \ No newline at end of file diff --git a/icons/surrealdb.svg b/icons/surrealdb.svg new file mode 100644 index 000000000000..f4d46063f401 --- /dev/null +++ b/icons/surrealdb.svg @@ -0,0 +1 @@ +SurrealDB \ No newline at end of file diff --git a/package.json b/package.json index 69b4d23f52c9..a27444bd3ea4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "simple-icons", - "version": "7.13.0", + "version": "7.14.0", "description": "SVG icons for popular brands https://simpleicons.org", "homepage": "https://simpleicons.org", "keywords": [ diff --git a/scripts/add-icon-data.js b/scripts/add-icon-data.js index 1f116b823dda..8093bc349b62 100644 --- a/scripts/add-icon-data.js +++ b/scripts/add-icon-data.js @@ -5,6 +5,7 @@ import getRelativeLuminance from 'get-relative-luminance'; import { URL_REGEX, collator, + getJsonSchemaData, getIconsDataString, getIconDataPath, writeIconsData, @@ -15,6 +16,7 @@ import { const hexPattern = /^#?[a-f0-9]{3,8}$/i; const iconsData = JSON.parse(await getIconsDataString()); +const jsonSchema = await getJsonSchemaData(); const titleValidator = (text) => { if (!text) return 'This field is required'; @@ -42,6 +44,18 @@ const hexTransformer = (text) => { return chalk.bgHex(`#${color}`).hex(luminance < 0.4 ? '#fff' : '#000')(text); }; +const aliasesTransformer = (text) => + text + .split(',') + .map((x) => chalk.cyan(x)) + .join(','); + +const aliasesChoices = Object.entries( + jsonSchema.definitions.brand.properties.aliases.properties, +) + .filter(([k]) => ['aka', 'old'].includes(k)) + .map(([k, v]) => ({ name: `${k}: ${v.description}`, value: k })); + const getIconDataFromAnswers = (answers) => ({ title: answers.title, hex: answers.hex, @@ -55,6 +69,21 @@ const getIconDataFromAnswers = (answers) => ({ }, } : {}), + ...(answers.hasAliases + ? { + aliases: aliasesChoices.reduce((previous, current) => { + const promptKey = `${current.value}AliasesList`; + if (answers[promptKey]) + return { + ...previous, + [current.value]: answers[promptKey] + .split(',') + .map((x) => x.trim()), + }; + return previous; + }, {}), + } + : {}), }); const dataPrompt = [ @@ -112,7 +141,29 @@ const dataPrompt = [ }, { type: 'confirm', - name: 'confirm', + name: 'hasAliases', + message: 'The icon has brand aliases?', + default: false, + }, + { + type: 'checkbox', + name: 'aliasesTypes', + message: 'What types of aliases do you want to add?', + choices: aliasesChoices, + when: ({ hasAliases }) => hasAliases, + }, + ...aliasesChoices.map((x) => ({ + type: 'input', + name: `${x.value}AliasesList`, + message: x.value, + suffix: ' (separate with commas)', + validate: (text) => Boolean(text), + transformer: aliasesTransformer, + when: (answers) => answers?.aliasesTypes?.includes(x.value), + })), + { + type: 'confirm', + name: 'confirmToAdd', message: (answers) => { const icon = getIconDataFromAnswers(answers); return [ @@ -127,7 +178,7 @@ const dataPrompt = [ const answers = await inquirer.prompt(dataPrompt); const icon = getIconDataFromAnswers(answers); -if (answers.confirm) { +if (answers.confirmToAdd) { iconsData.icons.push(icon); iconsData.icons.sort((a, b) => collator.compare(a.title, b.title)); await writeIconsData(iconsData); diff --git a/scripts/lint/jsonlint.js b/scripts/lint/jsonlint.js index 7e61515786d9..920d0bd4203d 100644 --- a/scripts/lint/jsonlint.js +++ b/scripts/lint/jsonlint.js @@ -7,27 +7,23 @@ import { promises as fs } from 'node:fs'; import path from 'node:path'; import { Validator } from 'jsonschema'; -import { getDirnameFromImportMeta, getIconsData } from '../utils.js'; +import { + getDirnameFromImportMeta, + getIconsData, + getJsonSchemaData, +} from '../utils.js'; +const icons = await getIconsData(); const __dirname = getDirnameFromImportMeta(import.meta.url); +const schema = await getJsonSchemaData(path.resolve(__dirname, '..', '..')); -const rootDir = path.resolve(__dirname, '..', '..'); -const schemaFile = path.resolve(rootDir, '.jsonschema.json'); +const validator = new Validator(); +const result = validator.validate({ icons }, schema); +if (result.errors.length > 0) { + result.errors.forEach((error) => { + console.error(error); + }); -(async () => { - const icons = await getIconsData(); - const schema = JSON.parse(await fs.readFile(schemaFile, 'utf8')); - - const validator = new Validator(); - const result = validator.validate({ icons }, schema); - if (result.errors.length > 0) { - result.errors.forEach((error) => { - console.error(error); - }); - - console.error( - `Found ${result.errors.length} error(s) in simple-icons.json`, - ); - process.exit(1); - } -})(); + console.error(`Found ${result.errors.length} error(s) in simple-icons.json`); + process.exit(1); +} diff --git a/scripts/utils.js b/scripts/utils.js index 8cf6cee36653..0d5252deecff 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -30,6 +30,16 @@ const TITLE_TO_SLUG_RANGE_REGEX = /[^a-z0-9]/g; export const URL_REGEX = /^https:\/\/[^\s]+$/; +/** + * Get the directory name where this file is located from `import.meta.url`, + * equivalent to the `__dirname` global variable in CommonJS. + * @param {String} importMetaUrl import.meta.url + */ +export const getDirnameFromImportMeta = (importMetaUrl) => + path.dirname(fileURLToPath(importMetaUrl)); + +const __dirname = getDirnameFromImportMeta(import.meta.url); + /** * Get the slug/filename for an icon. * @param {Object} icon The icon data as it appears in _data/simple-icons.json @@ -95,14 +105,26 @@ export const htmlFriendlyToTitle = (htmlFriendlyTitle) => (_, ref) => ({ quot: '"', amp: '&', lt: '<', gt: '>' }[ref]), ); +/** + * Get JSON schema data. + * @param {String|undefined} rootDir Path to the root directory of the project. + */ +export const getJsonSchemaData = async ( + rootDir = path.resolve(__dirname, '..'), +) => { + const __dirname = getDirnameFromImportMeta(import.meta.url); + const jsonSchemaPath = path.resolve(rootDir, '.jsonschema.json'); + const jsonSchemaString = await fs.readFile(jsonSchemaPath, 'utf8'); + return JSON.parse(jsonSchemaString); +}; + /** * Get path of _data/simpe-icons.json. * @param {String|undefined} rootDir Path to the root directory of the project. */ -export const getIconDataPath = (rootDir) => { - if (rootDir === undefined) { - rootDir = path.resolve(getDirnameFromImportMeta(import.meta.url), '..'); - } +export const getIconDataPath = ( + rootDir = path.resolve(getDirnameFromImportMeta(import.meta.url), '..'), +) => { return path.resolve(rootDir, '_data', 'simple-icons.json'); }; @@ -136,14 +158,6 @@ export const writeIconsData = async (iconsData, rootDir) => { ); }; -/** - * Get the directory name where this file is located from `import.meta.url`, - * equivalent to the `__dirname` global variable in CommonJS. - * @param {String} importMetaUrl import.meta.url - */ -export const getDirnameFromImportMeta = (importMetaUrl) => - path.dirname(fileURLToPath(importMetaUrl)); - /** * Replace Windows newline characters by Unix ones. * @param {String} text The text to replace diff --git a/slugs.md b/slugs.md index 3f0382603b96..fde7e448e09f 100644 --- a/slugs.md +++ b/slugs.md @@ -348,6 +348,7 @@ update the script at 'scripts/release/update-slugs-table.js'. | `Cachet` | `cachet` | | `CafePress` | `cafepress` | | `Caffeine` | `caffeine` | +| `Cairo Graphics` | `cairographics` | | `Cairo Metro` | `cairometro` | | `CakePHP` | `cakephp` | | `Campaign Monitor` | `campaignmonitor` | @@ -876,6 +877,7 @@ update the script at 'scripts/release/update-slugs-table.js'. | `Grav` | `grav` | | `Gravatar` | `gravatar` | | `Graylog` | `graylog` | +| `Greenhouse` | `greenhouse` | | `GreenSock` | `greensock` | | `Grid.ai` | `griddotai` | | `Gridsome` | `gridsome` | @@ -940,6 +942,7 @@ update the script at 'scripts/release/update-slugs-table.js'. | `Homebridge` | `homebridge` | | `homify` | `homify` | | `Honda` | `honda` | +| `Honey` | `honey` | | `Hootsuite` | `hootsuite` | | `Hoppscotch` | `hoppscotch` | | `Hotels.com` | `hotelsdotcom` | @@ -1610,6 +1613,7 @@ update the script at 'scripts/release/update-slugs-table.js'. | `PrestaShop` | `prestashop` | | `Presto` | `presto` | | `Prettier` | `prettier` | +| `Prevention` | `prevention` | | `Prezi` | `prezi` | | `Prime` | `prime` | | `Prime Video` | `primevideo` | @@ -1999,6 +2003,7 @@ update the script at 'scripts/release/update-slugs-table.js'. | `Supabase` | `supabase` | | `Super User` | `superuser` | | `Supermicro` | `supermicro` | +| `SurrealDB` | `surrealdb` | | `SurveyMonkey` | `surveymonkey` | | `SUSE` | `suse` | | `Suzuki` | `suzuki` |