Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5,202 changes: 2,329 additions & 2,873 deletions package-lock.json

Large diffs are not rendered by default.

17 changes: 8 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "knighted-monorepo",
"name": "knighted-css-monorepo",
"private": true,
"type": "module",
"workspaces": [
Expand All @@ -21,7 +21,7 @@
"lint": "oxlint packages",
"prettier": "prettier --write .",
"prettier:check": "prettier --check .",
"check:cycles": "madge packages/css/src --ts-config packages/css/tsconfig.json --extensions ts,tsx,js,jsx,mjs,cjs --circular && madge packages/playwright/src --ts-config packages/playwright/tsconfig.json --extensions ts,tsx,js,jsx,mjs,cjs --circular",
"check:cycles": "oxlint --import-plugin --tsconfig packages/css/tsconfig.json -A all -D import/no-cycle packages/css/src && oxlint --import-plugin --tsconfig packages/playwright/tsconfig.json -A all -D import/no-cycle packages/playwright/src",
"preview:e2e": "npm run preview -w @knighted/css-playwright-fixture",
"check-types": "npm run check-types -w @knighted/css && npm run check-types -w @knighted/css-playwright-fixture",
"clean:deps": "find . -name node_modules -type d -prune -exec rm -rf {} +",
Expand All @@ -31,26 +31,25 @@
"devDependencies": {
"@emnapi/core": "^1.2.0",
"@emnapi/runtime": "^1.2.0",
"@knighted/duel": "^4.0.0",
"@knighted/duel": "^4.0.2",
"@napi-rs/wasm-runtime": "^1.0.7",
"@playwright/test": "^1.48.2",
"@rspack/cli": "^1.0.0",
"@rspack/core": "^1.0.0",
"@rspack/cli": "^1.7.8",
"@rspack/core": "^1.7.8",
"@types/less": "^3.0.8",
"@types/webpack": "^5.28.5",
"@vanilla-extract/css": "^1.15.2",
"@vanilla-extract/integration": "^8.0.6",
"@vanilla-extract/recipes": "^0.5.7",
"@vanilla-extract/sprinkles": "^1.6.5",
"c8": "^10.1.2",
"c8": "^11.0.0",
"http-server": "^14.1.1",
"husky": "^9.1.7",
"less": "^4.2.0",
"lint-staged": "^16.2.7",
"madge": "^8.0.0",
"oxlint": "^1.39.0",
"oxlint": "^1.55.0",
"prettier": "^3.7.4",
"sass": "^1.80.7",
"sass": "^1.98.0",
"tsx": "^4.19.2",
"typescript": "^5.9.3"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/css/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@
"get-tsconfig": "^4.13.0",
"lightningcss": "^1.30.1",
"node-module-type": "^1.0.1",
"oxc-parser": "^0.105.0",
"oxc-resolver": "^11.16.0",
"oxc-parser": "^0.116.0",
"oxc-resolver": "^11.19.1",
"tsconfig-paths": "^4.2.0"
},
"peerDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions packages/css/src/css.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ const isVisitor = (
): value is StrictLightningVisitor => Boolean(value)

