@tokens-studio/tokenscript-schemas 0.0.10 → 0.0.12
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/dist/cli/index.cjs +30 -4
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +29 -4
- package/dist/cli/index.js.map +1 -1
- package/package.json +2 -1
- package/src/bundler/bundle-schema.ts +146 -0
- package/src/bundler/index.ts +151 -0
- package/src/bundler/schema-dependency-resolver.ts +299 -0
- package/src/bundler/selective-bundler.test.ts +94 -0
- package/src/bundler/selective-bundler.ts +159 -0
- package/src/bundler/types.ts +93 -0
- package/src/bundler/utils.ts +74 -0
- package/src/cli/commands/bundle.integration.test.ts +153 -0
- package/src/cli/commands/bundle.test.ts +57 -0
- package/src/cli/commands/bundle.ts +240 -0
- package/src/cli/commands/list.ts +109 -0
- package/src/cli/config-schema.ts +36 -0
- package/src/cli/index.ts +50 -0
- package/src/cli/output-generator.ts +63 -0
- package/src/downloader/index.ts +248 -0
- package/src/downloader/types.ts +48 -0
- package/src/index.ts +8 -0
- package/src/schemas/functions/adjust_chroma/adjust-chroma.tokenscript +27 -0
- package/src/schemas/functions/adjust_chroma/schema.json +48 -0
- package/src/schemas/functions/adjust_chroma/unit.test.ts +76 -0
- package/src/schemas/functions/adjust_hue/adjust-hue.tokenscript +32 -0
- package/src/schemas/functions/adjust_hue/schema.json +48 -0
- package/src/schemas/functions/adjust_hue/unit.test.ts +68 -0
- package/src/schemas/functions/adjust_lightness/adjust-lightness.tokenscript +31 -0
- package/src/schemas/functions/adjust_lightness/schema.json +48 -0
- package/src/schemas/functions/adjust_lightness/unit.test.ts +88 -0
- package/src/schemas/functions/adjust_to_contrast/adjust-to-contrast.tokenscript +131 -0
- package/src/schemas/functions/adjust_to_contrast/schema.json +56 -0
- package/src/schemas/functions/adjust_to_contrast/unit.test.ts +81 -0
- package/src/schemas/functions/alpha_blend/alpha-blend.tokenscript +46 -0
- package/src/schemas/functions/alpha_blend/schema.json +28 -0
- package/src/schemas/functions/alpha_blend/unit.test.ts +135 -0
- package/src/schemas/functions/alpha_scale/alpha-scale.tokenscript +38 -0
- package/src/schemas/functions/alpha_scale/schema.json +24 -0
- package/src/schemas/functions/alpha_scale/unit.test.ts +50 -0
- package/src/schemas/functions/analogous/analogous.tokenscript +47 -0
- package/src/schemas/functions/analogous/schema.json +28 -0
- package/src/schemas/functions/analogous/unit.test.ts +64 -0
- package/src/schemas/functions/apca_contrast/apca-contrast.tokenscript +129 -0
- package/src/schemas/functions/apca_contrast/schema.json +24 -0
- package/src/schemas/functions/apca_contrast/unit.test.ts +259 -0
- package/src/schemas/functions/are_similar/are-similar.tokenscript +24 -0
- package/src/schemas/functions/are_similar/schema.json +57 -0
- package/src/schemas/functions/are_similar/unit.test.ts +57 -0
- package/src/schemas/functions/auto_text_color/auto-text-color.tokenscript +41 -0
- package/src/schemas/functions/auto_text_color/schema.json +53 -0
- package/src/schemas/functions/auto_text_color/unit.test.ts +122 -0
- package/src/schemas/functions/best_contrast/best-contrast.tokenscript +66 -0
- package/src/schemas/functions/best_contrast/schema.json +24 -0
- package/src/schemas/functions/best_contrast/unit.test.ts +64 -0
- package/src/schemas/functions/chroma/chroma.tokenscript +12 -0
- package/src/schemas/functions/chroma/schema.json +44 -0
- package/src/schemas/functions/chroma/unit.test.ts +86 -0
- package/src/schemas/functions/clamp_chroma/clamp-chroma.tokenscript +21 -0
- package/src/schemas/functions/clamp_chroma/schema.json +52 -0
- package/src/schemas/functions/clamp_chroma/unit.test.ts +60 -0
- package/src/schemas/functions/clamp_lightness/clamp-lightness.tokenscript +21 -0
- package/src/schemas/functions/clamp_lightness/schema.json +52 -0
- package/src/schemas/functions/clamp_lightness/unit.test.ts +76 -0
- package/src/schemas/functions/clamp_to_gamut/clamp-to-gamut.tokenscript +41 -0
- package/src/schemas/functions/clamp_to_gamut/schema.json +20 -0
- package/src/schemas/functions/clamp_to_gamut/unit.test.ts +167 -0
- package/src/schemas/functions/complement/complement.tokenscript +21 -0
- package/src/schemas/functions/complement/schema.json +20 -0
- package/src/schemas/functions/complement/unit.test.ts +81 -0
- package/src/schemas/functions/contrast_ratio/contrast-ratio.tokenscript +36 -0
- package/src/schemas/functions/contrast_ratio/schema.json +24 -0
- package/src/schemas/functions/contrast_ratio/unit.test.ts +91 -0
- package/src/schemas/functions/cooler/cooler.tokenscript +45 -0
- package/src/schemas/functions/cooler/schema.json +43 -0
- package/src/schemas/functions/cooler/unit.test.ts +69 -0
- package/src/schemas/functions/darken/darken.tokenscript +37 -0
- package/src/schemas/functions/darken/schema.json +24 -0
- package/src/schemas/functions/darken/unit.test.ts +105 -0
- package/src/schemas/functions/delta_e_2000/delta-e-2000.tokenscript +184 -0
- package/src/schemas/functions/delta_e_2000/schema.json +36 -0
- package/src/schemas/functions/delta_e_2000/unit.test.ts +243 -0
- package/src/schemas/functions/delta_e_76/delta-e-76.tokenscript +45 -0
- package/src/schemas/functions/delta_e_76/schema.json +24 -0
- package/src/schemas/functions/delta_e_76/unit.test.ts +123 -0
- package/src/schemas/functions/delta_e_ok/delta-e-ok.tokenscript +43 -0
- package/src/schemas/functions/delta_e_ok/schema.json +24 -0
- package/src/schemas/functions/delta_e_ok/unit.test.ts +235 -0
- package/src/schemas/functions/desaturate/desaturate.tokenscript +32 -0
- package/src/schemas/functions/desaturate/schema.json +24 -0
- package/src/schemas/functions/desaturate/unit.test.ts +54 -0
- package/src/schemas/functions/distributed/distributed.tokenscript +54 -0
- package/src/schemas/functions/distributed/schema.json +32 -0
- package/src/schemas/functions/distributed/unit.test.ts +58 -0
- package/src/schemas/functions/diverging/diverging.tokenscript +58 -0
- package/src/schemas/functions/diverging/schema.json +32 -0
- package/src/schemas/functions/diverging/unit.test.ts +70 -0
- package/src/schemas/functions/grayscale/grayscale.tokenscript +17 -0
- package/src/schemas/functions/grayscale/schema.json +20 -0
- package/src/schemas/functions/grayscale/unit.test.ts +79 -0
- package/src/schemas/functions/harmonize/harmonize.tokenscript +61 -0
- package/src/schemas/functions/harmonize/schema.json +52 -0
- package/src/schemas/functions/harmonize/unit.test.ts +56 -0
- package/src/schemas/functions/hue/hue.tokenscript +12 -0
- package/src/schemas/functions/hue/schema.json +44 -0
- package/src/schemas/functions/hue/unit.test.ts +75 -0
- package/src/schemas/functions/hue_difference/hue-difference.tokenscript +42 -0
- package/src/schemas/functions/hue_difference/schema.json +24 -0
- package/src/schemas/functions/hue_difference/unit.test.ts +125 -0
- package/src/schemas/functions/in_gamut/in-gamut.tokenscript +51 -0
- package/src/schemas/functions/in_gamut/schema.json +24 -0
- package/src/schemas/functions/in_gamut/unit.test.ts +178 -0
- package/src/schemas/functions/interpolate/interpolate.tokenscript +61 -0
- package/src/schemas/functions/interpolate/schema.json +52 -0
- package/src/schemas/functions/interpolate/unit.test.ts +96 -0
- package/src/schemas/functions/invert/invert-initializer.tokenscript +29 -0
- package/src/schemas/functions/invert/schema.json +20 -0
- package/src/schemas/functions/invert/unit.test.ts +216 -0
- package/src/schemas/functions/is_cool/is-cool.tokenscript +41 -0
- package/src/schemas/functions/is_cool/schema.json +20 -0
- package/src/schemas/functions/is_cool/unit.test.ts +189 -0
- package/src/schemas/functions/is_dark/is-dark.tokenscript +16 -0
- package/src/schemas/functions/is_dark/schema.json +24 -0
- package/src/schemas/functions/is_dark/unit.test.ts +87 -0
- package/src/schemas/functions/is_light/is-light.tokenscript +16 -0
- package/src/schemas/functions/is_light/schema.json +24 -0
- package/src/schemas/functions/is_light/unit.test.ts +86 -0
- package/src/schemas/functions/is_neutral/is-neutral.tokenscript +16 -0
- package/src/schemas/functions/is_neutral/schema.json +53 -0
- package/src/schemas/functions/is_neutral/unit.test.ts +85 -0
- package/src/schemas/functions/is_warm/is-warm.tokenscript +62 -0
- package/src/schemas/functions/is_warm/schema.json +20 -0
- package/src/schemas/functions/is_warm/unit.test.ts +161 -0
- package/src/schemas/functions/lighten/lighten.tokenscript +37 -0
- package/src/schemas/functions/lighten/schema.json +24 -0
- package/src/schemas/functions/lighten/unit.test.ts +109 -0
- package/src/schemas/functions/lightness/lightness.tokenscript +12 -0
- package/src/schemas/functions/lightness/schema.json +49 -0
- package/src/schemas/functions/lightness/unit.test.ts +99 -0
- package/src/schemas/functions/luminance/luminance.tokenscript +16 -0
- package/src/schemas/functions/luminance/schema.json +20 -0
- package/src/schemas/functions/luminance/unit.test.ts +105 -0
- package/src/schemas/functions/meets_contrast/meets-contrast.tokenscript +49 -0
- package/src/schemas/functions/meets_contrast/schema.json +28 -0
- package/src/schemas/functions/meets_contrast/unit.test.ts +170 -0
- package/src/schemas/functions/mix/mix.tokenscript +47 -0
- package/src/schemas/functions/mix/schema.json +28 -0
- package/src/schemas/functions/mix/unit.test.ts +95 -0
- package/src/schemas/functions/monochromatic/monochromatic.tokenscript +72 -0
- package/src/schemas/functions/monochromatic/schema.json +24 -0
- package/src/schemas/functions/monochromatic/unit.test.ts +91 -0
- package/src/schemas/functions/muted/muted.tokenscript +25 -0
- package/src/schemas/functions/muted/schema.json +48 -0
- package/src/schemas/functions/muted/unit.test.ts +100 -0
- package/src/schemas/functions/neutral_variant/neutral-variant.tokenscript +23 -0
- package/src/schemas/functions/neutral_variant/schema.json +48 -0
- package/src/schemas/functions/neutral_variant/unit.test.ts +102 -0
- package/src/schemas/functions/relative_luminance/relative-luminance.tokenscript +15 -0
- package/src/schemas/functions/relative_luminance/schema.json +49 -0
- package/src/schemas/functions/relative_luminance/unit.test.ts +104 -0
- package/src/schemas/functions/rotate_hue/rotate-hue.tokenscript +20 -0
- package/src/schemas/functions/rotate_hue/schema.json +24 -0
- package/src/schemas/functions/rotate_hue/unit.test.ts +86 -0
- package/src/schemas/functions/saturate/saturate.tokenscript +33 -0
- package/src/schemas/functions/saturate/schema.json +24 -0
- package/src/schemas/functions/saturate/unit.test.ts +59 -0
- package/src/schemas/functions/scale_chroma/scale-chroma.tokenscript +22 -0
- package/src/schemas/functions/scale_chroma/schema.json +48 -0
- package/src/schemas/functions/scale_chroma/unit.test.ts +79 -0
- package/src/schemas/functions/scale_lightness/scale-lightness.tokenscript +23 -0
- package/src/schemas/functions/scale_lightness/schema.json +48 -0
- package/src/schemas/functions/scale_lightness/unit.test.ts +73 -0
- package/src/schemas/functions/sepia/schema.json +48 -0
- package/src/schemas/functions/sepia/sepia.tokenscript +54 -0
- package/src/schemas/functions/sepia/unit.test.ts +88 -0
- package/src/schemas/functions/set_chroma/schema.json +24 -0
- package/src/schemas/functions/set_chroma/set-chroma.tokenscript +18 -0
- package/src/schemas/functions/set_chroma/unit.test.ts +79 -0
- package/src/schemas/functions/set_hue/schema.json +24 -0
- package/src/schemas/functions/set_hue/set-hue.tokenscript +18 -0
- package/src/schemas/functions/set_hue/unit.test.ts +90 -0
- package/src/schemas/functions/set_lightness/schema.json +24 -0
- package/src/schemas/functions/set_lightness/set-lightness.tokenscript +18 -0
- package/src/schemas/functions/set_lightness/unit.test.ts +80 -0
- package/src/schemas/functions/shade_scale/schema.json +24 -0
- package/src/schemas/functions/shade_scale/shade-scale.tokenscript +61 -0
- package/src/schemas/functions/shade_scale/unit.test.ts +64 -0
- package/src/schemas/functions/split_complement/schema.json +24 -0
- package/src/schemas/functions/split_complement/split-complement.tokenscript +38 -0
- package/src/schemas/functions/split_complement/unit.test.ts +53 -0
- package/src/schemas/functions/steps/schema.json +28 -0
- package/src/schemas/functions/steps/steps.tokenscript +54 -0
- package/src/schemas/functions/steps/unit.test.ts +71 -0
- package/src/schemas/functions/tetradic/schema.json +20 -0
- package/src/schemas/functions/tetradic/tetradic.tokenscript +40 -0
- package/src/schemas/functions/tetradic/unit.test.ts +50 -0
- package/src/schemas/functions/tint_scale/schema.json +32 -0
- package/src/schemas/functions/tint_scale/tint-scale.tokenscript +71 -0
- package/src/schemas/functions/tint_scale/unit.test.ts +64 -0
- package/src/schemas/functions/to_gamut/schema.json +48 -0
- package/src/schemas/functions/to_gamut/to-gamut.tokenscript +96 -0
- package/src/schemas/functions/to_gamut/unit.test.ts +97 -0
- package/src/schemas/functions/triadic/schema.json +20 -0
- package/src/schemas/functions/triadic/triadic.tokenscript +33 -0
- package/src/schemas/functions/triadic/unit.test.ts +64 -0
- package/src/schemas/functions/vibrant/schema.json +48 -0
- package/src/schemas/functions/vibrant/unit.test.ts +55 -0
- package/src/schemas/functions/vibrant/vibrant.tokenscript +29 -0
- package/src/schemas/functions/warmer/schema.json +43 -0
- package/src/schemas/functions/warmer/unit.test.ts +69 -0
- package/src/schemas/functions/warmer/warmer.tokenscript +45 -0
- package/src/schemas/functions/wcag_level/schema.json +48 -0
- package/src/schemas/functions/wcag_level/unit.test.ts +75 -0
- package/src/schemas/functions/wcag_level/wcag-level.tokenscript +50 -0
- package/src/schemas/types/css-color/from-hsl-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-hwb-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-lab-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-lch-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-oklab-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-oklch-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-p3-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-rgb-color.tokenscript +15 -0
- package/src/schemas/types/css-color/from-srgb-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-srgb-linear-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-xyz-d50-color.tokenscript +16 -0
- package/src/schemas/types/css-color/from-xyz-d65-color.tokenscript +16 -0
- package/src/schemas/types/css-color/initializer.tokenscript +13 -0
- package/src/schemas/types/css-color/schema.json +148 -0
- package/src/schemas/types/css-color/unit.test.ts +402 -0
- package/src/schemas/types/hex-color/initializer.tokenscript +3 -0
- package/src/schemas/types/hex-color/schema.json +24 -0
- package/src/schemas/types/hex-color/unit.test.ts +123 -0
- package/src/schemas/types/hsl-color/from-srgb.tokenscript +87 -0
- package/src/schemas/types/hsl-color/initializer.tokenscript +16 -0
- package/src/schemas/types/hsl-color/schema.json +48 -0
- package/src/schemas/types/hsl-color/unit.test.ts +201 -0
- package/src/schemas/types/hsv-color/from-srgb.tokenscript +80 -0
- package/src/schemas/types/hsv-color/initializer.tokenscript +16 -0
- package/src/schemas/types/hsv-color/schema.json +48 -0
- package/src/schemas/types/hsv-color/unit.test.ts +162 -0
- package/src/schemas/types/hwb-color/from-hsv.tokenscript +31 -0
- package/src/schemas/types/hwb-color/initializer.tokenscript +16 -0
- package/src/schemas/types/hwb-color/schema.json +48 -0
- package/src/schemas/types/hwb-color/unit.test.ts +150 -0
- package/src/schemas/types/lab-color/from-xyz-d50.tokenscript +78 -0
- package/src/schemas/types/lab-color/initializer.tokenscript +16 -0
- package/src/schemas/types/lab-color/schema.json +48 -0
- package/src/schemas/types/lab-color/unit.test.ts +263 -0
- package/src/schemas/types/lch-color/from-lab.tokenscript +44 -0
- package/src/schemas/types/lch-color/initializer.tokenscript +16 -0
- package/src/schemas/types/lch-color/schema.json +48 -0
- package/src/schemas/types/lch-color/unit.test.ts +173 -0
- package/src/schemas/types/okhsl-color/from-oklab.tokenscript +410 -0
- package/src/schemas/types/okhsl-color/initializer.tokenscript +24 -0
- package/src/schemas/types/okhsl-color/schema.json +48 -0
- package/src/schemas/types/okhsl-color/unit.test.ts +514 -0
- package/src/schemas/types/okhsv-color/from-oklab.tokenscript +286 -0
- package/src/schemas/types/okhsv-color/initializer.tokenscript +24 -0
- package/src/schemas/types/okhsv-color/schema.json +48 -0
- package/src/schemas/types/okhsv-color/unit.test.ts +499 -0
- package/src/schemas/types/oklab-color/from-okhsl.tokenscript +195 -0
- package/src/schemas/types/oklab-color/from-okhsv.tokenscript +197 -0
- package/src/schemas/types/oklab-color/from-oklch.tokenscript +39 -0
- package/src/schemas/types/oklab-color/from-xyz-d65.tokenscript +43 -0
- package/src/schemas/types/oklab-color/initializer.tokenscript +16 -0
- package/src/schemas/types/oklab-color/schema.json +78 -0
- package/src/schemas/types/oklab-color/unit.test.ts +345 -0
- package/src/schemas/types/oklch-color/from-oklab.tokenscript +45 -0
- package/src/schemas/types/oklch-color/initializer.tokenscript +16 -0
- package/src/schemas/types/oklch-color/schema.json +48 -0
- package/src/schemas/types/oklch-color/unit.test.ts +267 -0
- package/src/schemas/types/p3-color/from-p3-linear.tokenscript +59 -0
- package/src/schemas/types/p3-color/initializer.tokenscript +16 -0
- package/src/schemas/types/p3-color/schema.json +48 -0
- package/src/schemas/types/p3-color/unit.test.ts +119 -0
- package/src/schemas/types/p3-linear-color/from-xyz-d65.tokenscript +47 -0
- package/src/schemas/types/p3-linear-color/initializer.tokenscript +16 -0
- package/src/schemas/types/p3-linear-color/schema.json +48 -0
- package/src/schemas/types/p3-linear-color/unit.test.ts +82 -0
- package/src/schemas/types/rgb-color/from-hex.tokenscript +43 -0
- package/src/schemas/types/rgb-color/initializer.tokenscript +16 -0
- package/src/schemas/types/rgb-color/schema.json +55 -0
- package/src/schemas/types/rgb-color/to-hex.tokenscript +42 -0
- package/src/schemas/types/rgb-color/unit.test.ts +302 -0
- package/src/schemas/types/srgb-color/from-hsl.tokenscript +106 -0
- package/src/schemas/types/srgb-color/from-linear.tokenscript +58 -0
- package/src/schemas/types/srgb-color/from-rgb.tokenscript +20 -0
- package/src/schemas/types/srgb-color/initializer.tokenscript +16 -0
- package/src/schemas/types/srgb-color/schema.json +68 -0
- package/src/schemas/types/srgb-color/unit.test.ts +303 -0
- package/src/schemas/types/srgb-linear-color/from-srgb.tokenscript +55 -0
- package/src/schemas/types/srgb-linear-color/from-xyz-d65.tokenscript +34 -0
- package/src/schemas/types/srgb-linear-color/initializer.tokenscript +13 -0
- package/src/schemas/types/srgb-linear-color/schema.json +58 -0
- package/src/schemas/types/srgb-linear-color/unit.test.ts +291 -0
- package/src/schemas/types/xyz-d50-color/from-xyz-d65.tokenscript +36 -0
- package/src/schemas/types/xyz-d50-color/initializer.tokenscript +16 -0
- package/src/schemas/types/xyz-d50-color/schema.json +48 -0
- package/src/schemas/types/xyz-d50-color/unit.test.ts +240 -0
- package/src/schemas/types/xyz-d65-color/from-linear-p3.tokenscript +47 -0
- package/src/schemas/types/xyz-d65-color/from-linear-srgb.tokenscript +38 -0
- package/src/schemas/types/xyz-d65-color/from-oklab.tokenscript +44 -0
- package/src/schemas/types/xyz-d65-color/initializer.tokenscript +16 -0
- package/src/schemas/types/xyz-d65-color/schema.json +68 -0
- package/src/schemas/types/xyz-d65-color/unit.test.ts +319 -0
- package/src/utils/schema-uri.ts +192 -0
- package/src/utils/type.ts +194 -0
- package/dist/cli/index.d.cts +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/index.d.cts +0 -158
- package/dist/index.d.ts +0 -158
package/dist/cli/index.cjs
CHANGED
|
@@ -5,12 +5,20 @@ var cac = require('cac');
|
|
|
5
5
|
var ulog = require('ulog');
|
|
6
6
|
var promises = require('fs/promises');
|
|
7
7
|
var path = require('path');
|
|
8
|
+
var url = require('url');
|
|
8
9
|
|
|
10
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
9
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
12
|
|
|
11
13
|
var cac__default = /*#__PURE__*/_interopDefault(cac);
|
|
12
14
|
var ulog__default = /*#__PURE__*/_interopDefault(ulog);
|
|
13
15
|
|
|
16
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
17
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
18
|
+
}) : x)(function(x) {
|
|
19
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
20
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
21
|
+
});
|
|
14
22
|
async function bundleSchemaFromDirectory(schemaDir, options) {
|
|
15
23
|
const schemaJsonPath = path.join(schemaDir, "schema.json");
|
|
16
24
|
const schemaContent = await promises.readFile(schemaJsonPath, "utf-8");
|
|
@@ -514,12 +522,30 @@ function formatDryRunOutput(schemas, resolvedDependencies) {
|
|
|
514
522
|
}
|
|
515
523
|
return lines.join("\n");
|
|
516
524
|
}
|
|
517
|
-
|
|
518
|
-
const
|
|
525
|
+
function findSchemasDir() {
|
|
526
|
+
const __filename = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
|
|
527
|
+
const __dirname = path.dirname(__filename);
|
|
528
|
+
const fromDist = path.join(__dirname, "../../src/schemas");
|
|
529
|
+
const fromSource = path.join(__dirname, "../../schemas");
|
|
530
|
+
try {
|
|
531
|
+
const fs = __require("fs");
|
|
532
|
+
if (fs.existsSync(fromDist)) {
|
|
533
|
+
return fromDist;
|
|
534
|
+
}
|
|
535
|
+
if (fs.existsSync(fromSource)) {
|
|
536
|
+
return fromSource;
|
|
537
|
+
}
|
|
538
|
+
} catch {
|
|
539
|
+
}
|
|
540
|
+
return fromDist;
|
|
541
|
+
}
|
|
542
|
+
async function bundleSchemas(schemas, schemasDir) {
|
|
543
|
+
const resolvedSchemasDir = findSchemasDir();
|
|
519
544
|
log2.info("Bundling schemas:", schemas);
|
|
545
|
+
log2.debug("Schemas directory:", resolvedSchemasDir);
|
|
520
546
|
const result = await bundleSelectiveSchemas({
|
|
521
547
|
schemas,
|
|
522
|
-
schemasDir
|
|
548
|
+
schemasDir: resolvedSchemasDir
|
|
523
549
|
});
|
|
524
550
|
log2.info(
|
|
525
551
|
`Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`
|
|
@@ -646,7 +672,7 @@ cli.command("list", "List available schemas").option("--types", "List only type
|
|
|
646
672
|
}
|
|
647
673
|
});
|
|
648
674
|
cli.help();
|
|
649
|
-
cli.version("0.0.
|
|
675
|
+
cli.version("0.0.12");
|
|
650
676
|
cli.parse();
|
|
651
677
|
//# sourceMappingURL=index.cjs.map
|
|
652
678
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","log","anylogger","mkdir","dirname","writeFile","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const schemaList = schemas.map((s) => s.uri).join(\", \");\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Generated: ${timestamp}`);\n lines.push(`// Schemas: ${schemaList}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport anylogger from \"ulog\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (visited.has(childKey)) {\n const childPrefix = childIndent + (isLastChild ? \"└── \" : \"├── \");\n lines.push(`${childPrefix + childKey} (already visited)`);\n } else {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(schemas: string[]): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n const schemasDir = join(process.cwd(), \"src/schemas\");\n\n log.info(\"Bundling schemas:\", schemas);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(configSchemas);\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir: string = join(process.cwd(), \"src/schemas\"),\n options: ListOptions = {},\n): Promise<ListResult> {\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(schemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(schemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\ncli.help();\ncli.version(\"0.0.10\");\n\ncli.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","log","anylogger","fileURLToPath","dirname","mkdir","writeFile","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const schemaList = schemas.map((s) => s.uri).join(\", \");\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Generated: ${timestamp}`);\n lines.push(`// Schemas: ${schemaList}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (visited.has(childKey)) {\n const childPrefix = childIndent + (isLastChild ? \"└── \" : \"├── \");\n lines.push(`${childPrefix + childKey} (already visited)`);\n } else {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(\n schemas: string[],\n schemasDir?: string,\n): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n // Use provided schemasDir or auto-detect\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n\n log.info(\"Bundling schemas:\", schemas);\n log.debug(\"Schemas directory:\", resolvedSchemasDir);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir: resolvedSchemasDir,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(configSchemas);\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir: string = join(process.cwd(), \"src/schemas\"),\n options: ListOptions = {},\n): Promise<ListResult> {\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(schemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(schemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\ncli.help();\ncli.version(\"0.0.12\");\n\ncli.parse();\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -3,7 +3,14 @@ import cac from 'cac';
|
|
|
3
3
|
import ulog from 'ulog';
|
|
4
4
|
import { mkdir, writeFile, readFile, readdir, access } from 'fs/promises';
|
|
5
5
|
import { dirname, join } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
6
7
|
|
|
8
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
9
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
10
|
+
}) : x)(function(x) {
|
|
11
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
12
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
13
|
+
});
|
|
7
14
|
async function bundleSchemaFromDirectory(schemaDir, options) {
|
|
8
15
|
const schemaJsonPath = join(schemaDir, "schema.json");
|
|
9
16
|
const schemaContent = await readFile(schemaJsonPath, "utf-8");
|
|
@@ -507,12 +514,30 @@ function formatDryRunOutput(schemas, resolvedDependencies) {
|
|
|
507
514
|
}
|
|
508
515
|
return lines.join("\n");
|
|
509
516
|
}
|
|
510
|
-
|
|
511
|
-
const
|
|
517
|
+
function findSchemasDir() {
|
|
518
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
519
|
+
const __dirname = dirname(__filename);
|
|
520
|
+
const fromDist = join(__dirname, "../../src/schemas");
|
|
521
|
+
const fromSource = join(__dirname, "../../schemas");
|
|
522
|
+
try {
|
|
523
|
+
const fs = __require("fs");
|
|
524
|
+
if (fs.existsSync(fromDist)) {
|
|
525
|
+
return fromDist;
|
|
526
|
+
}
|
|
527
|
+
if (fs.existsSync(fromSource)) {
|
|
528
|
+
return fromSource;
|
|
529
|
+
}
|
|
530
|
+
} catch {
|
|
531
|
+
}
|
|
532
|
+
return fromDist;
|
|
533
|
+
}
|
|
534
|
+
async function bundleSchemas(schemas, schemasDir) {
|
|
535
|
+
const resolvedSchemasDir = findSchemasDir();
|
|
512
536
|
log2.info("Bundling schemas:", schemas);
|
|
537
|
+
log2.debug("Schemas directory:", resolvedSchemasDir);
|
|
513
538
|
const result = await bundleSelectiveSchemas({
|
|
514
539
|
schemas,
|
|
515
|
-
schemasDir
|
|
540
|
+
schemasDir: resolvedSchemasDir
|
|
516
541
|
});
|
|
517
542
|
log2.info(
|
|
518
543
|
`Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`
|
|
@@ -639,7 +664,7 @@ cli.command("list", "List available schemas").option("--types", "List only type
|
|
|
639
664
|
}
|
|
640
665
|
});
|
|
641
666
|
cli.help();
|
|
642
|
-
cli.version("0.0.
|
|
667
|
+
cli.version("0.0.12");
|
|
643
668
|
cli.parse();
|
|
644
669
|
//# sourceMappingURL=index.js.map
|
|
645
670
|
//# sourceMappingURL=index.js.map
|