@rebuildjs/tailwindcss 0.1.0 → 0.1.2

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.
package/package.json CHANGED
@@ -1,66 +1,67 @@
1
1
  {
2
- "name": "@rebuildjs/tailwindcss",
3
- "version": "0.1.0",
4
- "description": "Tailwindcss integration with rebuildjs",
5
- "keywords": [
6
- "tailwindcss",
7
- "reactive",
8
- "multi page apps",
9
- "web app",
10
- "web server",
11
- "esbuild",
12
- "rmemo",
13
- "ctx-core"
14
- ],
15
- "homepage": "https://github.com/rebuildjs/tailwindcss#readme",
16
- "bugs": {
17
- "url": "https://github.com/rebuildjs/tailwindcss/issues"
18
- },
19
- "repository": {
20
- "type": "git",
21
- "url": "https://github.com/rebuildjs/tailwindcss.git"
22
- },
23
- "license": "Apache-2.0",
24
- "author": "Brian Takita",
25
- "type": "module",
26
- "files": [
27
- "*.d.ts",
28
- "*.js",
29
- "*.json"
30
- ],
31
- "types": "./index.d.ts",
32
- "exports": {
33
- ".": "./index.js",
34
- "./package.json": "./package.json"
35
- },
36
- "scripts": {
37
- "build": ":",
38
- "clean": ":",
39
- "exec": "$@",
40
- "prepublishOnly": "pnpm clean && pnpm build && pnpm test",
41
- "test": "pnpm test:unit && pnpm test:types",
42
- "test:types": "check-dts",
43
- "test:unit": "NODE_OPTIONS=--loader=esmock tsx node_modules/uvu/bin.js . '\\.test\\.(ts|js)$'",
44
- "test:unit:coverage": "c8 pnpm test:unit"
45
- },
46
- "dependencies": {
47
- "ctx-core": "^5.10.0",
48
- "esbuild": "^0.19.11",
49
- "postcss": "^8.4.32",
50
- "rebuildjs": "^0.29.1",
51
- "tailwindcss": "^3.4.0"
52
- },
53
- "devDependencies": {
54
- "c8": "^8.0.1",
55
- "check-dts": "^0.7.2",
56
- "esmock": "^2.6.0",
57
- "tsx": "^4.7.0",
58
- "typescript": "next",
59
- "uvu": "^0.5.6"
60
- },
61
- "publishConfig": {
62
- "access": "public",
63
- "cache": "~/.npm"
64
- },
65
- "sideEffects": false
66
- }
2
+ "name": "@rebuildjs/tailwindcss",
3
+ "version": "0.1.2",
4
+ "description": "Tailwindcss integration with rebuildjs",
5
+ "keywords": [
6
+ "tailwindcss",
7
+ "reactive",
8
+ "multi page apps",
9
+ "web app",
10
+ "web server",
11
+ "esbuild",
12
+ "rmemo",
13
+ "ctx-core"
14
+ ],
15
+ "homepage": "https://github.com/rebuildjs/tailwindcss#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/rebuildjs/tailwindcss/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/rebuildjs/tailwindcss.git"
22
+ },
23
+ "license": "Apache-2.0",
24
+ "author": "Brian Takita",
25
+ "type": "module",
26
+ "files": [
27
+ "*.d.ts",
28
+ "*.js",
29
+ "*.json",
30
+ "rebuild_tailwind_plugin"
31
+ ],
32
+ "types": "./index.d.ts",
33
+ "exports": {
34
+ ".": "./index.js",
35
+ "./package.json": "./package.json"
36
+ },
37
+ "dependencies": {
38
+ "ctx-core": "^5.10.0",
39
+ "esbuild": "^0.19.11",
40
+ "postcss": "^8.4.32",
41
+ "rebuildjs": "^0.29.1",
42
+ "tailwindcss": "^3.4.0"
43
+ },
44
+ "devDependencies": {
45
+ "c8": "^8.0.1",
46
+ "check-dts": "^0.7.2",
47
+ "esmock": "^2.6.0",
48
+ "relementjs": "^0.39.0",
49
+ "tsx": "^4.7.0",
50
+ "typescript": "next",
51
+ "uvu": "^0.5.6"
52
+ },
53
+ "publishConfig": {
54
+ "access": "public",
55
+ "cache": "~/.npm"
56
+ },
57
+ "sideEffects": false,
58
+ "scripts": {
59
+ "build": ":",
60
+ "clean": ":",
61
+ "exec": "$@",
62
+ "test": "pnpm test:unit && pnpm test:types",
63
+ "test:types": "check-dts",
64
+ "test:unit": "NODE_OPTIONS=--loader=esmock tsx node_modules/uvu/bin.js . '\\.test\\.(ts|js)$'",
65
+ "test:unit:coverage": "c8 pnpm test:unit"
66
+ }
67
+ }
@@ -0,0 +1,8 @@
1
+ import type { Plugin } from 'esbuild'
2
+ import type { ctx__be_T, ctx__get_T, ctx__set_T, has_app_T, sig_T } from 'rebuildjs'
3
+ export declare const rebuild_tailwind_plugin__build_id$_:ctx__be_T<has_app_T, sig_T<string|undefined>, 'app'>
4
+ export declare const rebuild_tailwind_plugin__build_id_:ctx__get_T<has_app_T, string|undefined>
5
+ export declare const rebuild_tailwind_plugin__build_id__set:ctx__set_T<has_app_T, string|undefined>
6
+ export declare const rebuild_tailwind_plugin__ready$_:ctx__be_T<has_app_T, sig_T<boolean>, 'app'>
7
+ export declare const rebuild_tailwind_plugin__ready_:ctx__get_T<has_app_T, boolean>
8
+ export declare function rebuild_tailwind_plugin_():Plugin
@@ -0,0 +1,136 @@
1
+ import { file_exists_, file_exists__waitfor } from 'ctx-core/fs'
2
+ import { Cancel, nullish__none_, run, sleep, tup } from 'ctx-core/function'
3
+ import { be, be_memo_pair_, be_sig_triple_, memo_ } from 'ctx-core/rmemo'
4
+ import { readFile, writeFile } from 'node:fs/promises'
5
+ import { join } from 'path'
6
+ import postcss from 'postcss'
7
+ import {
8
+ app_ctx,
9
+ browser__output_,
10
+ build_id_,
11
+ cwd_,
12
+ rebuildjs__build_id_,
13
+ rebuildjs__ready_,
14
+ server__output_,
15
+ server__output__relative_path_M_middleware_ctx_
16
+ } from 'rebuildjs'
17
+ import tailwind from 'tailwindcss'
18
+ export const [
19
+ rebuild_tailwind_plugin__build_id$_,
20
+ rebuild_tailwind_plugin__build_id_,
21
+ rebuild_tailwind_plugin__build_id__set,
22
+ ] = be_sig_triple_(
23
+ ()=>undefined,
24
+ { id: 'rebuild_tailwind_plugin__build_id', ns: 'app' })
25
+ export const [
26
+ rebuild_tailwind_plugin__ready$_,
27
+ rebuild_tailwind_plugin__ready_,
28
+ ] = be_memo_pair_(ctx=>
29
+ !!(
30
+ build_id_(ctx)
31
+ && rebuildjs__ready_(ctx)
32
+ && build_id_(ctx) === rebuild_tailwind_plugin__build_id_(ctx)),
33
+ { id: 'rebuild_tailwind_plugin__ready', ns: 'app' })
34
+ export function rebuild_tailwind_plugin_() {
35
+ return { name: 'rebuild_tailwind_plugin', setup: setup_() }
36
+ function setup_() {
37
+ /**
38
+ * @param {import('esbuild').PluginBuild}build
39
+ */
40
+ const setup = (build)=>{
41
+ build.onEnd(result=>{
42
+ if (result.errors.length) {
43
+ throw new Error(`Build errors: ${result.errors.length} errors`)
44
+ }
45
+ })
46
+ }
47
+ setup.tailwind__build$ = tailwind__build$_()
48
+ return setup
49
+ function tailwind__build$_() {
50
+ return be(app_ctx, ctx=>
51
+ run(memo_(tailwind__build$=>{
52
+ r()
53
+ return tailwind__build$
54
+ function r() {
55
+ if (!rebuildjs__ready_(ctx)) return
56
+ nullish__none_(tup(
57
+ build_id_(ctx),
58
+ rebuildjs__build_id_(ctx),
59
+ server__output__relative_path_M_middleware_ctx_(app_ctx),
60
+ ), async (
61
+ build_id,
62
+ rebuildjs__build_id,
63
+ server__output__relative_path_M_middleware_ctx,
64
+ )=>{
65
+ try {
66
+ for (const middleware_ctx of server__output__relative_path_M_middleware_ctx.values()) {
67
+ await output__process(server__output_(middleware_ctx))
68
+ await output__process(browser__output_(middleware_ctx))
69
+ }
70
+ rebuild_tailwind_plugin__build_id__set(ctx, build_id)
71
+ } catch (err) {
72
+ if (err instanceof Cancel) return
73
+ throw err
74
+ }
75
+ /**
76
+ * @param {rebuildjs_metafile_T['outputs'][string]}output
77
+ * @returns {Promise<void>}
78
+ */
79
+ async function output__process(
80
+ output
81
+ ) {
82
+ const cssBundle = output?.cssBundle
83
+ if (!cssBundle) return
84
+ const cssBundle_path = join(cwd_(ctx), cssBundle)
85
+ const esbuild_cssBundle = output.esbuild_cssBundle ?? cssBundle
86
+ const esbuild_cssBundle_path = join(cwd_(ctx), esbuild_cssBundle)
87
+ await file_exists__waitfor(
88
+ esbuild_cssBundle_path,
89
+ 1000,
90
+ ()=>cmd(sleep(0)))
91
+ const esbuild_cssBundle_map_path = esbuild_cssBundle_path + '.map'
92
+ const esbuild_cssBundle_map_exists = await cmd(file_exists_(esbuild_cssBundle_map_path))
93
+ const result = await cmd(postcss([
94
+ tailwind({
95
+ content: output.cssBundle_content.map(content__relative_path=>
96
+ join(cwd_(ctx), content__relative_path))
97
+ })
98
+ ]).process(
99
+ await cmd(readFile(esbuild_cssBundle_path)),
100
+ {
101
+ from: esbuild_cssBundle_path,
102
+ to: cssBundle_path,
103
+ map: esbuild_cssBundle_map_exists
104
+ ? {
105
+ prev: JSON.parse(await cmd(readFile(esbuild_cssBundle_path + '.map')))
106
+ }
107
+ : false,
108
+ }))
109
+ await cmd(writeFile(cssBundle_path, result.css))
110
+ if (result.map) {
111
+ await cmd(writeFile(cssBundle_path + '.map', JSON.stringify(result.map)))
112
+ }
113
+ }
114
+ async function cmd(promise) {
115
+ if (cancel_()) throw new Cancel()
116
+ const rv = await promise
117
+ if (cancel_()) {
118
+ promise.cancel?.()
119
+ throw new Cancel()
120
+ }
121
+ return rv
122
+ }
123
+ function cancel_() {
124
+ return (
125
+ build_id_(ctx) !== build_id
126
+ || rebuildjs__build_id_(ctx) !== rebuildjs__build_id
127
+ || server__output__relative_path_M_middleware_ctx_(
128
+ ctx) !== server__output__relative_path_M_middleware_ctx
129
+ )
130
+ }
131
+ })
132
+ }
133
+ })), { id: 'tailwind__build$', ns: 'app' })
134
+ }
135
+ }
136
+ }
@@ -0,0 +1,131 @@
1
+ import { BuildContext } from 'esbuild'
2
+ import { readFile } from 'fs/promises'
3
+ import { rm } from 'node:fs/promises'
4
+ import { dirname, join } from 'path'
5
+ import {
6
+ app_ctx,
7
+ browser__build,
8
+ browser__metafile_,
9
+ browser__metafile__set,
10
+ build_id__set,
11
+ ctx_,
12
+ cwd_,
13
+ cwd__set,
14
+ rebuildjs__build_id__set,
15
+ rebuildjs__ready_,
16
+ rebuildjs__ready__wait,
17
+ rmemo__wait,
18
+ server__build,
19
+ server__metafile_,
20
+ server__metafile__set
21
+ } from 'rebuildjs'
22
+ import { test } from 'uvu'
23
+ import { equal, throws } from 'uvu/assert'
24
+ import { browser__metafile0, server__metafile0 } from '../_fixtures/metafiles.js'
25
+ import {
26
+ rebuild_tailwind_plugin_,
27
+ rebuild_tailwind_plugin__build_id$_,
28
+ rebuild_tailwind_plugin__build_id_,
29
+ rebuild_tailwind_plugin__build_id__set,
30
+ rebuild_tailwind_plugin__ready$_,
31
+ rebuild_tailwind_plugin__ready_
32
+ } from './index.js'
33
+ test.after.each(()=>{
34
+ app_ctx.s.app.clear()
35
+ })
36
+ test('rebuild_tailwind_plugin__build_id', ()=>{
37
+ equal(rebuild_tailwind_plugin__build_id$_(app_ctx)(), undefined)
38
+ equal(rebuild_tailwind_plugin__build_id_(app_ctx), undefined)
39
+ rebuild_tailwind_plugin__build_id__set(app_ctx, 'test_build_id')
40
+ equal(rebuild_tailwind_plugin__build_id$_(app_ctx)(), 'test_build_id')
41
+ equal(rebuild_tailwind_plugin__build_id_(app_ctx), 'test_build_id')
42
+ // @ts-expect-error TS2345
43
+ throws(()=>rebuild_tailwind_plugin__build_id$_(ctx_()))
44
+ // @ts-expect-error TS2345
45
+ throws(()=>rebuild_tailwind_plugin__build_id_(ctx_()))
46
+ })
47
+ test('rebuild_tailwind_plugin__ready', ()=>{
48
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), false)
49
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), false)
50
+ const build_id = server__metafile0.build_id!
51
+ build_id__set(app_ctx, build_id)
52
+ equal(rebuildjs__ready_(app_ctx), false)
53
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), false)
54
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), false)
55
+ server__metafile__set(app_ctx, server__metafile0)
56
+ equal(rebuildjs__ready_(app_ctx), false)
57
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), false)
58
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), false)
59
+ browser__metafile__set(app_ctx, browser__metafile0)
60
+ equal(rebuildjs__ready_(app_ctx), false)
61
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), false)
62
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), false)
63
+ rebuildjs__build_id__set(app_ctx, build_id)
64
+ equal(rebuildjs__ready_(app_ctx), true)
65
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), false)
66
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), false)
67
+ rebuild_tailwind_plugin__build_id__set(app_ctx, build_id)
68
+ equal(rebuildjs__ready_(app_ctx), true)
69
+ equal(rebuild_tailwind_plugin__ready$_(app_ctx)(), true)
70
+ equal(rebuild_tailwind_plugin__ready_(app_ctx), true)
71
+ })
72
+ test('rebuild_tailwind_plugin_', async ()=>{
73
+ const test_dir = dirname(new URL(import.meta.url).pathname)
74
+ const cwd = join(test_dir, '../_fixtures')
75
+ cwd__set(app_ctx, cwd)
76
+ await rm(join(cwd, 'dist'), { recursive: true, force: true })
77
+ let server__build_context:BuildContext|undefined = undefined
78
+ let browser__build_context:BuildContext|undefined = undefined
79
+ try {
80
+ const rebuild_tailwind_plugin = rebuild_tailwind_plugin_()
81
+ server__build_context = await server__build({ plugins: [rebuild_tailwind_plugin] })
82
+ browser__build_context = await browser__build({ plugins: [rebuild_tailwind_plugin] })
83
+ await rebuildjs__ready__wait()
84
+ const server__metafile = server__metafile_(app_ctx)!
85
+ const server__output__relative_path =
86
+ Object.keys(server__metafile.outputs)
87
+ .find(server__output__relative_path=>
88
+ server__metafile.outputs[server__output__relative_path].entryPoint)!
89
+ const server__entryPoint__output =
90
+ server__metafile.outputs[server__output__relative_path]
91
+ const browser__metafile = browser__metafile_(app_ctx)!
92
+ const browser__output__relative_path =
93
+ Object.keys(browser__metafile.outputs)
94
+ .find(browser__output__relative_path=>
95
+ browser__metafile.outputs[browser__output__relative_path].entryPoint)!
96
+ const browser__entryPoint__output =
97
+ browser__metafile.outputs[browser__output__relative_path]
98
+ equal(typeof server__entryPoint__output.cssBundle, 'string')
99
+ equal(typeof browser__entryPoint__output.cssBundle, 'string')
100
+ equal(typeof server__entryPoint__output.esbuild_cssBundle, 'string')
101
+ equal(typeof browser__entryPoint__output.esbuild_cssBundle, 'string')
102
+ equal(server__entryPoint__output.cssBundle !== server__entryPoint__output.esbuild_cssBundle, true)
103
+ equal(browser__entryPoint__output.cssBundle !== browser__entryPoint__output.esbuild_cssBundle, true)
104
+ await rmemo__wait(rebuild_tailwind_plugin__ready$_(app_ctx), $=>$, 2000)
105
+ const cssBundle_text =
106
+ await readFile(join(cwd_(app_ctx), server__entryPoint__output.cssBundle!))
107
+ .then(buf=>buf + '')
108
+ const esbuild_cssBundle_text =
109
+ await readFile(join(cwd_(app_ctx), server__entryPoint__output.esbuild_cssBundle!))
110
+ .then(buf=>buf + '')
111
+ equal(cssBundle_text.includes('@tailwind base;'), false)
112
+ equal(cssBundle_text.includes('@tailwind components;'), false)
113
+ equal(cssBundle_text.includes('@tailwind utilities;'), false)
114
+ equal(cssBundle_text.includes('.text-green-500'), true)
115
+ equal(cssBundle_text.includes('.font-bold'), true)
116
+ equal(cssBundle_text.includes('.text-red'), false)
117
+ equal(cssBundle_text.includes('.font-light'), false)
118
+ equal(esbuild_cssBundle_text.includes('@tailwind base;'), true)
119
+ equal(esbuild_cssBundle_text.includes('@tailwind components;'), true)
120
+ equal(esbuild_cssBundle_text.includes('@tailwind utilities;'), true)
121
+ equal(esbuild_cssBundle_text.includes('.text-green-500'), false)
122
+ equal(esbuild_cssBundle_text.includes('.font-bold'), false)
123
+ equal(esbuild_cssBundle_text.includes('.text-red'), false)
124
+ equal(esbuild_cssBundle_text.includes('.font-light'), false)
125
+ } finally {
126
+ await rebuildjs__ready__wait()
127
+ server__build_context?.dispose?.()
128
+ browser__build_context?.dispose?.()
129
+ }
130
+ })
131
+ test.run()