chore: Install and use uuidv4 instead of a homegrown uuid method (#34364)

This commit is contained in:
Phil Haack
2025-06-30 13:04:52 -07:00
committed by GitHub
parent 7b6e269b85
commit 0c31c235b9
7 changed files with 199 additions and 43 deletions

View File

@@ -1,11 +0,0 @@
export function generateUUID(): string {
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID()
}
// Fallback to a simple random string
return 'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, function (c) {
const r = (Math.random() * 16) | 0
const v = c === 'x' ? r : (r & 0x3) | 0x8
return v.toString(16)
})
}

View File

@@ -5,7 +5,7 @@ import api, { CountedPaginatedResponse } from 'lib/api'
import { exportsLogic } from 'lib/components/ExportButton/exportsLogic'
import { PaginationManual } from 'lib/lemon-ui/PaginationControl'
import { deleteWithUndo } from 'lib/utils/deleteWithUndo'
import { generateUUID } from 'lib/utils/generateUUID'
import { v4 as uuidv4 } from 'uuid'
import { permanentlyMount } from 'lib/utils/kea-logic-builders'
import { COHORT_EVENT_TYPES_WITH_EXPLICIT_DATETIME } from 'scenes/cohorts/CohortFilters/constants'
import { BehavioralFilterKey } from 'scenes/cohorts/CohortFilters/types'
@@ -99,7 +99,7 @@ function processCohortCriteria(criteria: AnyCohortCriteriaType): AnyCohortCriter
}
if (processedCriteria.sort_key == null) {
processedCriteria.sort_key = generateUUID()
processedCriteria.sort_key = uuidv4()
}
return processedCriteria

View File

@@ -2,7 +2,7 @@ import { router } from 'kea-router'
import { expectLogic, partial } from 'kea-test-utils'
import { api } from 'lib/api.mock'
import { TaxonomicFilterGroupType } from 'lib/components/TaxonomicFilter/types'
import { generateUUID } from 'lib/utils/generateUUID'
import { v4 as uuidv4 } from 'uuid'
import { cohortEditLogic, CohortLogicProps } from 'scenes/cohorts/cohortEditLogic'
import { CRITERIA_VALIDATIONS, NEW_CRITERIA, ROWS } from 'scenes/cohorts/CohortFilters/constants'
import { BehavioralFilterKey } from 'scenes/cohorts/CohortFilters/types'
@@ -23,8 +23,8 @@ import {
TimeUnitType,
} from '~/types'
jest.mock('lib/utils/generateUUID', () => ({
generateUUID: jest.fn().mockReturnValue('mocked-uuid'), // This mocks the generateUUID function
jest.mock('uuid', () => ({
v4: jest.fn().mockReturnValue('mocked-uuid'),
}))
describe('cohortEditLogic', () => {
@@ -621,7 +621,7 @@ describe('cohortEditLogic', () => {
{
...(mockCohort.filters.properties.values[0] as CohortCriteriaGroupFilter).values[0],
explicit_datetime: '-30d',
sort_key: generateUUID(),
sort_key: uuidv4(),
},
],
}) // Backwards compatible processing adds explicit_datetime
@@ -675,7 +675,7 @@ describe('cohortEditLogic', () => {
mockCohort.filters.properties.values[0] as CohortCriteriaGroupFilter
).values[0],
explicit_datetime: '-30d',
sort_key: generateUUID(),
sort_key: uuidv4(),
},
],
}), // Backwards compatible processing adds explicit_datetime
@@ -755,7 +755,7 @@ describe('cohortEditLogic', () => {
(mockCohort.filters.properties.values[0] as CohortCriteriaGroupFilter)
.values[0]
),
{ ...NEW_CRITERIA, sort_key: generateUUID() },
{ ...NEW_CRITERIA, sort_key: uuidv4() },
],
}),
],

View File

