@posthog/wizard 2.2.0 → 2.3.0
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.
- package/dist/src/lib/agent-runner.js +4 -4
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/constants.d.ts +1 -1
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js +11 -4
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -1
- package/dist/src/lib/health-checks/endpoints.d.ts +1 -0
- package/dist/src/lib/health-checks/endpoints.js +3 -1
- package/dist/src/lib/health-checks/endpoints.js.map +1 -1
- package/dist/src/lib/health-checks/index.d.ts +1 -1
- package/dist/src/lib/health-checks/index.js +2 -1
- package/dist/src/lib/health-checks/index.js.map +1 -1
- package/dist/src/lib/health-checks/readiness.js +12 -3
- package/dist/src/lib/health-checks/readiness.js.map +1 -1
- package/dist/src/lib/health-checks/types.d.ts +1 -0
- package/dist/src/lib/health-checks/types.js.map +1 -1
- package/dist/src/lib/version.d.ts +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/dist/src/lib/wizard-tools.d.ts +22 -0
- package/dist/src/lib/wizard-tools.js +71 -39
- package/dist/src/lib/wizard-tools.js.map +1 -1
- package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js +1 -0
- package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js.map +1 -1
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +50 -5
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -1
- package/dist/src/utils/__tests__/semver.test.js +45 -3
- package/dist/src/utils/__tests__/semver.test.js.map +1 -1
- package/dist/src/utils/semver.js +25 -0
- package/dist/src/utils/semver.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealthCheckScreen.js","sourceRoot":"","sources":["../../../../../../src/ui/tui/screens/health/HealthCheckScreen.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAMhE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,KAAK,EAA0B,EAAE,EAAE;IACrE,oBAAoB,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAC1B,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;IAE7C,gCAAgC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAE,CAAC,EACX,UAAU,EAAC,QAAQ,EACnB,cAAc,EAAC,QAAQ,YAEvB,KAAC,UAAU,IAAC,OAAO,EAAC,4BAA4B,GAAG,GAC/C,CACP,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,gEAAgE;IAChE,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,yDAAyD;IACzD,OAAO,CACL,MAAC,YAAY,IACX,WAAW,EAAC,KAAK,EACjB,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,8BAA8B,EACrD,KAAK,EAAE,EAAE,EACT,MAAM,EACJ,KAAC,iBAAiB,IAChB,OAAO,EAAC,kBAAkB,EAC1B,YAAY,EAAC,kBAAkB,EAC/B,WAAW,EAAC,YAAY,EACxB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EACtC,QAAQ,EAAE,GAAG,EAAE,CACb,KAAK,WAAW,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,GAEhE,aAGJ,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,CAAC,YAAY,GAAQ,EAC7C,KAAC,IAAI,IAAC,QAAQ,6BAAc,EAC5B,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,YAAE,KAAK,CAAC,YAAY,GAAQ,EACjD,KAAC,IAAI,IAAC,QAAQ,gCAAiB,IAC1B,GACH,EAEN,KAAC,iBAAiB,IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,UAAU,EAAE,YAAY,EACxB,WAAW,EAAE,KAAK,GAClB,IACE,EAEN,KAAC,IAAI,IAAC,QAAQ,oFAEP,IACM,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * HealthCheckScreen — Flow screen between Intro and Auth.\n *\n * Three states:\n * 1. Checking: spinner while health check runs\n * 2. Healthy: isComplete returns true, router auto-advances to Auth\n * 3. Blocking outage: shows affected services with Continue/Exit\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../../store.js';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '../../primitives/index.js';\nimport { Icons } from '../../styles.js';\nimport { ServiceHealthList } from '../../components/ServiceHealthList.js';\nimport { getBlockingServiceKeys } from '../../../../lib/health-checks/readiness.js';\nimport { wizardAbort } from '../../../../utils/wizard-abort.js';\n\ninterface HealthCheckScreenProps {\n store: WizardStore;\n}\n\nexport const HealthCheckScreen = ({ store }: HealthCheckScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const result = store.session.readinessResult;\n\n // Still checking — show spinner\n if (!result) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <LoadingBox message=\"Checking service status...\" />\n </Box>\n );\n }\n\n // Healthy or warnings — isComplete returns true, router skips past.\n // This branch only renders for a single frame before advancing.\n const blockingKeys = getBlockingServiceKeys(result.health);\n if (blockingKeys.length === 0) return null;\n\n // Blocking outage — show service list with Continue/Exit\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={`${Icons.warning} Ongoing service disruptions`}\n width={72}\n footer={\n <ConfirmationInput\n message=\"Continue anyway?\"\n confirmLabel=\"Continue [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => store.dismissOutage()}\n onCancel={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n />\n }\n >\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box marginBottom={1}>\n <Text>\n <Text color=\"red\">{Icons.squareFilled}</Text>\n <Text dimColor> Down </Text>\n <Text color=\"#DC9300\">{Icons.squareFilled}</Text>\n <Text dimColor> Degraded</Text>\n </Text>\n </Box>\n\n <ServiceHealthList\n health={result.health}\n filterKeys={blockingKeys}\n showHealthy={false}\n />\n </Box>\n\n <Text dimColor>\n The wizard may not work reliably while services are affected.\n </Text>\n </ModalOverlay>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"HealthCheckScreen.js","sourceRoot":"","sources":["../../../../../../src/ui/tui/screens/health/HealthCheckScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * HealthCheckScreen — Flow screen between Intro and Auth.\n *\n * Three states:\n * 1. Checking: spinner while health check runs\n * 2. Healthy: isComplete returns true, router auto-advances to Auth\n * 3. Blocking outage: shows affected services with Continue/Exit\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../../store.js';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '../../primitives/index.js';\nimport { Colors, Icons } from '../../styles.js';\nimport { ServiceHealthList } from '../../components/ServiceHealthList.js';\nimport { getBlockingServiceKeys } from '../../../../lib/health-checks/readiness.js';\nimport { ServiceHealthStatus } from '../../../../lib/health-checks/types.js';\nimport { wizardAbort } from '../../../../utils/wizard-abort.js';\nimport { fetchSkillMenu, downloadSkill } from '../../../../lib/wizard-tools.js';\n\ninterface HealthCheckScreenProps {\n store: WizardStore;\n}\n\nconst EXAMPLE_PROMPT =\n 'Integrate PostHog into this project using the skill files in .posthog/skills/. Read SKILL.md first, then follow the numbered workflow files in order.';\n\nconst SkillsDownloadedScreen = () => {\n useInput(() => {\n process.exit(0);\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text color=\"green\" bold>\n {Icons.check} Skills downloaded to .posthog/skills/\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n You can continue setup with another agent using this prompt:\n </Text>\n <Box marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">{EXAMPLE_PROMPT}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n\nexport const HealthCheckScreen = ({ store }: HealthCheckScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [downloaded, setDownloaded] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n const result = store.session.readinessResult;\n\n if (downloaded) {\n return <SkillsDownloadedScreen />;\n }\n\n // Still checking — show spinner\n if (!result) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <LoadingBox message=\"Checking service status...\" />\n </Box>\n );\n }\n\n // Healthy or warnings — isComplete returns true, router skips past.\n // This branch only renders for a single frame before advancing.\n const blockingKeys = getBlockingServiceKeys(result.health);\n if (blockingKeys.length === 0) return null;\n\n const isGithubReleasesDown = blockingKeys.includes('githubReleases');\n const canDownloadSkills =\n result.health.githubReleases.status === ServiceHealthStatus.Healthy;\n const integration = store.session.integration;\n\n const title = `Ongoing service disruptions`;\n\n const docsUrl = store.session.frameworkConfig?.metadata.docsUrl;\n const description = isGithubReleasesDown\n ? \"The Wizard can't download necessary skills from GitHub Releases right now.\"\n : 'The Wizard may not work reliably while services are affected.';\n\n const handleDownloadAndExit = async () => {\n if (downloading) return;\n setDownloading(true);\n const skillsBaseUrl =\n 'https://github.com/PostHog/context-mill/releases/latest/download';\n const menu = await fetchSkillMenu(skillsBaseUrl);\n if (menu) {\n const prefix = `integration-${integration}`;\n const skills = (menu.categories['integration'] ?? []).filter((s) =>\n s.id.startsWith(prefix),\n );\n for (const skill of skills) {\n downloadSkill(skill, store.session.installDir, '.posthog/skills');\n }\n }\n setDownloaded(true);\n };\n\n const handleCancel =\n canDownloadSkills && !isGithubReleasesDown\n ? () => void handleDownloadAndExit()\n : () => void wizardAbort({ message: 'Exited due to service outage.' });\n\n const cancelLabel =\n canDownloadSkills && !isGithubReleasesDown\n ? downloading\n ? 'Downloading...'\n : 'Download skills & Exit [Esc]'\n : 'Exit [Esc]';\n\n // Blocking outage — show service list with Continue/Exit\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={title}\n width={72}\n footer={\n isGithubReleasesDown ? (\n <ConfirmationInput\n message=\"\"\n confirmLabel=\"\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n onCancel={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n />\n ) : (\n <ConfirmationInput\n message=\"Continue anyway?\"\n confirmLabel=\"Continue [Enter]\"\n cancelLabel={cancelLabel}\n onConfirm={() => store.dismissOutage()}\n onCancel={handleCancel}\n />\n )\n }\n >\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box marginBottom={1}>\n <Text>\n <Text color=\"red\">{Icons.squareFilled}</Text>\n <Text dimColor> Down </Text>\n <Text color=\"#DC9300\">{Icons.squareFilled}</Text>\n <Text dimColor> Degraded</Text>\n </Text>\n </Box>\n\n <ServiceHealthList\n health={result.health}\n filterKeys={blockingKeys}\n showHealthy={false}\n />\n </Box>\n\n <Text dimColor>{description}</Text>\n\n {isGithubReleasesDown && docsUrl && (\n <Box marginTop={1}>\n <Text>\n Set up manually: <Text color=\"cyan\">{docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {canDownloadSkills && !isGithubReleasesDown && (\n <Box marginTop={1}>\n <Text>\n You can still download the PostHog integration skills and continue\n with another agent.\n </Text>\n </Box>\n )}\n </ModalOverlay>\n );\n};\n"]}
|
|
@@ -108,9 +108,51 @@ describe('createVersionBucket', () => {
|
|
|
108
108
|
it('handles versions with build metadata', () => {
|
|
109
109
|
expect(getVersionBucket('1.0.0+build.123')).toBe('1.x');
|
|
110
110
|
});
|
|
111
|
-
it('
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
it('returns "unknown" for whitespace-only string', () => {
|
|
112
|
+
expect(getVersionBucket(' ')).toBe('unknown');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('non-semver package.json version formats', () => {
|
|
116
|
+
const getVersionBucket = (0, semver_1.createVersionBucket)();
|
|
117
|
+
it('returns "unknown" and never throws', () => {
|
|
118
|
+
const cases = [
|
|
119
|
+
'https://github.com/user/repo/tarball/main',
|
|
120
|
+
'git+https://github.com/user/repo.git',
|
|
121
|
+
'user/repo',
|
|
122
|
+
'file:../my-lib',
|
|
123
|
+
'workspace:*',
|
|
124
|
+
'npm:@scope/pkg@^1.0.0',
|
|
125
|
+
'next',
|
|
126
|
+
'canary',
|
|
127
|
+
];
|
|
128
|
+
for (const v of cases) {
|
|
129
|
+
expect(getVersionBucket(v)).toBe('unknown');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('fulfillsVersionRange', () => {
|
|
135
|
+
const check = (version, acceptable = '>=15.0.0', canBeLatest = false) => (0, semver_1.fulfillsVersionRange)({
|
|
136
|
+
version,
|
|
137
|
+
acceptableVersions: acceptable,
|
|
138
|
+
canBeLatest,
|
|
139
|
+
});
|
|
140
|
+
describe('non-semver package.json version formats', () => {
|
|
141
|
+
it('rejects non-semver versions without throwing', () => {
|
|
142
|
+
const cases = [
|
|
143
|
+
'https://github.com/user/repo/tarball/main',
|
|
144
|
+
'git+https://github.com/user/repo.git',
|
|
145
|
+
'user/repo',
|
|
146
|
+
'file:../my-lib',
|
|
147
|
+
'workspace:*',
|
|
148
|
+
'npm:@scope/pkg@^1.0.0',
|
|
149
|
+
'',
|
|
150
|
+
'next',
|
|
151
|
+
'canary',
|
|
152
|
+
];
|
|
153
|
+
for (const v of cases) {
|
|
154
|
+
expect(check(v)).toBe(false);
|
|
155
|
+
}
|
|
114
156
|
});
|
|
115
157
|
});
|
|
116
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semver.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/semver.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createVersionBucket } from '../semver';\n\ndescribe('createVersionBucket', () => {\n describe('without minimum threshold', () => {\n const getVersionBucket = createVersionBucket();\n\n it('returns \"none\" for undefined version', () => {\n expect(getVersionBucket(undefined)).toBe('none');\n });\n\n it('returns \"none\" for empty string', () => {\n expect(getVersionBucket('')).toBe('none');\n });\n\n it('returns major version bucket for exact versions', () => {\n expect(getVersionBucket('1.0.0')).toBe('1.x');\n expect(getVersionBucket('2.5.3')).toBe('2.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns major version bucket for semver ranges', () => {\n expect(getVersionBucket('^1.0.0')).toBe('1.x');\n expect(getVersionBucket('~2.5.0')).toBe('2.x');\n expect(getVersionBucket('>=15.0.0')).toBe('15.x');\n });\n\n it('returns \"unknown\" for invalid semver (caught by try/catch)', () => {\n expect(getVersionBucket('not-a-version')).toBe('unknown');\n expect(getVersionBucket('abc')).toBe('unknown');\n });\n\n it('handles version 0.x correctly', () => {\n expect(getVersionBucket('0.1.0')).toBe('0.x');\n expect(getVersionBucket('0.0.1')).toBe('0.x');\n });\n });\n\n describe('with minimum threshold', () => {\n describe('threshold of 11 (Next.js style)', () => {\n const getVersionBucket = createVersionBucket(11);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n expect(getVersionBucket('12.5.3')).toBe('12.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('10.0.0')).toBe('<11.0.0');\n expect(getVersionBucket('9.5.0')).toBe('<11.0.0');\n expect(getVersionBucket('1.0.0')).toBe('<11.0.0');\n });\n\n it('handles semver ranges correctly', () => {\n expect(getVersionBucket('^15.0.0')).toBe('15.x');\n expect(getVersionBucket('^10.0.0')).toBe('<11.0.0');\n });\n });\n\n describe('threshold of 6 (React Router style)', () => {\n const getVersionBucket = createVersionBucket(6);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('6.0.0')).toBe('6.x');\n expect(getVersionBucket('7.1.0')).toBe('7.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('5.3.0')).toBe('<6.0.0');\n expect(getVersionBucket('4.0.0')).toBe('<6.0.0');\n });\n });\n\n describe('threshold of 3 (Django style)', () => {\n const getVersionBucket = createVersionBucket(3);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n expect(getVersionBucket('4.2.1')).toBe('4.x');\n expect(getVersionBucket('5.0.0')).toBe('5.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('2.2.0')).toBe('<3.0.0');\n expect(getVersionBucket('1.11.0')).toBe('<3.0.0');\n });\n });\n\n describe('threshold of 2 (Flask style)', () => {\n const getVersionBucket = createVersionBucket(2);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('2.0.0')).toBe('2.x');\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('1.1.0')).toBe('<2.0.0');\n expect(getVersionBucket('0.12.0')).toBe('<2.0.0');\n });\n });\n\n describe('threshold of 9 (Laravel style)', () => {\n const getVersionBucket = createVersionBucket(9);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('9.0.0')).toBe('9.x');\n expect(getVersionBucket('10.0.0')).toBe('10.x');\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('8.0.0')).toBe('<9.0.0');\n expect(getVersionBucket('7.0.0')).toBe('<9.0.0');\n });\n });\n });\n\n describe('edge cases', () => {\n const getVersionBucket = createVersionBucket();\n\n it('handles version with only major.minor', () => {\n expect(getVersionBucket('1.0')).toBe('1.x');\n expect(getVersionBucket('15.3')).toBe('15.x');\n });\n\n it('handles prerelease versions', () => {\n expect(getVersionBucket('1.0.0-beta.1')).toBe('1.x');\n expect(getVersionBucket('2.0.0-rc.1')).toBe('2.x');\n expect(getVersionBucket('15.0.0-canary.1')).toBe('15.x');\n });\n\n it('handles versions with build metadata', () => {\n expect(getVersionBucket('1.0.0+build.123')).toBe('1.x');\n });\n\n it('handles whitespace-only string (semver treats as version 0)', () => {\n // Note: semver's minVersion treats whitespace as a valid range matching version 0\n expect(getVersionBucket(' ')).toBe('0.x');\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"semver.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/semver.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createVersionBucket, fulfillsVersionRange } from '../semver';\n\ndescribe('createVersionBucket', () => {\n describe('without minimum threshold', () => {\n const getVersionBucket = createVersionBucket();\n\n it('returns \"none\" for undefined version', () => {\n expect(getVersionBucket(undefined)).toBe('none');\n });\n\n it('returns \"none\" for empty string', () => {\n expect(getVersionBucket('')).toBe('none');\n });\n\n it('returns major version bucket for exact versions', () => {\n expect(getVersionBucket('1.0.0')).toBe('1.x');\n expect(getVersionBucket('2.5.3')).toBe('2.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns major version bucket for semver ranges', () => {\n expect(getVersionBucket('^1.0.0')).toBe('1.x');\n expect(getVersionBucket('~2.5.0')).toBe('2.x');\n expect(getVersionBucket('>=15.0.0')).toBe('15.x');\n });\n\n it('returns \"unknown\" for invalid semver (caught by try/catch)', () => {\n expect(getVersionBucket('not-a-version')).toBe('unknown');\n expect(getVersionBucket('abc')).toBe('unknown');\n });\n\n it('handles version 0.x correctly', () => {\n expect(getVersionBucket('0.1.0')).toBe('0.x');\n expect(getVersionBucket('0.0.1')).toBe('0.x');\n });\n });\n\n describe('with minimum threshold', () => {\n describe('threshold of 11 (Next.js style)', () => {\n const getVersionBucket = createVersionBucket(11);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n expect(getVersionBucket('12.5.3')).toBe('12.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('10.0.0')).toBe('<11.0.0');\n expect(getVersionBucket('9.5.0')).toBe('<11.0.0');\n expect(getVersionBucket('1.0.0')).toBe('<11.0.0');\n });\n\n it('handles semver ranges correctly', () => {\n expect(getVersionBucket('^15.0.0')).toBe('15.x');\n expect(getVersionBucket('^10.0.0')).toBe('<11.0.0');\n });\n });\n\n describe('threshold of 6 (React Router style)', () => {\n const getVersionBucket = createVersionBucket(6);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('6.0.0')).toBe('6.x');\n expect(getVersionBucket('7.1.0')).toBe('7.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('5.3.0')).toBe('<6.0.0');\n expect(getVersionBucket('4.0.0')).toBe('<6.0.0');\n });\n });\n\n describe('threshold of 3 (Django style)', () => {\n const getVersionBucket = createVersionBucket(3);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n expect(getVersionBucket('4.2.1')).toBe('4.x');\n expect(getVersionBucket('5.0.0')).toBe('5.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('2.2.0')).toBe('<3.0.0');\n expect(getVersionBucket('1.11.0')).toBe('<3.0.0');\n });\n });\n\n describe('threshold of 2 (Flask style)', () => {\n const getVersionBucket = createVersionBucket(2);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('2.0.0')).toBe('2.x');\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('1.1.0')).toBe('<2.0.0');\n expect(getVersionBucket('0.12.0')).toBe('<2.0.0');\n });\n });\n\n describe('threshold of 9 (Laravel style)', () => {\n const getVersionBucket = createVersionBucket(9);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('9.0.0')).toBe('9.x');\n expect(getVersionBucket('10.0.0')).toBe('10.x');\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('8.0.0')).toBe('<9.0.0');\n expect(getVersionBucket('7.0.0')).toBe('<9.0.0');\n });\n });\n });\n\n describe('edge cases', () => {\n const getVersionBucket = createVersionBucket();\n\n it('handles version with only major.minor', () => {\n expect(getVersionBucket('1.0')).toBe('1.x');\n expect(getVersionBucket('15.3')).toBe('15.x');\n });\n\n it('handles prerelease versions', () => {\n expect(getVersionBucket('1.0.0-beta.1')).toBe('1.x');\n expect(getVersionBucket('2.0.0-rc.1')).toBe('2.x');\n expect(getVersionBucket('15.0.0-canary.1')).toBe('15.x');\n });\n\n it('handles versions with build metadata', () => {\n expect(getVersionBucket('1.0.0+build.123')).toBe('1.x');\n });\n\n it('returns \"unknown\" for whitespace-only string', () => {\n expect(getVersionBucket(' ')).toBe('unknown');\n });\n });\n\n describe('non-semver package.json version formats', () => {\n const getVersionBucket = createVersionBucket();\n\n it('returns \"unknown\" and never throws', () => {\n const cases = [\n 'https://github.com/user/repo/tarball/main',\n 'git+https://github.com/user/repo.git',\n 'user/repo',\n 'file:../my-lib',\n 'workspace:*',\n 'npm:@scope/pkg@^1.0.0',\n 'next',\n 'canary',\n ];\n for (const v of cases) {\n expect(getVersionBucket(v)).toBe('unknown');\n }\n });\n });\n});\n\ndescribe('fulfillsVersionRange', () => {\n const check = (\n version: string,\n acceptable = '>=15.0.0',\n canBeLatest = false,\n ) =>\n fulfillsVersionRange({\n version,\n acceptableVersions: acceptable,\n canBeLatest,\n });\n\n describe('non-semver package.json version formats', () => {\n it('rejects non-semver versions without throwing', () => {\n const cases = [\n 'https://github.com/user/repo/tarball/main',\n 'git+https://github.com/user/repo.git',\n 'user/repo',\n 'file:../my-lib',\n 'workspace:*',\n 'npm:@scope/pkg@^1.0.0',\n '',\n 'next',\n 'canary',\n ];\n for (const v of cases) {\n expect(check(v)).toBe(false);\n }\n });\n });\n});\n"]}
|
package/dist/src/utils/semver.js
CHANGED
|
@@ -3,10 +3,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.fulfillsVersionRange = fulfillsVersionRange;
|
|
4
4
|
exports.createVersionBucket = createVersionBucket;
|
|
5
5
|
const semver_1 = require("semver");
|
|
6
|
+
/**
|
|
7
|
+
* Version strings from package.json that are not semver ranges.
|
|
8
|
+
* URLs, git refs, dist-tags, local paths, workspace protocol, npm aliases, etc.
|
|
9
|
+
* These should be rejected early — we can't determine a clear version from them.
|
|
10
|
+
*/
|
|
11
|
+
function isNonSemverVersion(version) {
|
|
12
|
+
const v = version.trim();
|
|
13
|
+
return (v === '' ||
|
|
14
|
+
v.startsWith('http://') ||
|
|
15
|
+
v.startsWith('https://') ||
|
|
16
|
+
v.startsWith('git+') ||
|
|
17
|
+
v.startsWith('git://') ||
|
|
18
|
+
v.startsWith('file:') ||
|
|
19
|
+
v.startsWith('npm:') ||
|
|
20
|
+
v.startsWith('workspace:') ||
|
|
21
|
+
v.startsWith('/') ||
|
|
22
|
+
v.includes('/') // user/repo shorthand
|
|
23
|
+
);
|
|
24
|
+
}
|
|
6
25
|
function fulfillsVersionRange({ version, acceptableVersions, canBeLatest, }) {
|
|
7
26
|
if (version === 'latest') {
|
|
8
27
|
return canBeLatest;
|
|
9
28
|
}
|
|
29
|
+
if (isNonSemverVersion(version)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
10
32
|
let cleanedUserVersion, isRange;
|
|
11
33
|
if ((0, semver_1.valid)(version)) {
|
|
12
34
|
cleanedUserVersion = (0, semver_1.valid)(version);
|
|
@@ -43,6 +65,9 @@ function createVersionBucket(minMajorVersion) {
|
|
|
43
65
|
if (!version) {
|
|
44
66
|
return 'none';
|
|
45
67
|
}
|
|
68
|
+
if (isNonSemverVersion(version)) {
|
|
69
|
+
return 'unknown';
|
|
70
|
+
}
|
|
46
71
|
try {
|
|
47
72
|
const minVer = (0, semver_1.minVersion)(version);
|
|
48
73
|
if (!minVer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../../src/utils/semver.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../../src/utils/semver.ts"],"names":[],"mappings":";;AA8BA,oDAkCC;AAiBD,kDAwBC;AAzGD,mCAOgB;AAEhB;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,OAAO,CACL,CAAC,KAAK,EAAE;QACR,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;QACvB,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QACxB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;QAC1B,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QACjB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,sBAAsB;KACvC,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,kBAAkB,EAClB,WAAW,GAKZ;IACC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,kBAAkB,EAAE,OAAO,CAAC;IAEhC,IAAI,IAAA,cAAK,EAAC,OAAO,CAAC,EAAE,CAAC;QACnB,kBAAkB,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;QACpC,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,IAAI,IAAA,mBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,kBAAkB,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC;QACzC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,OAAO;IACL,yGAAyG;IACzG,CAAC,CAAC,kBAAkB;QACpB,CAAC,OAAO;YACN,CAAC,CAAC,IAAA,eAAM,EAAC,kBAAkB,EAAE,kBAAkB,CAAC;YAChD,CAAC,CAAC,IAAA,kBAAS,EAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,mBAAmB,CAAC,eAAwB;IAC1D,OAAO,CAAC,OAA2B,EAAU,EAAE;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,CAAC;YACnC,IAAI,eAAe,KAAK,SAAS,IAAI,YAAY,GAAG,eAAe,EAAE,CAAC;gBACpE,OAAO,IAAI,eAAe,MAAM,CAAC;YACnC,CAAC;YACD,OAAO,GAAG,YAAY,IAAI,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import {\n major,\n minVersion,\n satisfies,\n subset,\n valid,\n validRange,\n} from 'semver';\n\n/**\n * Version strings from package.json that are not semver ranges.\n * URLs, git refs, dist-tags, local paths, workspace protocol, npm aliases, etc.\n * These should be rejected early — we can't determine a clear version from them.\n */\nfunction isNonSemverVersion(version: string): boolean {\n const v = version.trim();\n return (\n v === '' ||\n v.startsWith('http://') ||\n v.startsWith('https://') ||\n v.startsWith('git+') ||\n v.startsWith('git://') ||\n v.startsWith('file:') ||\n v.startsWith('npm:') ||\n v.startsWith('workspace:') ||\n v.startsWith('/') ||\n v.includes('/') // user/repo shorthand\n );\n}\n\nexport function fulfillsVersionRange({\n version,\n acceptableVersions,\n canBeLatest,\n}: {\n version: string;\n acceptableVersions: string;\n canBeLatest: boolean;\n}): boolean {\n if (version === 'latest') {\n return canBeLatest;\n }\n\n if (isNonSemverVersion(version)) {\n return false;\n }\n\n let cleanedUserVersion, isRange;\n\n if (valid(version)) {\n cleanedUserVersion = valid(version);\n isRange = false;\n } else if (validRange(version)) {\n cleanedUserVersion = validRange(version);\n isRange = true;\n }\n\n return (\n // If the given version is a bogus format, this will still be undefined and we'll automatically reject it\n !!cleanedUserVersion &&\n (isRange\n ? subset(cleanedUserVersion, acceptableVersions)\n : satisfies(cleanedUserVersion, acceptableVersions))\n );\n}\n\n/**\n * Creates a version bucket function for analytics.\n * Converts versions like \"1.2.3\" to \"1.x\" for grouping in analytics.\n *\n * @param minMajorVersion - Optional minimum major version threshold.\n * Versions below this will be bucketed as \"<{min}.0.0\"\n *\n * @example\n * const getVersionBucket = createVersionBucket(); // no minimum\n * getVersionBucket(\"1.2.3\") // \"1.x\"\n *\n * const getVersionBucket = createVersionBucket(11);\n * getVersionBucket(\"15.3.0\") // \"15.x\"\n * getVersionBucket(\"10.0.0\") // \"<11.0.0\"\n */\nexport function createVersionBucket(minMajorVersion?: number) {\n return (version: string | undefined): string => {\n if (!version) {\n return 'none';\n }\n\n if (isNonSemverVersion(version)) {\n return 'unknown';\n }\n\n try {\n const minVer = minVersion(version);\n if (!minVer) {\n return 'invalid';\n }\n const majorVersion = major(minVer);\n if (minMajorVersion !== undefined && majorVersion < minMajorVersion) {\n return `<${minMajorVersion}.0.0`;\n }\n return `${majorVersion}.x`;\n } catch {\n return 'unknown';\n }\n };\n}\n"]}
|
package/package.json
CHANGED