Skip to content

Commit

Permalink
vx: support namespaced exports
Browse files Browse the repository at this point in the history
  • Loading branch information
ealush committed Nov 20, 2021
1 parent 38a54ae commit 03ba92c
Show file tree
Hide file tree
Showing 14 changed files with 94 additions and 92 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ packages/vest/classnames/
packages/vest/promisify/
packages/vest/parser/
packages/vest/enforce-compose/
packages/vest/enforce/
packages/anyone/all/
packages/anyone/any/
packages/anyone/none/
Expand Down
7 changes: 0 additions & 7 deletions packages/anyone/any/package.json

This file was deleted.

7 changes: 0 additions & 7 deletions packages/anyone/none/package.json

This file was deleted.

7 changes: 0 additions & 7 deletions packages/anyone/one/package.json

This file was deleted.

4 changes: 1 addition & 3 deletions packages/n4s/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
"test": "vx test",
"release": "vx release"
},
"dependencies": {
"context": "next"
},
"dependencies": {},
"module": "./dist/es/n4s.production.js",
"exports": {
"./compose": {
Expand Down
7 changes: 0 additions & 7 deletions packages/vest/enforce-compose/package.json

This file was deleted.

55 changes: 26 additions & 29 deletions packages/vest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@
"bugs": {
"url": "https://github.com/ealush/vest.git/issues"
},
"dependencies": {
"n4s": "next",
"context": "next"
},
"dependencies": {},
"homepage": "https://vestjs.dev/",
"exports": {
"./classnames": {
Expand Down Expand Up @@ -55,35 +52,35 @@
"module": "./dist/es/classnames.production.js",
"default": "./dist/cjs/classnames.js"
},
"./enforce-compose": {
"./compose": {
"production": {
"types": "./types/enforce-compose.d.ts",
"browser": "./dist/es/enforce-compose.production.js",
"umd": "./dist/umd/enforce-compose.production.js",
"import": "./dist/es/enforce-compose.production.js",
"require": "./dist/cjs/enforce-compose.production.js",
"node": "./dist/cjs/enforce-compose.production.js",
"module": "./dist/es/enforce-compose.production.js",
"default": "./dist/cjs/enforce-compose.production.js"
"types": "./../types/enforce/compose.d.ts",
"browser": "./../dist/es/enforce/compose.production.js",
"umd": "./../dist/umd/enforce/compose.production.js",
"import": "./../dist/es/enforce/compose.production.js",
"require": "./../dist/cjs/enforce/compose.production.js",
"node": "./../dist/cjs/enforce/compose.production.js",
"module": "./../dist/es/enforce/compose.production.js",
"default": "./../dist/cjs/enforce/compose.production.js"
},
"development": {
"types": "./types/enforce-compose.d.ts",
"browser": "./dist/es/enforce-compose.development.js",
"umd": "./dist/umd/enforce-compose.development.js",
"import": "./dist/es/enforce-compose.development.js",
"require": "./dist/cjs/enforce-compose.development.js",
"node": "./dist/cjs/enforce-compose.development.js",
"module": "./dist/es/enforce-compose.development.js",
"default": "./dist/cjs/enforce-compose.development.js"
"types": "./../types/enforce/compose.d.ts",
"browser": "./../dist/es/enforce/compose.development.js",
"umd": "./../dist/umd/enforce/compose.development.js",
"import": "./../dist/es/enforce/compose.development.js",
"require": "./../dist/cjs/enforce/compose.development.js",
"node": "./../dist/cjs/enforce/compose.development.js",
"module": "./../dist/es/enforce/compose.development.js",
"default": "./../dist/cjs/enforce/compose.development.js"
},
"types": "./types/enforce-compose.d.ts",
"browser": "./dist/es/enforce-compose.production.js",
"umd": "./dist/umd/enforce-compose.production.js",
"import": "./dist/es/enforce-compose.production.js",
"require": "./dist/cjs/enforce-compose.js",
"node": "./dist/cjs/enforce-compose.js",
"module": "./dist/es/enforce-compose.production.js",
"default": "./dist/cjs/enforce-compose.js"
"types": "./../types/enforce/compose.d.ts",
"browser": "./../dist/es/enforce/compose.production.js",
"umd": "./../dist/umd/enforce/compose.production.js",
"import": "./../dist/es/enforce/compose.production.js",
"require": "./../dist/cjs/enforce/compose.js",
"node": "./../dist/cjs/enforce/compose.js",
"module": "./../dist/es/enforce/compose.production.js",
"default": "./../dist/cjs/enforce/compose.js"
},
"./parser": {
"production": {
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 37 additions & 19 deletions vx/config/rollup/plugins/handleExports.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ function isMain(name) {
return usePackage() === name;
}

function handleExports() {
function handleExports({ namespace } = {}) {
return {
name: 'write-cjs-main',
writeBundle: once(({ name }) => {
Expand All @@ -26,11 +26,11 @@ function handleExports() {
let exportPath = rootPath;

if (!isMain(name)) {
exportPath = joinPath(rootPath, name);
exportPath = joinPath(rootPath, namespace, name);
fse.ensureDirSync(exportPath);
}

writePackageJson(name, exportPath);
writePackageJson(name, exportPath, namespace);

fse.writeFileSync(
vxPath.package(usePackage(), mainExport(name)),
Expand Down Expand Up @@ -60,30 +60,31 @@ if (process.env.NODE_ENV === '${opts.env.PRODUCTION}') {
}`;
}

function genPackageJson(name) {
function genPackageJson(name, namespace) {
const isTopLevel = isMain(name);
const esPath = genDistPath(
isTopLevel,
namespace,
name,
opts.format.ES,
opts.env.PRODUCTION
);
const cjsPath = genDistPath(isTopLevel, name, opts.format.CJS);
const cjsPath = genDistPath(isTopLevel, namespace, name, opts.format.CJS);
return {
main: cjsPath,
module: esPath,
name,
types: typesPath(name),
types: typesPath([name, namespace]),
...(isTopLevel
? {
exports: {
...genExportedFiles(),
/* eslint-disable sort-keys */
'.': {
[opts.env.DEVELOPMENT]: {
...exportsOrder(name, opts.env.DEVELOPMENT),
...exportsOrder([name], opts.env.DEVELOPMENT),
},
...exportsOrder(name),
...exportsOrder([name]),
},
'./package.json': './package.json',
'./': './',
Expand All @@ -103,8 +104,8 @@ function genPackageJson(name) {
};
}

function writePackageJson(name, exportPath) {
let pkgJson = genPackageJson(name);
function writePackageJson(name, exportPath, namespace) {
let pkgJson = genPackageJson(name, namespace);

if (isMain(name)) {
pkgJson = { ...packageJson(name), ...pkgJson };
Expand All @@ -116,7 +117,7 @@ function writePackageJson(name, exportPath) {
}

function joinPath(...paths) {
return paths.join(path.sep); // this combats the trimming of the first dot in the path
return paths.filter(Boolean).join(path.sep); // this combats the trimming of the first dot in the path
}

function mainExport(name) {
Expand All @@ -136,40 +137,48 @@ function exportName(name, env) {
}

function genExportedFiles() {
return listExportedModules().reduce((modules, moduleName) => {
return listExportedModules().reduce((modules, [moduleName, namespace]) => {
const currentModule = {};
modules[`./${moduleName}`] = currentModule;

[opts.env.PRODUCTION, opts.env.DEVELOPMENT].reduce((currentModule, env) => {
currentModule[env] = exportsOrder(moduleName, env);
currentModule[env] = exportsOrder([moduleName, namespace], env);

return currentModule;
}, currentModule);

Object.assign(currentModule, exportsOrder(moduleName));
Object.assign(currentModule, exportsOrder([moduleName, namespace]));

return modules;
}, {});
}

function exportsOrder(moduleName, env = undefined) {
function exportsOrder([moduleName, namespace], env = undefined) {
const isTopLevel = true;
const esPath = genDistPath(
isTopLevel,
namespace,
moduleName,
opts.format.ES,
env ?? opts.env.PRODUCTION
);
const cjsPath = genDistPath(isTopLevel, moduleName, opts.format.CJS, env);
const cjsPath = genDistPath(
isTopLevel,
namespace,
moduleName,
opts.format.CJS,
env
);

const umdPath = genDistPath(
isTopLevel,
namespace,
moduleName,
opts.format.UMD,
env ?? opts.env.PRODUCTION
);

const types = typesPath(moduleName, /* isMain */ true);
const types = typesPath([moduleName, namespace], /* isMain */ true);

/* eslint-disable sort-keys */
return {
Expand All @@ -185,18 +194,27 @@ function exportsOrder(moduleName, env = undefined) {
/* eslint-enable sort-keys */
}

function genDistPath(isTopLevel, moduleName, moduleType, env) {
// eslint-disable-next-line max-params
function genDistPath(isTopLevel, namespace, moduleName, moduleType, env) {
return joinPath(
singleDot(isTopLevel),
levelUp(namespace),
opts.dir.DIST,
moduleType,
namespace,
exportName(moduleName, env)
);
}

const typesPath = (moduleName, isTopLevel) =>
const typesPath = ([moduleName, namespace], isTopLevel) =>
joinPath(
singleDot(isTopLevel ?? isMain(moduleName)),
levelUp(namespace),
opts.dir.TYPES,
namespace,
fileName(moduleName, 'd.ts')
);

function levelUp(value) {
return value ? '..' : undefined;
}
26 changes: 19 additions & 7 deletions vx/config/rollup/rollup.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -60,22 +60,31 @@ function cleanupConfig(configs) {
.map(({ input, output, plugins }) => ({ input, output, plugins }));
}

function genBaseConfig({ env, packageName, moduleName = usePackage() }) {
function genBaseConfig({
env,
packageName,
moduleName = usePackage(),
namespace = undefined,
}) {
return {
env,
input: getInputFile(moduleName),
output: genOutput({ env, moduleName }),
plugins: getPlugins({ env, moduleName, packageName }),
output: genOutput({ env, moduleName, namespace }),
plugins: getPlugins({ env, moduleName, namespace, packageName }),
};
}

function genExportsConfig(pkgName, env) {
return listExportedModules(pkgName).map(moduleName =>
genBaseConfig({ env, moduleName })
return listExportedModules(pkgName).map(([moduleName, namespace]) =>
genBaseConfig({ env, moduleName, namespace })
);
}

function genOutput({ moduleName = usePackage(), env } = {}) {
function genOutput({
moduleName = usePackage(),
env,
namespace = undefined,
} = {}) {
const base = {
exports: 'auto',
name: moduleName,
Expand All @@ -94,6 +103,7 @@ function genOutput({ moduleName = usePackage(), env } = {}) {
file: vxPath.packageDist(
usePackage(),
format,
namespace,
joinTruthy([moduleName, env, 'js'], '.')
),
};
Expand All @@ -114,6 +124,7 @@ function getPlugins({
env = opts.env.PRODUCTION,
packageName = usePackage(),
moduleName = packageName,
namespace = undefined,
} = {}) {
const plugins = [
replace({
Expand Down Expand Up @@ -153,6 +164,7 @@ function getPlugins({
const basePath = vxPath.package(
usePackage(),
opts.dir.TYPES,
namespace,
moduleName + '.d.ts'
);

Expand All @@ -167,7 +179,7 @@ function getPlugins({
plugins.push(
compiler(),
terser(),
handleExports(),
handleExports({ namespace }),
addModulePackageJson(),
addCJSPackageJson()
);
Expand Down
10 changes: 7 additions & 3 deletions vx/util/listExportedModules.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ const vxPath = require('vx/vxPath');

function listExportedModules(pkgName = usePackage()) {
return (
glob
.sync(vxPath.packageSrc(pkgName, opts.dir.EXPORTS, '*.ts'))
.map(f => path.basename(f, '.ts')) ?? []
glob.sync(vxPath.packageSrc(pkgName, opts.dir.EXPORTS, '*.ts')).map(f => {
const [moduleName, namespace] = path
.basename(f, '.ts')
.split('@')
.reverse();
return [moduleName, namespace];
}) ?? []
);
}

Expand Down
2 changes: 1 addition & 1 deletion vx/vxPath.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ vxPath.vxRoot = () => {
};

vxPath.package = (pkgName = usePackage(), ...args) => {
return path.resolve(vxPath.PACKAGES_PATH, pkgName, ...args);
return path.resolve(vxPath.PACKAGES_PATH, pkgName, ...args.filter(Boolean));
};

vxPath.packageDist = (pkgName = usePackage(), ...args) => {
Expand Down
Loading

0 comments on commit 03ba92c

Please sign in to comment.