regexcss 0.1.0
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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/generator-D6K3x9Hv.mjs +174 -0
- package/dist/generator-D6K3x9Hv.mjs.map +1 -0
- package/dist/helpers.d.mts +34 -0
- package/dist/helpers.mjs +50 -0
- package/dist/helpers.mjs.map +1 -0
- package/dist/index.d.mts +13 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/preset.d.mts +118 -0
- package/dist/preset.mjs +379 -0
- package/dist/preset.mjs.map +1 -0
- package/dist/types-jVjPo8bk.d.mts +137 -0
- package/dist/vite.d.mts +11 -0
- package/dist/vite.mjs +185 -0
- package/dist/vite.mjs.map +1 -0
- package/package.json +72 -0
package/dist/vite.mjs
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { t as createGenerator } from "./generator-D6K3x9Hv.mjs";
|
|
2
|
+
import { extname, resolve } from "node:path";
|
|
3
|
+
import { loadConfig } from "unconfig";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { glob } from "tinyglobby";
|
|
6
|
+
//#region src/config/load.ts
|
|
7
|
+
const loadUserConfig = async (cwd) => {
|
|
8
|
+
const result = await loadConfig({
|
|
9
|
+
sources: [{
|
|
10
|
+
files: "regexcss.config",
|
|
11
|
+
extensions: [
|
|
12
|
+
"ts",
|
|
13
|
+
"mts",
|
|
14
|
+
"js",
|
|
15
|
+
"mjs",
|
|
16
|
+
"cjs"
|
|
17
|
+
]
|
|
18
|
+
}],
|
|
19
|
+
cwd,
|
|
20
|
+
merge: false
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
config: result.config,
|
|
24
|
+
sources: result.sources
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/extractor/scan.ts
|
|
29
|
+
const resolveFiles = async (content, cwd) => {
|
|
30
|
+
if (content.include.length === 0) return [];
|
|
31
|
+
return glob(content.include.map((p) => resolve(cwd, p)), {
|
|
32
|
+
absolute: true,
|
|
33
|
+
ignore: (content.exclude ?? []).map((p) => resolve(cwd, p))
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const SCAN_CONCURRENCY = 32;
|
|
37
|
+
const scanFiles = async (files, extract) => {
|
|
38
|
+
const tokens = /* @__PURE__ */ new Set();
|
|
39
|
+
let next = 0;
|
|
40
|
+
const worker = async () => {
|
|
41
|
+
while (true) {
|
|
42
|
+
const file = files[next++];
|
|
43
|
+
if (file === void 0) break;
|
|
44
|
+
const code = await readFile(file, "utf8");
|
|
45
|
+
for (const token of extract(code)) tokens.add(token);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const workers = Array.from({ length: Math.min(SCAN_CONCURRENCY, files.length) }, worker);
|
|
49
|
+
await Promise.all(workers);
|
|
50
|
+
return tokens;
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/plugin/vite.ts
|
|
54
|
+
const VIRTUAL_ID = "virtual:regexcss.css";
|
|
55
|
+
const RESOLVED_ID = `\0${VIRTUAL_ID}`;
|
|
56
|
+
const CSS_IMPORT_RE = /@import\s+["']regexcss["'](?:\s+layer\(([^)]+)\))?;?/g;
|
|
57
|
+
const CONTENT_EXTENSIONS = new Set([
|
|
58
|
+
".html",
|
|
59
|
+
".htm",
|
|
60
|
+
".ts",
|
|
61
|
+
".tsx",
|
|
62
|
+
".js",
|
|
63
|
+
".jsx",
|
|
64
|
+
".mjs",
|
|
65
|
+
".cjs",
|
|
66
|
+
".vue",
|
|
67
|
+
".svelte",
|
|
68
|
+
".astro",
|
|
69
|
+
".md",
|
|
70
|
+
".mdx"
|
|
71
|
+
]);
|
|
72
|
+
const SCAN_TTL_MS = 50;
|
|
73
|
+
function regexcss(options = {}) {
|
|
74
|
+
let root = process.cwd();
|
|
75
|
+
let generator;
|
|
76
|
+
let tokens = /* @__PURE__ */ new Set();
|
|
77
|
+
let configSources = [];
|
|
78
|
+
let server;
|
|
79
|
+
let lastScanAt = 0;
|
|
80
|
+
const invalidateScanCache = () => {
|
|
81
|
+
lastScanAt = 0;
|
|
82
|
+
};
|
|
83
|
+
const rescanTokens = async () => {
|
|
84
|
+
if (!generator) return;
|
|
85
|
+
if (Date.now() - lastScanAt < SCAN_TTL_MS) return;
|
|
86
|
+
tokens = await scanFiles(await resolveFiles(generator.config.content, root), generator.config.extractor);
|
|
87
|
+
lastScanAt = Date.now();
|
|
88
|
+
};
|
|
89
|
+
const buildGenerator = async () => {
|
|
90
|
+
let userConfig = options.config;
|
|
91
|
+
if (!userConfig) {
|
|
92
|
+
const loaded = await loadUserConfig(root);
|
|
93
|
+
userConfig = loaded.config;
|
|
94
|
+
configSources = loaded.sources;
|
|
95
|
+
}
|
|
96
|
+
if (!userConfig) {
|
|
97
|
+
generator = void 0;
|
|
98
|
+
tokens = /* @__PURE__ */ new Set();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
generator = createGenerator(userConfig);
|
|
102
|
+
invalidateScanCache();
|
|
103
|
+
await rescanTokens();
|
|
104
|
+
};
|
|
105
|
+
const invalidateVirtual = () => {
|
|
106
|
+
if (!server) return;
|
|
107
|
+
const seen = /* @__PURE__ */ new Set();
|
|
108
|
+
const ts = Date.now();
|
|
109
|
+
for (const id of [RESOLVED_ID, VIRTUAL_ID]) {
|
|
110
|
+
const mod = server.moduleGraph.getModuleById(id);
|
|
111
|
+
if (mod) server.moduleGraph.invalidateModule(mod, seen, ts, true);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
name: "regexcss",
|
|
116
|
+
enforce: "pre",
|
|
117
|
+
async configResolved(c) {
|
|
118
|
+
root = c.root;
|
|
119
|
+
await buildGenerator();
|
|
120
|
+
},
|
|
121
|
+
configureServer(s) {
|
|
122
|
+
server = s;
|
|
123
|
+
},
|
|
124
|
+
resolveId(id) {
|
|
125
|
+
if (id === VIRTUAL_ID) return RESOLVED_ID;
|
|
126
|
+
},
|
|
127
|
+
async load(id) {
|
|
128
|
+
if (id !== RESOLVED_ID) return void 0;
|
|
129
|
+
if (!generator) return "/* regexcss: no config loaded */";
|
|
130
|
+
await rescanTokens();
|
|
131
|
+
const { css } = await generator.generate(tokens);
|
|
132
|
+
for (const source of configSources) this.addWatchFile(source);
|
|
133
|
+
const files = await resolveFiles(generator.config.content, root);
|
|
134
|
+
for (const file of files) this.addWatchFile(file);
|
|
135
|
+
return css;
|
|
136
|
+
},
|
|
137
|
+
async transform(code, id) {
|
|
138
|
+
if (id === RESOLVED_ID) return null;
|
|
139
|
+
if (!id.endsWith(".css")) return null;
|
|
140
|
+
if (id.includes("/node_modules/")) return null;
|
|
141
|
+
if (!generator) return null;
|
|
142
|
+
if (!CSS_IMPORT_RE.test(code)) return null;
|
|
143
|
+
CSS_IMPORT_RE.lastIndex = 0;
|
|
144
|
+
await rescanTokens();
|
|
145
|
+
for (const source of configSources) this.addWatchFile(source);
|
|
146
|
+
const files = await resolveFiles(generator.config.content, root);
|
|
147
|
+
for (const file of files) this.addWatchFile(file);
|
|
148
|
+
const blocks = /* @__PURE__ */ new Map();
|
|
149
|
+
const matches = [...code.matchAll(CSS_IMPORT_RE)];
|
|
150
|
+
CSS_IMPORT_RE.lastIndex = 0;
|
|
151
|
+
for (const m of matches) {
|
|
152
|
+
const key = m[1]?.trim().replace(/^["']|["']$/g, "");
|
|
153
|
+
if (blocks.has(key)) continue;
|
|
154
|
+
const { css } = await generator.generate(tokens, key !== void 0 ? { layerName: key } : void 0);
|
|
155
|
+
blocks.set(key, css);
|
|
156
|
+
}
|
|
157
|
+
CSS_IMPORT_RE.lastIndex = 0;
|
|
158
|
+
const withoutImports = code.replace(CSS_IMPORT_RE, "");
|
|
159
|
+
const generated = [...blocks.values()].filter((css) => css.length > 0).join("\n\n");
|
|
160
|
+
return {
|
|
161
|
+
code: generated ? `${withoutImports.trimEnd()}\n\n${generated}\n` : withoutImports,
|
|
162
|
+
map: null
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
async handleHotUpdate(ctx) {
|
|
166
|
+
if (!generator) return void 0;
|
|
167
|
+
if (configSources.includes(ctx.file)) {
|
|
168
|
+
await buildGenerator();
|
|
169
|
+
invalidateVirtual();
|
|
170
|
+
ctx.server.ws.send({ type: "full-reload" });
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
const ext = extname(ctx.file);
|
|
174
|
+
if (!CONTENT_EXTENSIONS.has(ext)) return void 0;
|
|
175
|
+
invalidateScanCache();
|
|
176
|
+
invalidateVirtual();
|
|
177
|
+
ctx.server.ws.send({ type: "full-reload" });
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//#endregion
|
|
183
|
+
export { regexcss as default };
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=vite.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.mjs","names":[],"sources":["../src/config/load.ts","../src/extractor/scan.ts","../src/plugin/vite.ts"],"sourcesContent":["import { loadConfig } from \"unconfig\";\nimport type { UserConfig } from \"../types.ts\";\n\nexport interface LoadedConfig {\n config: UserConfig | undefined;\n sources: string[];\n}\n\nexport const loadUserConfig = async (cwd: string): Promise<LoadedConfig> => {\n const result = await loadConfig<UserConfig>({\n sources: [\n {\n files: \"regexcss.config\",\n extensions: [\"ts\", \"mts\", \"js\", \"mjs\", \"cjs\"],\n },\n ],\n cwd,\n merge: false,\n });\n return {\n config: result.config,\n sources: result.sources,\n };\n};\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { glob } from \"tinyglobby\";\nimport type { ContentConfig } from \"../types.ts\";\n\nexport const resolveFiles = async (content: ContentConfig, cwd: string): Promise<string[]> => {\n if (content.include.length === 0) return [];\n const patterns = content.include.map((p) => resolve(cwd, p));\n const ignore = (content.exclude ?? []).map((p) => resolve(cwd, p));\n return glob(patterns, {\n absolute: true,\n ignore,\n });\n};\n\n// Cap on concurrent file reads. Unbounded `Promise.all` over a large source\n// tree keeps every pending read's buffer alive at once (and risks EMFILE), so a\n// rolling pool of workers claims files from a shared cursor instead — keeping at\n// most SCAN_CONCURRENCY reads in flight regardless of how many files match.\nconst SCAN_CONCURRENCY = 32;\n\nexport const scanFiles = async (files: string[], extract: (code: string) => Iterable<string>): Promise<Set<string>> => {\n const tokens = new Set<string>();\n let next = 0;\n\n const worker = async (): Promise<void> => {\n while (true) {\n const file = files[next++];\n if (file === undefined) break; // past the end (also satisfies noUncheckedIndexedAccess)\n const code = await readFile(file, \"utf8\");\n for (const token of extract(code)) tokens.add(token);\n }\n };\n\n const workers = Array.from({ length: Math.min(SCAN_CONCURRENCY, files.length) }, worker);\n await Promise.all(workers);\n return tokens;\n};\n","import { extname } from \"node:path\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { loadUserConfig } from \"../config/load.ts\";\nimport { createGenerator } from \"../core/generator.ts\";\nimport { resolveFiles, scanFiles } from \"../extractor/scan.ts\";\nimport type { Generator, UserConfig } from \"../types.ts\";\n\nconst VIRTUAL_ID = \"virtual:regexcss.css\";\nconst RESOLVED_ID = `\\0${VIRTUAL_ID}`;\n\n// CSS @import pattern with optional `layer(name)`:\n// @import \"regexcss\";\n// @import \"regexcss\" layer(website.utilities);\n// @import \"regexcss\" layer(\"website.utilities\");\n// (Tailwind v4 style — embeds generated CSS directly inside a user CSS file.)\nconst CSS_IMPORT_RE = /@import\\s+[\"']regexcss[\"'](?:\\s+layer\\(([^)]+)\\))?;?/g;\n\nconst CONTENT_EXTENSIONS = new Set([\n \".html\",\n \".htm\",\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".vue\",\n \".svelte\",\n \".astro\",\n \".md\",\n \".mdx\",\n]);\n\nexport interface PluginOptions {\n config?: UserConfig;\n}\n\n// Short TTL for the token scan cache. Within the same request lifecycle the\n// transform + load hooks can both call rescanTokens; this avoids redundant\n// disk reads while keeping HMR fully reactive (`invalidateScanCache()` is\n// called from `handleHotUpdate` whenever content/config changes).\nconst SCAN_TTL_MS = 50;\n\nexport default function regexcss(options: PluginOptions = {}): Plugin {\n let root = process.cwd();\n let generator: Generator | undefined;\n let tokens: Set<string> = new Set();\n let configSources: string[] = [];\n let server: ViteDevServer | undefined;\n let lastScanAt = 0;\n\n const invalidateScanCache = (): void => {\n lastScanAt = 0;\n };\n\n const rescanTokens = async (): Promise<void> => {\n if (!generator) return;\n if (Date.now() - lastScanAt < SCAN_TTL_MS) return;\n const files = await resolveFiles(generator.config.content, root);\n tokens = await scanFiles(files, generator.config.extractor);\n lastScanAt = Date.now();\n };\n\n const buildGenerator = async (): Promise<void> => {\n let userConfig: UserConfig | undefined = options.config;\n if (!userConfig) {\n const loaded = await loadUserConfig(root);\n userConfig = loaded.config;\n configSources = loaded.sources;\n }\n if (!userConfig) {\n generator = undefined;\n tokens = new Set();\n return;\n }\n generator = createGenerator(userConfig);\n invalidateScanCache();\n await rescanTokens();\n };\n\n const invalidateVirtual = (): void => {\n if (!server) return;\n const seen = new Set<unknown>();\n const ts = Date.now();\n for (const id of [RESOLVED_ID, VIRTUAL_ID]) {\n const mod = server.moduleGraph.getModuleById(id);\n if (mod) {\n // (mod, seen?, timestamp?, isHmr?)\n server.moduleGraph.invalidateModule(mod, seen as Set<never>, ts, true);\n }\n }\n };\n\n return {\n name: \"regexcss\",\n enforce: \"pre\",\n\n async configResolved(c) {\n root = c.root;\n await buildGenerator();\n },\n\n configureServer(s) {\n server = s;\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n return undefined;\n },\n\n async load(id) {\n if (id !== RESOLVED_ID) return undefined;\n if (!generator) return \"/* regexcss: no config loaded */\";\n // dev でも build でも load 時は常に最新スキャン\n await rescanTokens();\n const { css } = await generator.generate(tokens);\n for (const source of configSources) this.addWatchFile(source);\n // include で解決した全ファイルを明示的に watch\n // (root 外のファイルは Vite 標準 watcher 範囲外のため必須)\n const files = await resolveFiles(generator.config.content, root);\n for (const file of files) this.addWatchFile(file);\n return css;\n },\n\n // CSS @import \"regexcss\"; を実 CSS に inline 展開(Tailwind v4 風)\n // `layer(name)` 構文に対応:CSS 側で指定された name は config.layerName を上書き\n async transform(code, id) {\n if (id === RESOLVED_ID) return null;\n if (!id.endsWith(\".css\")) return null;\n if (id.includes(\"/node_modules/\")) return null;\n if (!generator) return null;\n if (!CSS_IMPORT_RE.test(code)) return null;\n CSS_IMPORT_RE.lastIndex = 0;\n\n await rescanTokens();\n for (const source of configSources) this.addWatchFile(source);\n const files = await resolveFiles(generator.config.content, root);\n for (const file of files) this.addWatchFile(file);\n\n // 同一ファイル内に複数の @import がある場合も layer 別に1度だけ generate\n const blocks = new Map<string | undefined, string>();\n const matches = [...code.matchAll(CSS_IMPORT_RE)];\n CSS_IMPORT_RE.lastIndex = 0;\n for (const m of matches) {\n const key = m[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n if (blocks.has(key)) continue;\n const { css } = await generator.generate(tokens, key !== undefined ? { layerName: key } : undefined);\n blocks.set(key, css);\n }\n\n // 生成CSSは「その場」ではなくファイル末尾(= 全 @import の後ろ)へ差し込む。\n // インライン展開だと、後続の `@import` が生成済みの実ルールより後ろに押し出され、\n // 「@import は @charset / @layer 文以外の全ルールより前」という CSS 仕様に反して\n // Lightning CSS が `@import rules must precede all rules ...` で落ちるため。\n // layer 指定時のカスケード順は冒頭の `@layer name, ...;` 宣言で確定するので、\n // 生成ブロックの物理位置には依存しない。\n CSS_IMPORT_RE.lastIndex = 0;\n const withoutImports = code.replace(CSS_IMPORT_RE, \"\");\n const generated = [...blocks.values()].filter((css) => css.length > 0).join(\"\\n\\n\");\n const out = generated ? `${withoutImports.trimEnd()}\\n\\n${generated}\\n` : withoutImports;\n return { code: out, map: null };\n },\n\n async handleHotUpdate(ctx) {\n if (!generator) return undefined;\n\n if (configSources.includes(ctx.file)) {\n await buildGenerator();\n invalidateVirtual();\n ctx.server.ws.send({ type: \"full-reload\" });\n return [];\n }\n\n const ext = extname(ctx.file);\n if (!CONTENT_EXTENSIONS.has(ext)) return undefined;\n\n invalidateScanCache();\n invalidateVirtual();\n ctx.server.ws.send({ type: \"full-reload\" });\n return [];\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "regexcss",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Minimal, user-defined CSS utility library inspired by UnoCSS/Tailwind",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"atomic-css",
|
|
7
|
+
"css",
|
|
8
|
+
"lightningcss",
|
|
9
|
+
"tailwind",
|
|
10
|
+
"unocss",
|
|
11
|
+
"utility",
|
|
12
|
+
"vite-plugin"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/maekoya/regexcss#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/maekoya/regexcss/issues"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "maekoya <maekoya@stromatolite.jp>",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/maekoya/regexcss.git"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"type": "module",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"types": "./dist/index.d.mts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": "./dist/index.mjs",
|
|
34
|
+
"./helpers": "./dist/helpers.mjs",
|
|
35
|
+
"./preset": "./dist/preset.mjs",
|
|
36
|
+
"./vite": "./dist/vite.mjs",
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"tinyglobby": "^0.2.17",
|
|
44
|
+
"unconfig": "^7.5.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^20",
|
|
48
|
+
"bumpp": "^11.1.0",
|
|
49
|
+
"typescript": "6.0.3",
|
|
50
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@0.1.24",
|
|
51
|
+
"vite-plus": "0.1.24",
|
|
52
|
+
"vitest": "npm:@voidzero-dev/vite-plus-test@0.1.24"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"vite": "^8"
|
|
56
|
+
},
|
|
57
|
+
"peerDependenciesMeta": {
|
|
58
|
+
"vite": {
|
|
59
|
+
"optional": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"engines": {
|
|
63
|
+
"node": ">=20"
|
|
64
|
+
},
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "vp pack",
|
|
67
|
+
"dev": "vp pack --watch",
|
|
68
|
+
"test": "vp test",
|
|
69
|
+
"typecheck": "tsc --noEmit",
|
|
70
|
+
"release": "bumpp"
|
|
71
|
+
}
|
|
72
|
+
}
|