Skip to content

Commit

Permalink
feat: add types, module, imports and require conditions (#11)
Browse files Browse the repository at this point in the history
* feat: add types, module, imports and require conditions

* fix: add sideEffects: false
  • Loading branch information
dominikg committed Dec 29, 2022
1 parent ce32d45 commit 6dac351
Show file tree
Hide file tree
Showing 13 changed files with 121 additions and 20 deletions.
5 changes: 5 additions & 0 deletions .changeset/cold-planets-own.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'node-conditions': minor
---

add types, module, import and require conditions
5 changes: 5 additions & 0 deletions .changeset/nine-worms-stare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'node-conditions': patch
---

add sideEffects: false to package.json
4 changes: 4 additions & 0 deletions packages/node-conditions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,8 @@ const isBrowser = require('node-conditions/browser');
- IMBA
- SOLID
- SVELTE
- TYPES
- MODULE
- IMPORT
- REQUIRE
<!-- /generated -->
14 changes: 11 additions & 3 deletions packages/node-conditions/conditions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// add new conditions here and scripts/generate.js generates the code
export const conditions = [
//environments
// environments
'browser',
'node',
'node-addons',
Expand All @@ -13,9 +13,17 @@ export const conditions = [
'test', // not officially mentioned in the node docs but inferred from the other 2
'production',

//frameworks
// frameworks
'astro',
'imba',
'solid',
'svelte'
'svelte',

// bundlers et al
'types', // typescript
'module', // webpack, see https://github.com/microsoft/tslib/issues/183#issuecomment-1279411988

// loaded via
'import',
'require'
];
4 changes: 4 additions & 0 deletions packages/node-conditions/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ module.exports.ASTRO = require('node-conditions/astro');
module.exports.IMBA = require('node-conditions/imba');
module.exports.SOLID = require('node-conditions/solid');
module.exports.SVELTE = require('node-conditions/svelte');
module.exports.TYPES = require('node-conditions/types');
module.exports.MODULE = require('node-conditions/module');
module.exports.IMPORT = require('node-conditions/import');
module.exports.REQUIRE = require('node-conditions/require');
4 changes: 4 additions & 0 deletions packages/node-conditions/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ export const ASTRO: boolean;
export const IMBA: boolean;
export const SOLID: boolean;
export const SVELTE: boolean;
export const TYPES: boolean;
export const MODULE: boolean;
export const IMPORT: boolean;
export const REQUIRE: boolean;
4 changes: 4 additions & 0 deletions packages/node-conditions/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ export { default as ASTRO } from 'node-conditions/astro';
export { default as IMBA } from 'node-conditions/imba';
export { default as SOLID } from 'node-conditions/solid';
export { default as SVELTE } from 'node-conditions/svelte';
export { default as TYPES } from 'node-conditions/types';
export { default as MODULE } from 'node-conditions/module';
export { default as IMPORT } from 'node-conditions/import';
export { default as REQUIRE } from 'node-conditions/require';
31 changes: 30 additions & 1 deletion packages/node-conditions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,35 @@
"svelte": "./true.cjs",
"default": "./false.cjs"
}
},
"./types": {
"import": {
"types": "./true.mjs",
"default": "./false.mjs"
},
"require": {
"types": "./true.cjs",
"default": "./false.cjs"
}
},
"./module": {
"import": {
"module": "./true.mjs",
"default": "./false.mjs"
},
"require": {
"module": "./true.cjs",
"default": "./false.cjs"
}
},
"./import": {
"import": "./true.mjs",
"default": "./false.cjs"
},
"./require": {
"require": "./true.cjs",
"default": "./false.mjs"
}
}
},
"sideEffects": false
}
36 changes: 26 additions & 10 deletions scripts/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,32 @@ pkg.exports = {
},
// condition exports
...conditions.reduce((exports, condition) => {
exports[`./${condition}`] = {
import: {
[condition]: './true.mjs',
default: './false.mjs'
},
require: {
[condition]: './true.cjs',
default: './false.cjs'
}
};
switch (condition) {
case 'import':
exports[`./import`] = {
import: './true.mjs',
default: './false.cjs'
};
break;
case 'require':
exports[`./require`] = {
require: './true.cjs',
default: './false.mjs'
};
break;
default:
exports[`./${condition}`] = {
import: {
[condition]: './true.mjs',
default: './false.mjs'
},
require: {
[condition]: './true.cjs',
default: './false.cjs'
}
};
}

return exports;
}, {})
};
Expand Down
2 changes: 2 additions & 0 deletions scripts/test-types.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const TYPES = require('node-conditions/types');
console.log(JSON.stringify(TYPES));
2 changes: 2 additions & 0 deletions scripts/test-types.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import TYPES from 'node-conditions/types';
console.log(JSON.stringify(TYPES));
15 changes: 12 additions & 3 deletions tests/esm.mjs → tests/import.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,23 @@ function readValues(condition) {
return JSON.parse(values);
}

function readTypes() {
const value = execSync(`node -C types scripts/test-types.mjs`).toString('utf-8');
return JSON.parse(value);
}

test('should resolve set conditions', () => {
for (const condition of conditions) {
const testConditions = conditions.filter((c) => !['require', 'types'].includes(c));
for (const condition of testConditions) {
const values = readValues(condition);
const expectedTrue = [condition, 'node', 'node-addons'].map(name);
const expectedTrue = [condition, 'node', 'node-addons', 'import'].map(name);
for (const [name, value] of Object.entries(values)) {
const expected = expectedTrue.includes(name);
assert.equal(value, expected, `${name}`);
assert.equal(value, expected, `esm import failed for condition ${name}`);
}
}
// special handling for types, can't be tested from '.' index export
const TYPES = readTypes();
assert.equal(TYPES, true, `esm import failed for condition types`);
});
test.run();
15 changes: 12 additions & 3 deletions tests/cjs.cjs → tests/require.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,25 @@ function readValues(condition) {
return JSON.parse(values);
}

function readTypes() {
const value = execSync(`node -C types scripts/test-types.cjs`).toString('utf-8');
return JSON.parse(value);
}

test('should resolve set conditions', async () => {
const conditions = await conditionsImport;
const name = await nameImport;
for (const condition of conditions) {
const testConditions = conditions.filter((c) => !['import', 'types'].includes(c));
for (const condition of testConditions) {
const values = readValues(condition);
const expectedTrue = [condition, 'node', 'node-addons'].map(name);
const expectedTrue = [condition, 'node', 'node-addons', 'require'].map(name);
for (const [name, value] of Object.entries(values)) {
const expected = expectedTrue.includes(name);
assert.equal(value, expected, `${name}`);
assert.equal(value, expected, `require failed for condition ${name}`);
}
}
// special handling for types, can't be tested from '.' index export
const TYPES = readTypes();
assert.equal(TYPES, true, `require failed for condition types`);
});
test.run();

0 comments on commit 6dac351

Please sign in to comment.