@@ -7,7 +7,7 @@ import { openSaveToModal } from 'lib/components/FileSystem/SaveTo/saveToLogic'
import { ENTITY_MATCH_TYPE } from 'lib/constants'
import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast'
import { eventUsageLogic } from 'lib/utils/eventUsageLogic'
import { generateUUID } from 'lib/utils/generateUUID'
import { v4 as uuidv4 } from 'uuid'
import { NEW_COHORT, NEW_CRITERIA, NEW_CRITERIA_GROUP } from 'scenes/cohorts/CohortFilters/constants'
import {
applyAllCriteriaGroup,
@@ -101,7 +101,7 @@ export const cohortEditLogic = kea<cohortEditLogicType>([
...criteriaList.slice(0, criteriaIndex),
{
...criteriaList[criteriaIndex],
sort_key: generateUUID(),
sort_key: uuidv4(),
},
...criteriaList.slice(criteriaIndex),
],
@@ -118,7 +118,7 @@ export const cohortEditLogic = kea<cohortEditLogicType>([
if (groupIndex !== undefined) {
return applyAllNestedCriteria(
state,
(criteriaList) => [...criteriaList, { ...NEW_CRITERIA, sort_key: generateUUID() }],
(criteriaList) => [...criteriaList, { ...NEW_CRITERIA, sort_key: uuidv4() }],
groupIndex
)
}

View File

@@ -17,7 +17,7 @@ import api from 'lib/api'
import { isEmptyProperty } from 'lib/components/PropertyFilters/utils'
import { TaxonomicFilterGroupType, TaxonomicFilterProps } from 'lib/components/TaxonomicFilter/types'
import { objectsEqual, range } from 'lib/utils'
import { generateUUID } from 'lib/utils/generateUUID'
import { v4 as uuidv4 } from 'uuid'
import { projectLogic } from 'scenes/projectLogic'
import { groupsModel } from '~/models/groupsModel'
@@ -57,7 +57,7 @@ function ensureSortKeys(filters: FeatureFlagFilters): FeatureFlagFilters {
...filters,
groups: filters.groups.map((group: FeatureFlagGroupType) => ({
...group,
sort_key: group.sort_key ?? generateUUID(),
sort_key: group.sort_key ?? uuidv4(),
})),
}
}
@@ -108,7 +108,7 @@ export const featureFlagReleaseConditionsLogic = kea<featureFlagReleaseCondition
}
return {
...group,
sort_key: generateUUID(),
sort_key: uuidv4(),
}
})
@@ -130,7 +130,7 @@ export const featureFlagReleaseConditionsLogic = kea<featureFlagReleaseCondition
properties: [],
rollout_percentage: originalRolloutPercentage,
variant: null,
sort_key: generateUUID(),
sort_key: uuidv4(),
},
],
}
@@ -141,7 +141,7 @@ export const featureFlagReleaseConditionsLogic = kea<featureFlagReleaseCondition
}
const groups = [
...(state?.groups || []),
{ properties: [], rollout_percentage: undefined, variant: null, sort_key: generateUUID() },
{ properties: [], rollout_percentage: undefined, variant: null, sort_key: uuidv4() },
]
return { ...state, groups }
},
@@ -180,7 +180,7 @@ export const featureFlagReleaseConditionsLogic = kea<featureFlagReleaseCondition
const groups = state.groups.concat([
{
...state.groups[index],
sort_key: generateUUID(),
sort_key: uuidv4(),
},
])
return { ...state, groups }

View File

