tailwindcss 0.0.0-oxide-insiders.6a2c58a → 0.0.0-oxide-insiders.439fdad

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,7 +64,9 @@ function createWatcher(args, { state , rebuild }) {
64
64
  // Clear all pending rebuilds for the about-to-be-built files
65
65
  changes.forEach((change)=>pendingRebuilds.delete(change.file));
66
66
  // Resolve the promise even when the rebuild fails
67
- return rebuild(changes).then(()=>{}, ()=>{});
67
+ return rebuild(changes).then(()=>{}, (e)=>{
68
+ console.error(e.toString());
69
+ });
68
70
  }
69
71
  /**
70
72
  *
@@ -8,56 +8,89 @@ Object.defineProperty(exports, "default", {
8
8
  });
9
9
  const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
10
10
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
11
- const _resolve = /*#__PURE__*/ _interopRequireDefault(require("resolve"));
12
- const _detectiveTypescript = /*#__PURE__*/ _interopRequireDefault(require("detective-typescript"));
13
11
  function _interopRequireDefault(obj) {
14
12
  return obj && obj.__esModule ? obj : {
15
13
  default: obj
16
14
  };
17
15
  }
18
- function createModule(file) {
19
- let source = _fs.default.readFileSync(file, "utf-8");
20
- return {
21
- file,
22
- requires: (0, _detectiveTypescript.default)(source, {
23
- mixedImports: true
24
- })
25
- };
26
- }
27
- function* _getModuleDependencies(entryFile) {
28
- yield entryFile;
29
- let mod = createModule(entryFile);
30
- let ext = _path.default.extname(entryFile);
31
- let isTypeScript = ext === ".ts" || ext === ".cts" || ext === ".mts";
32
- let extensions = [
33
- ...isTypeScript ? [
34
- ".ts",
35
- ".cts",
36
- ".mts"
37
- ] : [],
38
- ".js",
39
- ".cjs",
40
- ".mjs"
41
- ];
42
- // Iterate over the modules, even when new
43
- // ones are being added
44
- for (let dep of mod.requires){
45
- // Only track local modules, not node_modules
46
- if (!dep.startsWith("./") && !dep.startsWith("../")) {
47
- continue;
16
+ let jsExtensions = [
17
+ ".js",
18
+ ".cjs",
19
+ ".mjs"
20
+ ];
21
+ // Given the current file `a.ts`, we want to make sure that when importing `b` that we resolve
22
+ // `b.ts` before `b.js`
23
+ //
24
+ // E.g.:
25
+ //
26
+ // a.ts
27
+ // b // .ts
28
+ // c // .ts
29
+ // a.js
30
+ // b // .js or .ts
31
+ let jsResolutionOrder = [
32
+ "",
33
+ ".js",
34
+ ".cjs",
35
+ ".mjs",
36
+ ".ts",
37
+ ".cts",
38
+ ".mts",
39
+ ".jsx",
40
+ ".tsx"
41
+ ];
42
+ let tsResolutionOrder = [
43
+ "",
44
+ ".ts",
45
+ ".cts",
46
+ ".mts",
47
+ ".tsx",
48
+ ".js",
49
+ ".cjs",
50
+ ".mjs",
51
+ ".jsx"
52
+ ];
53
+ function resolveWithExtension(file, extensions) {
54
+ // Try to find `./a.ts`, `./a.ts`, ... from `./a`
55
+ for (let ext of extensions){
56
+ let full = `${file}${ext}`;
57
+ if (_fs.default.existsSync(full) && _fs.default.statSync(full).isFile()) {
58
+ return full;
48
59
  }
49
- try {
50
- let basedir = _path.default.dirname(mod.file);
51
- let depPath = _resolve.default.sync(dep, {
52
- basedir,
53
- extensions
54
- });
55
- yield* _getModuleDependencies(depPath);
56
- } catch (_err) {
57
- // eslint-disable-next-line no-empty
60
+ }
61
+ // Try to find `./a/index.js` from `./a`
62
+ for (let ext of extensions){
63
+ let full = `${file}/index${ext}`;
64
+ if (_fs.default.existsSync(full)) {
65
+ return full;
58
66
  }
59
67
  }
68
+ return null;
69
+ }
70
+ function* _getModuleDependencies(filename, base, seen, ext = _path.default.extname(filename)) {
71
+ // Try to find the file
72
+ let absoluteFile = resolveWithExtension(_path.default.resolve(base, filename), jsExtensions.includes(ext) ? jsResolutionOrder : tsResolutionOrder);
73
+ if (absoluteFile === null) return; // File doesn't exist
74
+ // Prevent infinite loops when there are circular dependencies
75
+ if (seen.has(absoluteFile)) return; // Already seen
76
+ seen.add(absoluteFile);
77
+ // Mark the file as a dependency
78
+ yield absoluteFile;
79
+ // Resolve new base for new imports/requires
80
+ base = _path.default.dirname(absoluteFile);
81
+ ext = _path.default.extname(absoluteFile);
82
+ let contents = _fs.default.readFileSync(absoluteFile, "utf-8");
83
+ // Find imports/requires
84
+ for (let match of [
85
+ ...contents.matchAll(/import[\s\S]*?['"](.{3,}?)['"]/gi),
86
+ ...contents.matchAll(/import[\s\S]*from[\s\S]*?['"](.{3,}?)['"]/gi),
87
+ ...contents.matchAll(/require\(['"`](.{3,})['"`]\)/gi)
88
+ ]){
89
+ // Bail out if it's not a relative file
90
+ if (!match[1].startsWith(".")) continue;
91
+ yield* _getModuleDependencies(match[1], base, seen, ext);
92
+ }
60
93
  }
61
- function getModuleDependencies(entryFile) {
62
- return new Set(_getModuleDependencies(entryFile));
94
+ function getModuleDependencies(absoluteFilePath) {
95
+ return new Set(_getModuleDependencies(absoluteFilePath, _path.default.dirname(absoluteFilePath), new Set()));
63
96
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailwindcss",
3
- "version": "0.0.0-oxide-insiders.6a2c58a",
3
+ "version": "0.0.0-oxide-insiders.439fdad",
4
4
  "description": "A utility-first CSS framework for rapidly building custom user interfaces.",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -70,12 +70,11 @@
70
70
  "postcss": "^8.0.9"
71
71
  },
72
72
  "dependencies": {
73
- "@tailwindcss/oxide": "0.0.0-oxide-insiders.6a2c58a",
73
+ "@tailwindcss/oxide": "0.0.0-oxide-insiders.439fdad",
74
74
  "arg": "^5.0.2",
75
75
  "browserslist": "^4.21.5",
76
76
  "chokidar": "^3.5.3",
77
77
  "color-name": "^1.1.4",
78
- "detective-typescript": "^9.0.0",
79
78
  "didyoumean": "^1.2.2",
80
79
  "dlv": "^1.1.3",
81
80
  "fast-glob": "^3.2.12",
@@ -89,7 +89,9 @@ export function createWatcher(args, { state, rebuild }) {
89
89
  // Resolve the promise even when the rebuild fails
90
90
  return rebuild(changes).then(
91
91
  () => {},
92
- () => {}
92
+ (e) => {
93
+ console.error(e.toString())
94
+ }
93
95
  )
94
96
  }
95
97
 
@@ -1,40 +1,78 @@
1
1
  import fs from 'fs'
2
2
  import path from 'path'
3
- import resolve from 'resolve'
4
- import detective from 'detective-typescript'
5
3
 
6
- function createModule(file) {
7
- let source = fs.readFileSync(file, 'utf-8')
8
- return { file, requires: detective(source, { mixedImports: true }) }
9
- }
10
-
11
- function* _getModuleDependencies(entryFile) {
12
- yield entryFile
4
+ let jsExtensions = ['.js', '.cjs', '.mjs']
13
5
 
14
- let mod = createModule(entryFile)
6
+ // Given the current file `a.ts`, we want to make sure that when importing `b` that we resolve
7
+ // `b.ts` before `b.js`
8
+ //
9
+ // E.g.:
10
+ //
11
+ // a.ts
12
+ // b // .ts
13
+ // c // .ts
14
+ // a.js
15
+ // b // .js or .ts
15
16
 
16
- let ext = path.extname(entryFile)
17
- let isTypeScript = ext === '.ts' || ext === '.cts' || ext === '.mts'
18
- let extensions = [...(isTypeScript ? ['.ts', '.cts', '.mts'] : []), '.js', '.cjs', '.mjs']
17
+ let jsResolutionOrder = ['', '.js', '.cjs', '.mjs', '.ts', '.cts', '.mts', '.jsx', '.tsx']
18
+ let tsResolutionOrder = ['', '.ts', '.cts', '.mts', '.tsx', '.js', '.cjs', '.mjs', '.jsx']
19
19
 
20
- // Iterate over the modules, even when new
21
- // ones are being added
22
- for (let dep of mod.requires) {
23
- // Only track local modules, not node_modules
24
- if (!dep.startsWith('./') && !dep.startsWith('../')) {
25
- continue
20
+ function resolveWithExtension(file, extensions) {
21
+ // Try to find `./a.ts`, `./a.ts`, ... from `./a`
22
+ for (let ext of extensions) {
23
+ let full = `${file}${ext}`
24
+ if (fs.existsSync(full) && fs.statSync(full).isFile()) {
25
+ return full
26
26
  }
27
+ }
27
28
 
28
- try {
29
- let basedir = path.dirname(mod.file)
30
- let depPath = resolve.sync(dep, { basedir, extensions })
31
- yield* _getModuleDependencies(depPath)
32
- } catch (_err) {
33
- // eslint-disable-next-line no-empty
29
+ // Try to find `./a/index.js` from `./a`
30
+ for (let ext of extensions) {
31
+ let full = `${file}/index${ext}`
32
+ if (fs.existsSync(full)) {
33
+ return full
34
34
  }
35
35
  }
36
+
37
+ return null
38
+ }
39
+
40
+ function* _getModuleDependencies(filename, base, seen, ext = path.extname(filename)) {
41
+ // Try to find the file
42
+ let absoluteFile = resolveWithExtension(
43
+ path.resolve(base, filename),
44
+ jsExtensions.includes(ext) ? jsResolutionOrder : tsResolutionOrder
45
+ )
46
+ if (absoluteFile === null) return // File doesn't exist
47
+
48
+ // Prevent infinite loops when there are circular dependencies
49
+ if (seen.has(absoluteFile)) return // Already seen
50
+ seen.add(absoluteFile)
51
+
52
+ // Mark the file as a dependency
53
+ yield absoluteFile
54
+
55
+ // Resolve new base for new imports/requires
56
+ base = path.dirname(absoluteFile)
57
+ ext = path.extname(absoluteFile)
58
+
59
+ let contents = fs.readFileSync(absoluteFile, 'utf-8')
60
+
61
+ // Find imports/requires
62
+ for (let match of [
63
+ ...contents.matchAll(/import[\s\S]*?['"](.{3,}?)['"]/gi),
64
+ ...contents.matchAll(/import[\s\S]*from[\s\S]*?['"](.{3,}?)['"]/gi),
65
+ ...contents.matchAll(/require\(['"`](.{3,})['"`]\)/gi),
66
+ ]) {
67
+ // Bail out if it's not a relative file
68
+ if (!match[1].startsWith('.')) continue
69
+
70
+ yield* _getModuleDependencies(match[1], base, seen, ext)
71
+ }
36
72
  }
37
73
 
38
- export default function getModuleDependencies(entryFile) {
39
- return new Set(_getModuleDependencies(entryFile))
74
+ export default function getModuleDependencies(absoluteFilePath) {
75
+ return new Set(
76
+ _getModuleDependencies(absoluteFilePath, path.dirname(absoluteFilePath), new Set())
77
+ )
40
78
  }