@arbor-css/postcss 0.0.59
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.md +7 -0
- package/dist/colorSystemProps.d.ts +21 -0
- package/dist/colorSystemProps.d.ts.map +1 -0
- package/dist/colorSystemProps.js +47 -0
- package/dist/colorSystemProps.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/loadConfig.d.ts +12 -0
- package/dist/loadConfig.d.ts.map +1 -0
- package/dist/loadConfig.js +36 -0
- package/dist/loadConfig.js.map +1 -0
- package/dist/loadConfig.test.d.ts +2 -0
- package/dist/loadConfig.test.d.ts.map +1 -0
- package/dist/loadConfig.test.js +40 -0
- package/dist/loadConfig.test.js.map +1 -0
- package/dist/tokenMap.d.ts +20 -0
- package/dist/tokenMap.d.ts.map +1 -0
- package/dist/tokenMap.js +58 -0
- package/dist/tokenMap.js.map +1 -0
- package/dist/transform.d.ts +15 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +64 -0
- package/dist/transform.js.map +1 -0
- package/package.json +44 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2026 Grant Forrest
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ArborPreset } from '@arbor-css/core';
|
|
2
|
+
export interface ColorPropEntry {
|
|
3
|
+
/** CSS custom property name for the applied color */
|
|
4
|
+
applied: string;
|
|
5
|
+
/** CSS custom property name for the final color (used as the actual property value) */
|
|
6
|
+
final: string;
|
|
7
|
+
/** CSS custom property name for opacity */
|
|
8
|
+
opacity: string;
|
|
9
|
+
/** Extra custom properties to inject alongside the standard three */
|
|
10
|
+
extras?: Array<{
|
|
11
|
+
prop: string;
|
|
12
|
+
/** 'applied' = use the resolved color value; otherwise treat as a literal CSS value */
|
|
13
|
+
value: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Maps CSS color-related property names to the Arbor system props they should populate.
|
|
18
|
+
* Mirrors the behavior of the `classes` package color rules.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getColorPropEntries(preset: ArborPreset): Record<string, ColorPropEntry>;
|
|
21
|
+
//# sourceMappingURL=colorSystemProps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorSystemProps.d.ts","sourceRoot":"","sources":["../src/colorSystemProps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC9B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,uFAAuF;QACvF,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,WAAW,GACjB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAyChC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps CSS color-related property names to the Arbor system props they should populate.
|
|
3
|
+
* Mirrors the behavior of the `classes` package color rules.
|
|
4
|
+
*/
|
|
5
|
+
export function getColorPropEntries(preset) {
|
|
6
|
+
const systemProps = preset.$.system;
|
|
7
|
+
return {
|
|
8
|
+
color: {
|
|
9
|
+
applied: systemProps.fg.applied.name,
|
|
10
|
+
final: systemProps.fg.$root.name,
|
|
11
|
+
opacity: systemProps.fg.opacity.name,
|
|
12
|
+
},
|
|
13
|
+
'background-color': {
|
|
14
|
+
applied: systemProps.bg.applied.name,
|
|
15
|
+
final: systemProps.bg.$root.name,
|
|
16
|
+
opacity: systemProps.bg.opacity.name,
|
|
17
|
+
extras: [{ prop: systemProps.bg.contrast.name, value: 'applied' }],
|
|
18
|
+
},
|
|
19
|
+
background: {
|
|
20
|
+
applied: systemProps.bg.applied.name,
|
|
21
|
+
final: systemProps.bg.$root.name,
|
|
22
|
+
opacity: systemProps.bg.opacity.name,
|
|
23
|
+
extras: [{ prop: systemProps.bg.contrast.name, value: 'applied' }],
|
|
24
|
+
},
|
|
25
|
+
'border-color': {
|
|
26
|
+
applied: systemProps.borderColor[''].applied.name,
|
|
27
|
+
final: systemProps.borderColor[''].$root.name,
|
|
28
|
+
opacity: systemProps.borderColor[''].opacity.name,
|
|
29
|
+
},
|
|
30
|
+
fill: {
|
|
31
|
+
applied: systemProps.fill.applied.name,
|
|
32
|
+
final: systemProps.fill.$root.name,
|
|
33
|
+
opacity: systemProps.fill.opacity.name,
|
|
34
|
+
},
|
|
35
|
+
stroke: {
|
|
36
|
+
applied: systemProps.stroke.applied.name,
|
|
37
|
+
final: systemProps.stroke.$root.name,
|
|
38
|
+
opacity: systemProps.stroke.opacity.name,
|
|
39
|
+
},
|
|
40
|
+
'accent-color': {
|
|
41
|
+
applied: systemProps.accent.applied.name,
|
|
42
|
+
final: systemProps.accent.$root.name,
|
|
43
|
+
opacity: systemProps.accent.opacity.name,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=colorSystemProps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorSystemProps.js","sourceRoot":"","sources":["../src/colorSystemProps.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAAmB;IAEnB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO;QACN,KAAK,EAAE;YACN,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;YACpC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;YAChC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;SACpC;QACD,kBAAkB,EAAE;YACnB,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;YACpC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;YAChC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;YACpC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAClE;QACD,UAAU,EAAE;YACX,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;YACpC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;YAChC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;YACpC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAClE;QACD,cAAc,EAAE;YACf,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACjD,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;YAC7C,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;SACjD;QACD,IAAI,EAAE;YACL,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YACtC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;YAClC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;SACtC;QACD,MAAM,EAAE;YACP,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;YACxC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;YACpC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;SACxC;QACD,cAAc,EAAE;YACf,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;YACxC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;YACpC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;SACxC;KACD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Plugin } from 'postcss';
|
|
2
|
+
export interface ArborPluginOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Path to the Arbor config file.
|
|
5
|
+
* If not provided, the plugin will look in the current working directory.
|
|
6
|
+
*/
|
|
7
|
+
configFile?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Working directory used to resolve the Arbor config file.
|
|
10
|
+
* Defaults to the current working directory.
|
|
11
|
+
*/
|
|
12
|
+
cwd?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function ArborPlugin(options?: ArborPluginOptions): Plugin;
|
|
15
|
+
export declare namespace ArborPlugin {
|
|
16
|
+
var postcss: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const arborCss: typeof ArborPlugin;
|
|
19
|
+
export default ArborPlugin;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAI1C,MAAM,WAAW,kBAAkB;IAClC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAUD,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,CA+GpE;yBA/Ge,WAAW;;;AAmH3B,eAAO,MAAM,QAAQ,oBAAc,CAAC;AAEpC,eAAe,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { generateStylesheet } from '@arbor-css/core';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
3
|
+
import postcss from 'postcss';
|
|
4
|
+
import { getColorPropEntries } from './colorSystemProps.js';
|
|
5
|
+
import { loadConfig } from './loadConfig.js';
|
|
6
|
+
const PLUGIN_NAME = 'arbor-css';
|
|
7
|
+
export function ArborPlugin(options = {}) {
|
|
8
|
+
const { configFile, cwd = process.cwd() } = options;
|
|
9
|
+
let cachedConfig = null;
|
|
10
|
+
let warnedAboutMissingConfig = false;
|
|
11
|
+
async function getConfig(helper) {
|
|
12
|
+
if (cachedConfig) {
|
|
13
|
+
try {
|
|
14
|
+
const currentStats = await stat(cachedConfig.configPath);
|
|
15
|
+
if (currentStats.mtimeMs === cachedConfig.mtimeMs) {
|
|
16
|
+
return cachedConfig;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
cachedConfig = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const loaded = await loadConfig({ cwd, configFile });
|
|
24
|
+
if (!loaded) {
|
|
25
|
+
cachedConfig = null;
|
|
26
|
+
if (!warnedAboutMissingConfig) {
|
|
27
|
+
helper.result.warn(`[arbor-css] No arbor.config file found in ${cwd}. The @import 'arbor:css' rule was not replaced with the generated stylesheet.`, { plugin: PLUGIN_NAME });
|
|
28
|
+
warnedAboutMissingConfig = true;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const currentStats = await stat(loaded.configPath);
|
|
33
|
+
cachedConfig = {
|
|
34
|
+
configPath: loaded.configPath,
|
|
35
|
+
preset: loaded.preset,
|
|
36
|
+
mtimeMs: currentStats.mtimeMs,
|
|
37
|
+
};
|
|
38
|
+
return cachedConfig;
|
|
39
|
+
}
|
|
40
|
+
console.log(`[arbor-css] Using config file: ${configFile ?? 'auto-detected'}`);
|
|
41
|
+
return {
|
|
42
|
+
postcssPlugin: PLUGIN_NAME,
|
|
43
|
+
async Once(root, helper) {
|
|
44
|
+
const config = await getConfig(helper);
|
|
45
|
+
if (!config) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// watch the config file for changes and re-run transforms when it changes
|
|
49
|
+
helper.result.messages.push({
|
|
50
|
+
type: 'dependency',
|
|
51
|
+
plugin: PLUGIN_NAME,
|
|
52
|
+
file: config.configPath,
|
|
53
|
+
});
|
|
54
|
+
root.walkComments((comment) => {
|
|
55
|
+
if (comment.text.trim() === 'inline-arbor-base') {
|
|
56
|
+
const generatedCss = generateStylesheet(config.preset);
|
|
57
|
+
const generatedRoot = postcss.parse(generatedCss);
|
|
58
|
+
comment.replaceWith(...generatedRoot.nodes);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
async Declaration(decl, helper) {
|
|
63
|
+
const config = await getConfig(helper);
|
|
64
|
+
if (!config) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const colorPropEntries = getColorPropEntries(config.preset);
|
|
68
|
+
const systemAssignmentEntry = colorPropEntries[decl.prop];
|
|
69
|
+
if (systemAssignmentEntry) {
|
|
70
|
+
// Inject system color props before this declaration
|
|
71
|
+
decl.cloneBefore({
|
|
72
|
+
prop: systemAssignmentEntry.applied,
|
|
73
|
+
value: decl.value,
|
|
74
|
+
raws: {},
|
|
75
|
+
});
|
|
76
|
+
decl.cloneBefore({
|
|
77
|
+
prop: systemAssignmentEntry.final,
|
|
78
|
+
value: `var(${systemAssignmentEntry.applied})`,
|
|
79
|
+
raws: {},
|
|
80
|
+
});
|
|
81
|
+
decl.cloneBefore({
|
|
82
|
+
prop: systemAssignmentEntry.opacity,
|
|
83
|
+
value: '1',
|
|
84
|
+
raws: {},
|
|
85
|
+
});
|
|
86
|
+
for (const extra of systemAssignmentEntry.extras ?? []) {
|
|
87
|
+
decl.cloneBefore({
|
|
88
|
+
prop: extra.prop,
|
|
89
|
+
value: extra.value === 'applied' ?
|
|
90
|
+
`var(${systemAssignmentEntry.applied})`
|
|
91
|
+
: extra.value,
|
|
92
|
+
raws: {},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Point the actual CSS property at the system final var for runtime flexibility
|
|
96
|
+
decl.value = `var(${systemAssignmentEntry.final})`;
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
ArborPlugin.postcss = true;
|
|
102
|
+
export const arborCss = ArborPlugin;
|
|
103
|
+
export default ArborPlugin;
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ArborPreset } from '@arbor-css/core';
|
|
2
|
+
export interface LoadedConfig {
|
|
3
|
+
/** Path to the resolved config file */
|
|
4
|
+
configPath: string;
|
|
5
|
+
/** The default export from the config (an ArborPreset) */
|
|
6
|
+
preset: ArborPreset;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadConfig(options?: {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
configFile?: string;
|
|
11
|
+
}): Promise<LoadedConfig | null>;
|
|
12
|
+
//# sourceMappingURL=loadConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../src/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,MAAM,WAAW,YAAY;IAC5B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,WAAW,CAAC;CACpB;AAQD,wBAAsB,UAAU,CAC/B,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA6B9B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { access } from 'fs/promises';
|
|
2
|
+
import { createJiti } from 'jiti';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
const DEFAULT_CONFIG_FILES = [
|
|
5
|
+
'arbor.config.ts',
|
|
6
|
+
'arbor.config.js',
|
|
7
|
+
'arbor.config.mjs',
|
|
8
|
+
];
|
|
9
|
+
export async function loadConfig(options = {}) {
|
|
10
|
+
const cwd = options.cwd ?? process.cwd();
|
|
11
|
+
const candidates = options.configFile
|
|
12
|
+
? [options.configFile]
|
|
13
|
+
: DEFAULT_CONFIG_FILES;
|
|
14
|
+
let configPath = null;
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
const resolvedPath = resolve(cwd, candidate);
|
|
17
|
+
try {
|
|
18
|
+
await access(resolvedPath);
|
|
19
|
+
configPath = resolvedPath;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!configPath)
|
|
27
|
+
return null;
|
|
28
|
+
const jiti = createJiti(import.meta.url, {
|
|
29
|
+
moduleCache: false,
|
|
30
|
+
fsCache: false,
|
|
31
|
+
});
|
|
32
|
+
const mod = await jiti.import(configPath);
|
|
33
|
+
const preset = mod.default ?? mod;
|
|
34
|
+
return { configPath, preset };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=loadConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../src/loadConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAS/B,MAAM,oBAAoB,GAAG;IAC5B,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;CACT,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,UAAiD,EAAE;IAEnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;QACpC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,oBAAoB,CAAC;IAExB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3B,UAAU,GAAG,YAAY,CAAC;YAC1B,MAAM;QACP,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACxC,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAI,GAAW,CAAC,OAAO,IAAI,GAAG,CAAC;IAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.test.d.ts","sourceRoot":"","sources":["../src/loadConfig.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'fs/promises';
|
|
2
|
+
import { tmpdir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { afterEach, expect, it } from 'vitest';
|
|
5
|
+
import { loadConfig } from './loadConfig.js';
|
|
6
|
+
const tempDirs = [];
|
|
7
|
+
afterEach(async () => {
|
|
8
|
+
await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
|
|
9
|
+
});
|
|
10
|
+
it('loads a config from the current working directory', async () => {
|
|
11
|
+
const rootDir = await mkdtemp(join(tmpdir(), 'arbor-plugin-load-config-'));
|
|
12
|
+
tempDirs.push(rootDir);
|
|
13
|
+
await writeFile(join(rootDir, 'arbor.config.ts'), 'export default { source: "cwd" };');
|
|
14
|
+
const loaded = await loadConfig({ cwd: rootDir });
|
|
15
|
+
expect(loaded?.configPath).toBe(join(rootDir, 'arbor.config.ts'));
|
|
16
|
+
expect(loaded?.preset).toEqual({ source: 'cwd' });
|
|
17
|
+
});
|
|
18
|
+
it('does not search parent directories for a config file', async () => {
|
|
19
|
+
const rootDir = await mkdtemp(join(tmpdir(), 'arbor-plugin-load-config-'));
|
|
20
|
+
tempDirs.push(rootDir);
|
|
21
|
+
const childDir = join(rootDir, 'nested', 'child');
|
|
22
|
+
await mkdir(childDir, { recursive: true });
|
|
23
|
+
await writeFile(join(rootDir, 'arbor.config.ts'), 'export default { source: "parent" };');
|
|
24
|
+
const loaded = await loadConfig({ cwd: childDir });
|
|
25
|
+
expect(loaded).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
it('resolves configFile relative to the current working directory', async () => {
|
|
28
|
+
const rootDir = await mkdtemp(join(tmpdir(), 'arbor-plugin-load-config-'));
|
|
29
|
+
tempDirs.push(rootDir);
|
|
30
|
+
const configDir = join(rootDir, 'config');
|
|
31
|
+
await mkdir(configDir, { recursive: true });
|
|
32
|
+
await writeFile(join(configDir, 'custom.config.ts'), 'export default { source: "custom" };');
|
|
33
|
+
const loaded = await loadConfig({
|
|
34
|
+
cwd: rootDir,
|
|
35
|
+
configFile: 'config/custom.config.ts',
|
|
36
|
+
});
|
|
37
|
+
expect(loaded?.configPath).toBe(join(configDir, 'custom.config.ts'));
|
|
38
|
+
expect(loaded?.preset).toEqual({ source: 'custom' });
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=loadConfig.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.test.js","sourceRoot":"","sources":["../src/loadConfig.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ArborPreset } from '@arbor-css/core';
|
|
2
|
+
import { type Token } from '@arbor-css/tokens';
|
|
3
|
+
export interface TokenMapEntry {
|
|
4
|
+
/** The CSS var() expression, e.g. `var(--$-color-main-mid)` */
|
|
5
|
+
cssVar: string;
|
|
6
|
+
/** Raw CSS custom property name, e.g. `--$-color-main-mid` */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Token purpose (color, spacing, etc.) */
|
|
9
|
+
purpose: Token['purpose'];
|
|
10
|
+
}
|
|
11
|
+
/** Flat map from dot-path string to token info */
|
|
12
|
+
export type TokenMap = Map<string, TokenMapEntry>;
|
|
13
|
+
/**
|
|
14
|
+
* Builds a flat Map<dotPath, TokenMapEntry> from a preset.
|
|
15
|
+
*
|
|
16
|
+
* Mode tokens are registered under their plain path (e.g. "color.main.mid").
|
|
17
|
+
* Primitive tokens are registered under "primitives.x.y" (e.g. "primitives.spacing.md").
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildTokenMap(preset: ArborPreset<any, any>): TokenMap;
|
|
20
|
+
//# sourceMappingURL=tokenMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenMap.d.ts","sourceRoot":"","sources":["../src/tokenMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAsB,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC7B,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;CAC1B;AAED,kDAAkD;AAClD,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CA+BrE"}
|
package/dist/tokenMap.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { $systemProps, flattenToPropsList } from '@arbor-css/core';
|
|
2
|
+
import { isToken } from '@arbor-css/tokens';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a flat Map<dotPath, TokenMapEntry> from a preset.
|
|
5
|
+
*
|
|
6
|
+
* Mode tokens are registered under their plain path (e.g. "color.main.mid").
|
|
7
|
+
* Primitive tokens are registered under "primitives.x.y" (e.g. "primitives.spacing.md").
|
|
8
|
+
*/
|
|
9
|
+
export function buildTokenMap(preset) {
|
|
10
|
+
const map = new Map();
|
|
11
|
+
// Mode tokens from base mode schema
|
|
12
|
+
const modeTokens = preset?.modes?.base?.schema?.$tokens;
|
|
13
|
+
if (modeTokens) {
|
|
14
|
+
walkTokenTree(modeTokens, '', map);
|
|
15
|
+
}
|
|
16
|
+
// Primitive tokens — prefix with "primitives."
|
|
17
|
+
const primitiveTokens = preset?.primitives?.$tokens;
|
|
18
|
+
if (primitiveTokens) {
|
|
19
|
+
walkTokenTree(primitiveTokens, 'primitives', map);
|
|
20
|
+
}
|
|
21
|
+
// System tokens from $systemProps - "final" tokens are also made available
|
|
22
|
+
// for cross-property references: e.g. "$.system.color.fg" references the "final"
|
|
23
|
+
// token for the foreground color, and can be used to set the value of another
|
|
24
|
+
// property like border-color.
|
|
25
|
+
const systemFinalProps = flattenToPropsList($systemProps).filter((prop) => prop.name.endsWith('final'));
|
|
26
|
+
for (const prop of systemFinalProps) {
|
|
27
|
+
map.set(`system.${prop.name}`, {
|
|
28
|
+
cssVar: prop.var,
|
|
29
|
+
name: prop.name,
|
|
30
|
+
purpose: prop.purpose,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return map;
|
|
34
|
+
}
|
|
35
|
+
function walkTokenTree(node, prefix, map) {
|
|
36
|
+
if (typeof node !== 'object' || node === null)
|
|
37
|
+
return;
|
|
38
|
+
for (const key of Object.keys(node)) {
|
|
39
|
+
const value = node[key];
|
|
40
|
+
const currentPath = prefix ? `${prefix}.${key}` : key;
|
|
41
|
+
if (isToken(value)) {
|
|
42
|
+
const entry = {
|
|
43
|
+
cssVar: value.var,
|
|
44
|
+
name: value.name,
|
|
45
|
+
purpose: value.purpose,
|
|
46
|
+
};
|
|
47
|
+
map.set(currentPath, entry);
|
|
48
|
+
// $root tokens are also accessible at the parent path (without the .$root segment)
|
|
49
|
+
if (key === '$root' && prefix) {
|
|
50
|
+
map.set(prefix, entry);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (typeof value === 'object' && value !== null) {
|
|
54
|
+
walkTokenTree(value, currentPath, map);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=tokenMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenMap.js","sourceRoot":"","sources":["../src/tokenMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAc,MAAM,mBAAmB,CAAC;AAcxD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAA6B;IAC1D,MAAM,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;IAEhC,oCAAoC;IACpC,MAAM,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;IACxD,IAAI,UAAU,EAAE,CAAC;QAChB,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,+CAA+C;IAC/C,MAAM,eAAe,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;IACpD,IAAI,eAAe,EAAE,CAAC;QACrB,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,iFAAiF;IACjF,8EAA8E;IAC9E,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACzE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,EAAE,IAAI,CAAC,GAAG;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,IAAS,EAAE,MAAc,EAAE,GAAa;IAC9D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAEtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAEtD,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,GAAkB;gBAC5B,MAAM,EAAE,KAAK,CAAC,GAAG;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;aACtB,CAAC;YACF,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAE5B,mFAAmF;YACnF,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC/B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxD,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnyArborPreset } from '@arbor-css/core';
|
|
2
|
+
/**
|
|
3
|
+
* Transforms CSS source by:
|
|
4
|
+
* 1. Replacing `@import 'arbor:css'` with the generated Arbor stylesheet.
|
|
5
|
+
* 2. For color-related properties, injecting Arbor system prop declarations
|
|
6
|
+
* (mirroring the behavior of the `classes` package utility rules).
|
|
7
|
+
*
|
|
8
|
+
* @param cssSource - Raw CSS source string
|
|
9
|
+
* @param preset - Loaded Arbor preset for `@import 'arbor:css'` expansion
|
|
10
|
+
*/
|
|
11
|
+
export declare function transform(cssSource: string, preset: AnyArborPreset): TransformResult;
|
|
12
|
+
export interface TransformResult {
|
|
13
|
+
css: string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAsB,MAAM,iBAAiB,CAAC;AAMrE;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACxB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACpB,eAAe,CAoDjB;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;CACZ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { generateStylesheet } from '@arbor-css/core';
|
|
2
|
+
import postcss from 'postcss';
|
|
3
|
+
import { getColorPropEntries } from './colorSystemProps.js';
|
|
4
|
+
const ARBOR_IMPORT_RE = /^['"]arbor:css['"]$/;
|
|
5
|
+
/**
|
|
6
|
+
* Transforms CSS source by:
|
|
7
|
+
* 1. Replacing `@import 'arbor:css'` with the generated Arbor stylesheet.
|
|
8
|
+
* 2. For color-related properties, injecting Arbor system prop declarations
|
|
9
|
+
* (mirroring the behavior of the `classes` package utility rules).
|
|
10
|
+
*
|
|
11
|
+
* @param cssSource - Raw CSS source string
|
|
12
|
+
* @param preset - Loaded Arbor preset for `@import 'arbor:css'` expansion
|
|
13
|
+
*/
|
|
14
|
+
export function transform(cssSource, preset) {
|
|
15
|
+
const root = postcss.parse(cssSource);
|
|
16
|
+
const colorPropEntries = getColorPropEntries(preset);
|
|
17
|
+
// Replace @import 'arbor:css' with the full generated stylesheet
|
|
18
|
+
if (preset) {
|
|
19
|
+
root.walkAtRules('import', (rule) => {
|
|
20
|
+
if (!ARBOR_IMPORT_RE.test(rule.params.trim()))
|
|
21
|
+
return;
|
|
22
|
+
const generated = generateStylesheet(preset);
|
|
23
|
+
const generatedRoot = postcss.parse(generated);
|
|
24
|
+
rule.replaceWith(...generatedRoot.nodes);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// inject color system prop assignments to matching css properties
|
|
28
|
+
root.walkDecls((decl) => {
|
|
29
|
+
const systemAssignmentEntry = colorPropEntries[decl.prop];
|
|
30
|
+
if (systemAssignmentEntry) {
|
|
31
|
+
// Inject system color props before this declaration
|
|
32
|
+
decl.cloneBefore({
|
|
33
|
+
prop: systemAssignmentEntry.applied,
|
|
34
|
+
value: decl.value,
|
|
35
|
+
raws: {},
|
|
36
|
+
});
|
|
37
|
+
decl.cloneBefore({
|
|
38
|
+
prop: systemAssignmentEntry.final,
|
|
39
|
+
value: `var(${systemAssignmentEntry.applied})`,
|
|
40
|
+
raws: {},
|
|
41
|
+
});
|
|
42
|
+
decl.cloneBefore({
|
|
43
|
+
prop: systemAssignmentEntry.opacity,
|
|
44
|
+
value: '1',
|
|
45
|
+
raws: {},
|
|
46
|
+
});
|
|
47
|
+
for (const extra of systemAssignmentEntry.extras ?? []) {
|
|
48
|
+
decl.cloneBefore({
|
|
49
|
+
prop: extra.prop,
|
|
50
|
+
value: extra.value === 'applied' ?
|
|
51
|
+
`var(${systemAssignmentEntry.applied})`
|
|
52
|
+
: extra.value,
|
|
53
|
+
raws: {},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Point the actual CSS property at the system final var for runtime flexibility
|
|
57
|
+
decl.value = `var(${systemAssignmentEntry.final})`;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
css: root.toResult().css,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CACxB,SAAiB,EACjB,MAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAErD,iEAAiE;IACjE,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACnC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAAE,OAAO;YACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAa,CAAC,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,qBAAqB,EAAE,CAAC;YAC3B,oDAAoD;YACpD,IAAI,CAAC,WAAW,CAAC;gBAChB,IAAI,EAAE,qBAAqB,CAAC,OAAO;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,EAAE;aACR,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,CAAC;gBAChB,IAAI,EAAE,qBAAqB,CAAC,KAAK;gBACjC,KAAK,EAAE,OAAO,qBAAqB,CAAC,OAAO,GAAG;gBAC9C,IAAI,EAAE,EAAE;aACR,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,CAAC;gBAChB,IAAI,EAAE,qBAAqB,CAAC,OAAO;gBACnC,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,EAAE;aACR,CAAC,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACxD,IAAI,CAAC,WAAW,CAAC;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EACJ,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;wBAC1B,OAAO,qBAAqB,CAAC,OAAO,GAAG;wBACxC,CAAC,CAAC,KAAK,CAAC,KAAK;oBACd,IAAI,EAAE,EAAE;iBACR,CAAC,CAAC;YACJ,CAAC;YACD,gFAAgF;YAChF,IAAI,CAAC,KAAK,GAAG,OAAO,qBAAqB,CAAC,KAAK,GAAG,CAAC;QACpD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG;KACxB,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arbor-css/postcss",
|
|
3
|
+
"version": "0.0.59",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"url": "https://github.com/a-type/arbor"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"node": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"jiti": "^2.4.2",
|
|
25
|
+
"postcss": "^8.5.4",
|
|
26
|
+
"@arbor-css/tokens": "0.0.59",
|
|
27
|
+
"@arbor-css/globals": "0.0.59",
|
|
28
|
+
"@arbor-css/core": "0.0.59"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^6.0.3",
|
|
32
|
+
"vitest": "^4.1.7",
|
|
33
|
+
"@types/node": "^25.9.1"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@arbor-css/core": "*"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "tsc -w --preserveWatchOutput",
|
|
41
|
+
"test": "vitest",
|
|
42
|
+
"test:ci": "vitest --run"
|
|
43
|
+
}
|
|
44
|
+
}
|