@@ -40,11 +40,13 @@
"concurrently": "^5.3.0",
"husky": "^7.0.4",
"lint-staged": "~15.4.3",
"turbo": "^2.4.2"
"turbo": "^2.4.2",
"uuid": "^10.0.0"
},
"devDependencies": {
"@parcel/packager-ts": "2.13.3",
"@parcel/transformer-typescript-types": "2.13.3",
"@types/uuid": "^10.0.0",
"oxlint": "^1.1.0",
"prettier": "^2.8.8",
"stylelint": "^15.11.0",

193
pnpm-lock.yaml generated
View File

@@ -45,6 +45,9 @@ importers:
turbo:
specifier: ^2.4.2
version: 2.4.2
uuid:
specifier: ^10.0.0
version: 10.0.0
optionalDependencies:
fsevents:
specifier: ^2.3.2
@@ -56,6 +59,9 @@ importers:
'@parcel/transformer-typescript-types':
specifier: 2.13.3
version: 2.13.3(@parcel/core@2.13.3)(typescript@5.2.2)
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
oxlint:
specifier: ^1.1.0
version: 1.3.0
@@ -70,7 +76,7 @@ importers:
version: 4.3.0(stylelint@15.11.0(typescript@5.2.2))
stylelint-config-standard-scss:
specifier: ^11.1.0
version: 11.1.0(postcss@8.5.6)(stylelint@15.11.0(typescript@5.2.2))
version: 11.1.0(postcss@8.4.31)(stylelint@15.11.0(typescript@5.2.2))
stylelint-order:
specifier: ^6.0.3
version: 6.0.3(stylelint@15.11.0(typescript@5.2.2))
@@ -167,7 +173,7 @@ importers:
version: 3.12.1
jest:
specifier: ^29.7.0
version: 29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.10.14(@swc/helpers@0.5.15))(@types/node@18.18.4)(typescript@5.2.2))
version: 29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@18.18.4)(typescript@5.2.2))
parcel:
specifier: ^2.13.3
version: 2.13.3(@swc/helpers@0.5.15)(cssnano@7.0.6(postcss@8.5.6))(postcss@8.5.6)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.19.1)(typescript@5.2.2)
@@ -1181,7 +1187,7 @@ importers:
version: 4.3.0(stylelint@15.11.0(typescript@5.2.2))
stylelint-config-standard-scss:
specifier: ^11.1.0
version: 11.1.0(postcss@8.4.31)(stylelint@15.11.0(typescript@5.2.2))
version: 11.1.0(postcss@8.5.6)(stylelint@15.11.0(typescript@5.2.2))
stylelint-order:
specifier: ^6.0.3
version: 6.0.3(stylelint@15.11.0(typescript@5.2.2))
@@ -1896,7 +1902,7 @@ importers:
version: 8.57.0
jest:
specifier: '*'
version: 29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.10.14(@swc/helpers@0.5.15))(@types/node@18.18.4)(typescript@5.2.2))
version: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
kea:
specifier: '*'
version: 3.1.5(react@18.2.0)
@@ -1950,7 +1956,7 @@ importers:
version: 3.1.3
jest:
specifier: '*'
version: 29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.10.14(@swc/helpers@0.5.15))(@types/node@18.18.4)(typescript@5.2.2))
version: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
kea:
specifier: '*'
version: 3.1.5(react@18.2.0)
@@ -9643,9 +9649,6 @@ packages:
dayjs@1.11.11:
resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==}
dayjs@1.11.13:
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -19803,6 +19806,41 @@ snapshots:
- supports-color
- ts-node
'@jest/core@29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))':
dependencies:
'@jest/console': 29.7.0
'@jest/reporters': 29.7.0
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@types/node': 18.18.4
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.8.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
jest-config: 29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
jest-resolve: 29.7.0
jest-resolve-dependencies: 29.7.0
jest-runner: 29.7.0
jest-runtime: 29.7.0
jest-snapshot: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
jest-watcher: 29.7.0
micromatch: 4.0.8
pretty-format: 29.7.0
slash: 3.0.0
strip-ansi: 6.0.1
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
- ts-node
'@jest/create-cache-key-function@29.7.0':
dependencies:
'@jest/types': 29.6.3
@@ -25213,7 +25251,7 @@ snapshots:
'@rc-component/trigger': 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
classnames: 2.5.1
copy-to-clipboard: 3.3.3
dayjs: 1.11.13
dayjs: 1.11.11(patch_hash=lbfir4woetqmvzqg7l4q5mjtfq)
rc-cascader: 3.34.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-checkbox: 3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-collapse: 3.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -25229,7 +25267,7 @@ snapshots:
rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-notification: 5.6.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-pagination: 5.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-picker: 4.11.3(date-fns@2.29.3)(dayjs@1.11.13)(luxon@3.5.0)(moment@2.29.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-picker: 4.11.3(date-fns@2.29.3)(dayjs@1.11.11(patch_hash=lbfir4woetqmvzqg7l4q5mjtfq))(luxon@3.5.0)(moment@2.29.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-progress: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-rate: 2.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -26536,6 +26574,21 @@ snapshots:
- supports-color
- ts-node
create-jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)):
dependencies:
'@jest/types': 29.6.3
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
- supports-color
- ts-node
create-require@1.1.1: {}
crelt@1.0.5: {}
@@ -27109,8 +27162,6 @@ snapshots:
dayjs@1.11.11(patch_hash=lbfir4woetqmvzqg7l4q5mjtfq): {}
dayjs@1.11.13: {}
debounce@1.2.1: {}
debug@2.6.9:
@@ -29642,6 +29693,25 @@ snapshots:
- supports-color
- ts-node
jest-cli@29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)):
dependencies:
'@jest/core': 29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
create-jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
exit: 0.1.2
import-local: 3.1.0
jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.1
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
- supports-color
- ts-node
jest-config@29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.10.14(@swc/helpers@0.5.15))(@types/node@18.18.4)(typescript@5.2.2)):
dependencies:
'@babel/core': 7.26.0
@@ -29704,6 +29774,68 @@ snapshots:
- babel-plugin-macros
- supports-color
jest-config@29.7.0(@types/node@18.18.4)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)):
dependencies:
'@babel/core': 7.26.0
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
babel-jest: 29.7.0(@babel/core@7.26.0)
chalk: 4.1.2
ci-info: 3.8.0
deepmerge: 4.3.1
glob: 7.2.3
graceful-fs: 4.2.11
jest-circus: 29.7.0
jest-environment-node: 29.7.0
jest-get-type: 29.6.3
jest-regex-util: 29.6.3
jest-resolve: 29.7.0
jest-runner: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
micromatch: 4.0.8
parse-json: 5.2.0
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
optionalDependencies:
'@types/node': 18.18.4
ts-node: 10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
jest-config@29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)):
dependencies:
'@babel/core': 7.26.0
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
babel-jest: 29.7.0(@babel/core@7.26.0)
chalk: 4.1.2
ci-info: 3.8.0
deepmerge: 4.3.1
glob: 7.2.3
graceful-fs: 4.2.11
jest-circus: 29.7.0
jest-environment-node: 29.7.0
jest-get-type: 29.6.3
jest-regex-util: 29.6.3
jest-resolve: 29.7.0
jest-runner: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
micromatch: 4.0.8
parse-json: 5.2.0
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
optionalDependencies:
'@types/node': 22.15.17
ts-node: 10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
@@ -30031,6 +30163,18 @@ snapshots:
- supports-color
- ts-node
jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)):
dependencies:
'@jest/core': 29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
'@jest/types': 29.6.3
import-local: 3.1.0
jest-cli: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2))
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
- supports-color
- ts-node
jiti@2.4.2: {}
jmespath@0.16.0: {}
@@ -33238,7 +33382,7 @@ snapshots:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rc-picker@4.11.3(date-fns@2.29.3)(dayjs@1.11.13)(luxon@3.5.0)(moment@2.29.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
rc-picker@4.11.3(date-fns@2.29.3)(dayjs@1.11.11(patch_hash=lbfir4woetqmvzqg7l4q5mjtfq))(luxon@3.5.0)(moment@2.29.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
'@babel/runtime': 7.27.6
'@rc-component/trigger': 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -33250,7 +33394,7 @@ snapshots:
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
date-fns: 2.29.3
dayjs: 1.11.13
dayjs: 1.11.11(patch_hash=lbfir4woetqmvzqg7l4q5mjtfq)
luxon: 3.5.0
moment: 2.29.4
@@ -35265,6 +35409,27 @@ snapshots:
optionalDependencies:
'@swc/core': 1.11.4(@swc/helpers@0.5.15)
ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.3
'@types/node': 22.15.17
acorn: 8.10.0
acorn-walk: 8.2.0
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
typescript: 5.2.2
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
'@swc/core': 1.11.4(@swc/helpers@0.5.15)
optional: true
ts-pattern@4.3.0: {}
ts-toolbelt@9.6.0: {}