forked from adobe/react-spectrum
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlint-packages.js
128 lines (113 loc) Β· 5.58 KB
/
lint-packages.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
const glob = require('fast-glob');
const fs = require('fs');
const assert = require('assert');
const chalk = require('chalk');
let path = require('path');
let packages = glob.sync(__dirname + '/packages/@{react,spectrum}-*/*/package.json');
let errors = false;
// soft assert won't fail the whole thing, allowing us to accumulate all errors at once
// there's probably a nicer way to do this, but well... sometimes it's good enough. feel free to update me :)
// maybe turn me into an actual eslint plugin so we get their format for styling
function softAssert(val, message) {
try {
assert(val, message);
} catch {
console.error(chalk.red(message));
errors = true;
}
}
softAssert.deepEqual = function (val, val2, message) {
try {
assert.deepEqual(val, val2, message);
} catch {
console.error(chalk.red(message));
errors = true;
}
}
softAssert.equal = function (val, val2, message) {
try {
assert.equal(val, val2, message);
} catch {
console.error(chalk.red(message));
errors = true;
}
}
let pkgNames = {};
for (let pkg of packages) {
let json = JSON.parse(fs.readFileSync(pkg));
pkgNames[json.name] = true;
if (!pkg.includes('@react-types') && !pkg.includes('@spectrum-icons')) {
softAssert(json.main, `${pkg} did not have "main"`);
softAssert(json.main.endsWith('.js'), `${pkg}#main should be a .js file but got "${json.main}"`);
softAssert(json.module, `${pkg} did not have "module"`);
softAssert(json.module.endsWith('.js'), `${pkg}#module should be a .js file but got "${json.module}"`);
softAssert(json.source, `${pkg} did not have "source"`);
softAssert.equal(json.source, "src/index.ts", `${pkg} did not match "src/index.ts"`);
softAssert.deepEqual(json.files, ['dist'], `${pkg} did not match "files"`);
softAssert.equal(json.sideEffects, false, `${pkg} is missing sideEffects: false`);
softAssert(!json.dependencies || !json.dependencies['@adobe/spectrum-css-temp'], `${pkg} has @adobe/spectrum-css-temp in dependencies instead of devDependencies`);
softAssert(json.dependencies && json.dependencies['@babel/runtime'], `${pkg} is missing a dependency on @babel/runtime`);
softAssert(!json.dependencies || !json.dependencies['@react-spectrum/test-utils'], '@react-spectrum/test-utils should be a devDependency');
if (json.name.startsWith('@react-spectrum') && json.devDependencies && json.devDependencies['@adobe/spectrum-css-temp']) {
softAssert.deepEqual(json.targets, {
main: {
includeNodeModules: ['@adobe/spectrum-css-temp']
},
module: {
includeNodeModules: ['@adobe/spectrum-css-temp']
}
}, `${pkg} did not match "targets"`);
}
let topIndexExists = fs.existsSync(path.join(pkg, '..', 'index.ts'));
if (topIndexExists) {
let contents = fs.readFileSync(path.join(pkg, '..', 'index.ts'));
softAssert(/export \* from '.\/src';/.test(contents), `contents of ${path.join(pkg, '..', 'index.ts')} are not "export * from './src';"`);
}
softAssert(topIndexExists, `${pkg} is missing an index.ts`);
softAssert(fs.existsSync(path.join(pkg, '..', 'src', 'index.ts')), `${pkg} is missing a src/index.ts`);
}
if (!pkg.includes('@spectrum-icons')) {
softAssert(json.types, `${pkg} did not have "types"`);
softAssert(json.types.endsWith('.d.ts'), `${pkg}#types should be a .d.ts file but got "${json.types}"`);
}
softAssert(json.publishConfig && json.publishConfig.access === 'public', `${pkg} has missing or incorrect publishConfig`);
softAssert.equal(json.license, 'Apache-2.0', `${pkg} has an incorrect license`);
softAssert.deepEqual(json.repository, {type: 'git', url: 'https://github.com/adobe-private/react-spectrum-v3'}, `${pkg} has incorrect or missing repository url`);
}
for (let pkg of packages) {
let json = JSON.parse(fs.readFileSync(pkg));
let [scope, basename] = json.name.split('/');
if (basename.includes('utils')) {
continue;
}
if (scope === '@react-spectrum') {
let aria = `@react-aria/${basename}`;
let stately = `@react-stately/${basename}`;
let types = `@react-types/${basename}`;
softAssert(!pkgNames[aria] || json.dependencies[aria], `${pkg} is missing a dependency on ${aria}`);
softAssert(!pkgNames[stately] || json.dependencies[stately], `${pkg} is missing a dependency on ${stately}`);
softAssert(!pkgNames[types] || json.dependencies[types], `${pkg} is missing a dependency on ${types}`);
} else if (scope === '@react-aria') {
let stately = `@react-stately/${basename}`;
let types = `@react-types/${basename}`;
softAssert(!pkgNames[stately] || json.dependencies[stately], `${pkg} is missing a dependency on ${stately}`);
softAssert(!pkgNames[types] || json.dependencies[types], `${pkg} is missing a dependency on ${types}`);
} else if (scope === '@react-stately') {
let types = `@react-types/${basename}`;
softAssert(!pkgNames[types] || json.dependencies[types], `${pkg} is missing a dependency on ${types}`);
}
}
if (errors) {
return process.exit(1);
}