From 5740f224c0123bf2a8becf26f4854971e959c445 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 15 Dec 2023 16:45:31 +0100 Subject: [PATCH 1/3] fix(sveltekit): Add conditional exports --- packages/sveltekit/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/sveltekit/package.json b/packages/sveltekit/package.json index dd08e6b92727..18fe9efd3636 100644 --- a/packages/sveltekit/package.json +++ b/packages/sveltekit/package.json @@ -13,6 +13,10 @@ "module": "build/esm/index.server.js", "browser": "build/esm/index.client.js", "types": "build/types/index.types.d.ts", + "exports": { + "browser": "./build/esm/index.client.js", + "node": "./build/cjs/index.server.js" + }, "publishConfig": { "access": "public" }, From b49c7ad91a742cfe9d41b41e7723a428ea209554 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 15 Dec 2023 17:49:48 +0100 Subject: [PATCH 2/3] fix prepack script --- scripts/prepack.ts | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/scripts/prepack.ts b/scripts/prepack.ts index 941c6e6f6218..7ceb84f03dd3 100644 --- a/scripts/prepack.ts +++ b/scripts/prepack.ts @@ -15,6 +15,7 @@ const NPM_IGNORE = fs.existsSync('.npmignore') ? '.npmignore' : '../../.npmignor const ASSETS = ['README.md', 'LICENSE', 'package.json', NPM_IGNORE] as const; const ENTRY_POINTS = ['main', 'module', 'types', 'browser'] as const; +const CONDITIONAL_EXPORT_ENTRY_POINTS = ['import', 'require', ...ENTRY_POINTS] as const; const EXPORT_MAP_ENTRY_POINT = 'exports'; const TYPES_VERSIONS_ENTRY_POINT = 'typesVersions'; @@ -22,6 +23,7 @@ const packageWithBundles = process.argv.includes('--bundles'); const buildDir = packageWithBundles ? NPM_BUILD_DIR : BUILD_DIR; type PackageJsonEntryPoints = Record<(typeof ENTRY_POINTS)[number], string>; +type ConditionalExportEntryPoints = Record<(typeof CONDITIONAL_EXPORT_ENTRY_POINTS)[number], string>; interface TypeVersions { [key: string]: { @@ -30,15 +32,8 @@ interface TypeVersions { } interface PackageJson extends Record, PackageJsonEntryPoints { - [EXPORT_MAP_ENTRY_POINT]: { - [key: string]: { - import: string; - require: string; - types: string; - node: string; - browser: string; - default: string; - }; + [EXPORT_MAP_ENTRY_POINT]: Partial & { + [key: string]: Partial; }; [TYPES_VERSIONS_ENTRY_POINT]: TypeVersions; } @@ -77,6 +72,13 @@ ENTRY_POINTS.filter(entryPoint => newPkgJson[entryPoint]).forEach(entryPoint => if (newPkgJson[EXPORT_MAP_ENTRY_POINT]) { Object.entries(newPkgJson[EXPORT_MAP_ENTRY_POINT]).forEach(([key, val]) => { + if (typeof val === 'string') { + // case 1: key is already a conditional export entry point + // @ts-expect-error I'm too dumb for TS :'D + newPkgJson[EXPORT_MAP_ENTRY_POINT][key] = val.replace(`${buildDir}/`, ''); + return; + } + // case 2: key is a sub-path export newPkgJson[EXPORT_MAP_ENTRY_POINT][key] = Object.entries(val).reduce( (acc, [key, val]) => { return { ...acc, [key]: val.replace(`${buildDir}/`, '') }; @@ -90,7 +92,10 @@ if (newPkgJson[TYPES_VERSIONS_ENTRY_POINT]) { Object.entries(newPkgJson[TYPES_VERSIONS_ENTRY_POINT]).forEach(([key, val]) => { newPkgJson[TYPES_VERSIONS_ENTRY_POINT][key] = Object.entries(val).reduce((acc, [key, val]) => { const newKey = key.replace(`${buildDir}/`, ''); - return { ...acc, [newKey]: val.map(v => v.replace(`${buildDir}/`, '')) }; + return { + ...acc, + [newKey]: val.map(v => v.replace(`${buildDir}/`, '')), + }; }, {}); }); } From 81563d0cd1bf57914651ec5cbe55435bef18d767 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Dec 2023 11:43:34 +0100 Subject: [PATCH 3/3] adjust exports field based on review suggestions adjust prepack script --- packages/sveltekit/package.json | 10 ++++++-- scripts/prepack.ts | 41 +++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/packages/sveltekit/package.json b/packages/sveltekit/package.json index 18fe9efd3636..9458ce12e770 100644 --- a/packages/sveltekit/package.json +++ b/packages/sveltekit/package.json @@ -14,8 +14,14 @@ "browser": "build/esm/index.client.js", "types": "build/types/index.types.d.ts", "exports": { - "browser": "./build/esm/index.client.js", - "node": "./build/cjs/index.server.js" + "./package.json": "./package.json", + ".": { + "browser": { + "import": "./build/esm/index.client.js", + "require": "./build/cjs/index.client.js" + }, + "node": "./build/cjs/index.server.js" + } }, "publishConfig": { "access": "public" diff --git a/scripts/prepack.ts b/scripts/prepack.ts index 7ceb84f03dd3..9118226f08e7 100644 --- a/scripts/prepack.ts +++ b/scripts/prepack.ts @@ -31,10 +31,12 @@ interface TypeVersions { }; } +type PackageJsonExports = Partial & { + [key: string]: Partial; +}; + interface PackageJson extends Record, PackageJsonEntryPoints { - [EXPORT_MAP_ENTRY_POINT]: Partial & { - [key: string]: Partial; - }; + [EXPORT_MAP_ENTRY_POINT]: PackageJsonExports; [TYPES_VERSIONS_ENTRY_POINT]: TypeVersions; } @@ -70,21 +72,26 @@ ENTRY_POINTS.filter(entryPoint => newPkgJson[entryPoint]).forEach(entryPoint => newPkgJson[entryPoint] = newPkgJson[entryPoint].replace(`${buildDir}/`, ''); }); +/** + * Recursively traverses the exports object and rewrites all string values to remove the build directory. + */ +function rewriteConditionalExportEntryPoint( + exportsObject: Record>, + key: string, +): void { + const exportsField = exportsObject[key]; + if (typeof exportsField === 'string') { + exportsObject[key] = exportsField.replace(`${buildDir}/`, ''); + return; + } + Object.keys(exportsField).forEach(subfieldKey => { + rewriteConditionalExportEntryPoint(exportsField, subfieldKey); + }); +} + if (newPkgJson[EXPORT_MAP_ENTRY_POINT]) { - Object.entries(newPkgJson[EXPORT_MAP_ENTRY_POINT]).forEach(([key, val]) => { - if (typeof val === 'string') { - // case 1: key is already a conditional export entry point - // @ts-expect-error I'm too dumb for TS :'D - newPkgJson[EXPORT_MAP_ENTRY_POINT][key] = val.replace(`${buildDir}/`, ''); - return; - } - // case 2: key is a sub-path export - newPkgJson[EXPORT_MAP_ENTRY_POINT][key] = Object.entries(val).reduce( - (acc, [key, val]) => { - return { ...acc, [key]: val.replace(`${buildDir}/`, '') }; - }, - {} as typeof val, - ); + Object.keys(newPkgJson[EXPORT_MAP_ENTRY_POINT]).forEach(key => { + rewriteConditionalExportEntryPoint(newPkgJson[EXPORT_MAP_ENTRY_POINT], key); }); }