function appendStableSelectorsFromExports(
css: string,
cssText: string,
exportsMap: Record<string, string | string[] | { name: string }>,
config: AutoStableOption,
): string {
let output = css
let output = cssText
for (const [token, value] of Object.entries(exportsMap)) {
const hashed = Array.isArray(value)
? value.join(' ')
Expand Down
14 changes: 8 additions & 6 deletions packages/css/src/loaderBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,13 +509,15 @@ function resolveRemainingRequest(
const loaders = Array.isArray(ctx.loaders) ? ctx.loaders.slice(ctx.loaderIndex + 1) : []
if (loaders.length > 0) {
const loaderRequests = loaders
.map(loader => {
if (loader && typeof loader.request === 'string' && loader.request) {
return loader.request
.map(loaderInfo => {
if (loaderInfo && typeof loaderInfo.request === 'string' && loaderInfo.request) {
return loaderInfo.request
}
const path = loader && typeof loader.path === 'string' ? loader.path : ''
const query = loader && typeof loader.query === 'string' ? loader.query : ''
return path ? `${path}${query}` : ''
const loaderPath =
loaderInfo && typeof loaderInfo.path === 'string' ? loaderInfo.path : ''
const query =
loaderInfo && typeof loaderInfo.query === 'string' ? loaderInfo.query : ''
return loaderPath ? `${loaderPath}${query}` : ''
})
.filter(Boolean)
if (loaderRequests.length > 0) {
Expand Down
12 changes: 6 additions & 6 deletions packages/css/src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,10 @@ export class KnightedCssResolverPlugin {
compiler.hooks?.done?.tap('KnightedCssResolverPlugin', () => {
this.flushDiagnostics()
})
const resolver = compiler.getResolver?.('normal')
if (resolver && this.isResolver(resolver as ResolverLike)) {
this.compilerResolver = resolver as ResolverLike
this.applyToResolver(resolver as ResolverLike)
const normalResolver = compiler.getResolver?.('normal')
if (normalResolver && this.isResolver(normalResolver as ResolverLike)) {
this.compilerResolver = normalResolver as ResolverLike
this.applyToResolver(normalResolver as ResolverLike)
return
}

Expand Down Expand Up @@ -296,8 +296,8 @@ export class KnightedCssResolverPlugin {
return
}

resolverHook.tap('KnightedCssResolverPlugin', resolver =>
this.applyToResolver(resolver),
resolverHook.tap('KnightedCssResolverPlugin', hookedResolver =>
this.applyToResolver(hookedResolver),
)
}

Expand Down
12 changes: 8 additions & 4 deletions packages/css/test/css.autoStable.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,14 @@ test('autoStable captures cssModules exports and selector duplication', async ()
if (typeof value === 'string') return value
if (Array.isArray(value)) return value.join(' ')
if (value && typeof value === 'object' && 'name' in value) {
const entry = value as { name?: string; composes?: Array<{ name?: string }> }
const names = [entry.name, ...(entry.composes ?? []).map(c => c?.name)].filter(
Boolean,
)
const exportEntry = value as {
name?: string
composes?: Array<{ name?: string }>
}
const names = [
exportEntry.name,
...(exportEntry.composes ?? []).map(c => c?.name),
].filter(Boolean)
return names.join(' ')
}
return ''
Expand Down
63 changes: 34 additions & 29 deletions packages/css/test/generateTypes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1115,12 +1115,12 @@ test('generateTypes internals cover edge cases', async () => {
resolveImportPath,
formatSelectorModuleSource,
removeStaleSelectorModules,
resolveIndexFallback,
resolveIndexFallback: resolveIndexFallbackInternal,
loadTsconfigResolutionContext,
isNonRelativeSpecifier,
resolveProxyInfo,
loadResolverModule,
parseCliArgs,
loadResolverModule: loadResolverModuleInternal,
parseCliArgs: parseCliArgsInternal,
} = __generateTypesInternals

const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'knighted-internals-'))
Expand Down Expand Up @@ -1205,7 +1205,7 @@ test('generateTypes internals cover edge cases', async () => {

const candidate = path.join(tempRoot, 'not-a-dir')
await fs.writeFile(candidate, 'noop')
assert.equal(await resolveIndexFallback(candidate), undefined)
assert.equal(await resolveIndexFallbackInternal(candidate), undefined)

const tsconfig = loadTsconfigResolutionContext(tempRoot, () => ({
path: path.join(tempRoot, 'tsconfig.json'),
Expand Down Expand Up @@ -1239,7 +1239,7 @@ test('generateTypes internals cover edge cases', async () => {

const resolverFile = path.join(tempRoot, 'resolver-file.mjs')
await fs.writeFile(resolverFile, 'export default function resolver() { return null }')
const fileResolver = await loadResolverModule(
const fileResolver = await loadResolverModuleInternal(
pathToFileURL(resolverFile).href,
tempRoot,
)
Expand All @@ -1255,25 +1255,25 @@ test('generateTypes internals cover edge cases', async () => {
path.join(nodeModulesDir, 'index.js'),
'export default function resolver() { return null }',
)
const packageResolver = await loadResolverModule('fixture-resolver', tempRoot)
const packageResolver = await loadResolverModuleInternal('fixture-resolver', tempRoot)
assert.equal(typeof packageResolver, 'function')

const badResolver = path.join(tempRoot, 'resolver-bad.mjs')
await fs.writeFile(badResolver, 'export const resolver = 123')
await assert.rejects(
() => loadResolverModule(pathToFileURL(badResolver).href, tempRoot),
() => loadResolverModuleInternal(pathToFileURL(badResolver).href, tempRoot),
/Resolver module must export a function/,
)

const namedResolverFile = path.join(tempRoot, 'resolver-named.mjs')
await fs.writeFile(namedResolverFile, 'export function resolver() { return null }')
const namedResolver = await loadResolverModule(
const namedResolver = await loadResolverModuleInternal(
pathToFileURL(namedResolverFile).href,
tempRoot,
)
assert.equal(typeof namedResolver, 'function')

const parsed = parseCliArgs(['--root', tempRoot, 'src'])
const parsed = parseCliArgsInternal(['--root', tempRoot, 'src'])
assert.deepEqual(parsed.include, ['src'])
assert.equal(parsed.mode, 'module')
} finally {
Expand Down Expand Up @@ -1332,12 +1332,12 @@ test('generateTypes internals support selector module helpers', async () => {
relativeToRoot,
isNonRelativeSpecifier,
isStyleResource,
resolveWithExtensionFallback,
resolveWithExtensionFallback: resolveWithExtensionFallbackInternal,
createProjectPeerResolver,
getProjectRequire,
loadTsconfigResolutionContext,
resolveWithTsconfigPaths,
parseCliArgs,
parseCliArgs: parseCliArgsInternal,
printHelp,
reportCliResult,
buildSelectorModuleManifestKey,
Expand Down Expand Up @@ -1418,10 +1418,12 @@ test('generateTypes internals support selector module helpers', async () => {
try {
const filePath = path.join(tempRoot, 'widget.ts')
await fs.writeFile(filePath, 'export const widget = true')
const resolved = await resolveWithExtensionFallback(path.join(tempRoot, 'widget.js'))
const resolved = await resolveWithExtensionFallbackInternal(
path.join(tempRoot, 'widget.js'),
)
assert.equal(resolved, filePath)

const missingResolved = await resolveWithExtensionFallback(
const missingResolved = await resolveWithExtensionFallbackInternal(
path.join(tempRoot, 'missing.ts'),
)
assert.equal(missingResolved, path.join(tempRoot, 'missing.ts'))
Expand All @@ -1430,7 +1432,7 @@ test('generateTypes internals support selector module helpers', async () => {
await fs.mkdir(indexDir, { recursive: true })
const indexPath = path.join(indexDir, 'index.ts')
await fs.writeFile(indexPath, 'export const ok = true')
const indexResolved = await resolveWithExtensionFallback(indexDir)
const indexResolved = await resolveWithExtensionFallbackInternal(indexDir)
assert.equal(indexResolved, indexPath)
} finally {
await fs.rm(tempRoot, { recursive: true, force: true })
Expand Down Expand Up @@ -1478,7 +1480,7 @@ test('generateTypes internals support selector module helpers', async () => {
await fs.rm(collectRoot, { recursive: true, force: true })
}

const parsed = parseCliArgs([
const parsed = parseCliArgsInternal([
'--root',
'/tmp/project',
'--include',
Expand All @@ -1504,7 +1506,7 @@ test('generateTypes internals support selector module helpers', async () => {
assert.equal(parsed.mode, 'declaration')
assert.equal(parsed.manifestPath, '.knighted-css/knighted-manifest.json')

const hashedParsed = parseCliArgs([
const hashedParsed = parseCliArgsInternal([
'--root',
'/tmp/project',
'--hashed',
Expand All @@ -1516,17 +1518,20 @@ test('generateTypes internals support selector module helpers', async () => {
assert.equal(hashedParsed.hashed, true)
assert.equal(hashedParsed.mode, 'module')

assert.throws(() => parseCliArgs(['--root']), /Missing value/)
assert.throws(() => parseCliArgs(['--include']), /Missing value/)
assert.throws(() => parseCliArgs(['--out-dir']), /Missing value/)
assert.throws(() => parseCliArgs(['--stable-namespace']), /Missing value/)
assert.throws(() => parseCliArgs(['--resolver']), /Missing value/)
assert.throws(() => parseCliArgs(['--mode']), /Missing value/)
assert.throws(() => parseCliArgs(['--manifest']), /Missing value/)
assert.throws(() => parseCliArgs(['--mode', 'wat']), /Unknown mode/)
assert.throws(() => parseCliArgs(['--wat']), /Unknown flag/)
assert.throws(() => parseCliArgs(['--auto-stable', '--hashed']), /Cannot combine/)
const helpParsed = parseCliArgs(['--help'])
assert.throws(() => parseCliArgsInternal(['--root']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--include']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--out-dir']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--stable-namespace']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--resolver']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--mode']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--manifest']), /Missing value/)
assert.throws(() => parseCliArgsInternal(['--mode', 'wat']), /Unknown mode/)
assert.throws(() => parseCliArgsInternal(['--wat']), /Unknown flag/)
assert.throws(
() => parseCliArgsInternal(['--auto-stable', '--hashed']),
/Cannot combine/,
)
const helpParsed = parseCliArgsInternal(['--help'])
assert.equal(helpParsed.help, true)

const normalizedPaths = normalizeTsconfigPaths({
Expand Down Expand Up @@ -1610,8 +1615,8 @@ test('generateTypes internals support selector module helpers', async () => {
const peerRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'knighted-peer-resolver-'))
try {
await fs.writeFile(path.join(peerRoot, 'package.json'), '{}')
const modulePath = path.join(peerRoot, 'demo.mjs')
await fs.writeFile(modulePath, 'export const value = 42\n')
const peerModulePath = path.join(peerRoot, 'demo.mjs')
await fs.writeFile(peerModulePath, 'export const value = 42\n')
const resolver = createProjectPeerResolver(peerRoot)
const moduleNs = await resolver('./demo.mjs')
assert.equal(moduleNs.value, 42)
Expand Down
8 changes: 4 additions & 4 deletions packages/playwright/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
},
"dependencies": {
"@knighted/css": "1.2.0-rc.2",
"@knighted/jsx": "^1.7.6",
"@knighted/jsx": "^1.7.9",
"lit": "^3.2.1",
"react": "^19.0.0",
"react-dom": "^19.0.0"
Expand All @@ -47,9 +47,9 @@
"@types/react-dom": "^19.0.2",
"@vanilla-extract/webpack-plugin": "^2.3.15",
"css-loader": "^7.1.2",
"mini-css-extract-plugin": "^2.10.0",
"mini-css-extract-plugin": "^2.10.1",
"swc-loader": "^0.2.7",
"webpack": "^5.97.1",
"webpack-cli": "^5.1.4"
"webpack": "^5.105.4",
"webpack-cli": "^6.0.1"
}
}
12 changes: 6 additions & 6 deletions packages/playwright/test/mode.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,18 @@ async function readShadowMetrics(
cardId: string,
): Promise<CardMetrics> {
const handle = await page.waitForFunction(
({ hostId, cardId }) => {
const hostEl = document.querySelector(`[data-testid="${hostId}"]`)
return hostEl?.shadowRoot?.querySelector(`[data-testid="${cardId}"]`)
({ hostId: targetHostId, cardId: targetCardId }) => {
const hostEl = document.querySelector(`[data-testid="${targetHostId}"]`)
return hostEl?.shadowRoot?.querySelector(`[data-testid="${targetCardId}"]`)
},
{ hostId, cardId },
)
await handle.dispose()

return page.evaluate(
({ hostId, cardId }) => {
const hostEl = document.querySelector(`[data-testid="${hostId}"]`)
const card = hostEl?.shadowRoot?.querySelector(`[data-testid="${cardId}"]`)
({ hostId: targetHostId, cardId: targetCardId }) => {
const hostEl = document.querySelector(`[data-testid="${targetHostId}"]`)
const card = hostEl?.shadowRoot?.querySelector(`[data-testid="${targetCardId}"]`)
if (!card) {
throw new Error('Shadow DOM card was not rendered')
}
Expand Down
Loading