Skip to content

Commit 6d5a11e

Browse files
fix: support deno packages
1 parent 6714033 commit 6d5a11e

File tree

4 files changed

+70
-7
lines changed

4 files changed

+70
-7
lines changed

.changeset/wicked-dragons-melt.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@vanilla-extract/integration': patch
3+
---
4+
5+
Support Deno projects without a `package.json` file.
6+
7+
When Deno is detected, we'll first check for `deno.json` or `deno.jsonc` before falling back to `package.json`.

packages/integration/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"eval": "0.1.8",
2525
"find-up": "^5.0.0",
2626
"javascript-stringify": "^2.0.1",
27+
"json5": "^2.2.3",
2728
"mlly": "^1.4.2"
2829
},
2930
"devDependencies": {

packages/integration/src/packageInfo.ts

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'path';
2-
2+
import json5 from 'json5';
3+
import fs from 'node:fs';
34
import findUp from 'find-up';
45

56
export interface PackageInfo {
@@ -8,7 +9,7 @@ export interface PackageInfo {
89
dirname: string;
910
}
1011

11-
function getClosestPackageInfo(directory: string) {
12+
function getClosestPackageInfo(directory: string): PackageInfo | undefined {
1213
const packageJsonPath = findUp.sync('package.json', {
1314
cwd: directory,
1415
});
@@ -24,6 +25,38 @@ function getClosestPackageInfo(directory: string) {
2425
}
2526
}
2627

28+
function getClosestDenoJson(directory: string): PackageInfo | undefined {
29+
const denoJsonPath = findUp.sync('deno.json', {
30+
cwd: directory,
31+
});
32+
33+
if (denoJsonPath) {
34+
const { name } = require(denoJsonPath);
35+
36+
return {
37+
name,
38+
path: denoJsonPath,
39+
dirname: path.dirname(denoJsonPath),
40+
};
41+
}
42+
43+
// Deno also supports `deno.jsonc`
44+
const denoJsoncPath = findUp.sync('deno.jsonc', {
45+
cwd: directory,
46+
});
47+
48+
if (denoJsoncPath) {
49+
const { name } = json5.parse(fs.readFileSync(denoJsoncPath, 'utf-8'));
50+
51+
return {
52+
name,
53+
path: denoJsoncPath,
54+
dirname: path.dirname(denoJsoncPath),
55+
};
56+
}
57+
}
58+
59+
const isDeno = typeof process.versions.deno === 'string';
2760
const packageInfoCache = new Map<string, PackageInfo>();
2861

2962
export function getPackageInfo(cwd?: string | null): PackageInfo {
@@ -34,15 +67,34 @@ export function getPackageInfo(cwd?: string | null): PackageInfo {
3467
return cachedValue;
3568
}
3669

37-
let packageInfo = getClosestPackageInfo(resolvedCwd);
70+
let packageInfo: PackageInfo | undefined;
3871

39-
while (packageInfo && !packageInfo.name) {
40-
packageInfo = getClosestPackageInfo(
41-
path.resolve(packageInfo.dirname, '..'),
42-
);
72+
// Deno projects don't necessarily have a package.json
73+
if (isDeno) {
74+
packageInfo = getClosestDenoJson(resolvedCwd);
75+
76+
// No need to look further as nested deno.json files is not supported
77+
// in Deno without being a workspace member. If they are a workspace
78+
// member, they are expected to have the `name` field anyway.
79+
}
80+
81+
if (!packageInfo) {
82+
packageInfo = getClosestPackageInfo(resolvedCwd);
83+
84+
while (packageInfo && !packageInfo.name) {
85+
packageInfo = getClosestPackageInfo(
86+
path.resolve(packageInfo.dirname, '..'),
87+
);
88+
}
4389
}
4490

4591
if (!packageInfo || !packageInfo.name) {
92+
if (isDeno) {
93+
throw new Error(
94+
`Couldn't find parent deno.json, deno.jsonc or package.json with a name field from '${resolvedCwd}'`,
95+
);
96+
}
97+
4698
throw new Error(
4799
`Couldn't find parent package.json with a name field from '${resolvedCwd}'`,
48100
);

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)