tailwind-styled-v4 5.1.7 → 5.1.9
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/analyzer.js +1 -1
- package/dist/analyzer.js.map +1 -1
- package/dist/analyzer.mjs +1 -1
- package/dist/analyzer.mjs.map +1 -1
- package/dist/animate.js +1 -1
- package/dist/animate.js.map +1 -1
- package/dist/animate.mjs +1 -1
- package/dist/animate.mjs.map +1 -1
- package/dist/atomic.js +1 -1
- package/dist/atomic.js.map +1 -1
- package/dist/atomic.mjs +1 -1
- package/dist/atomic.mjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/compiler.js +1 -1
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.mjs +1 -1
- package/dist/compiler.mjs.map +1 -1
- package/dist/dashboard.js +1 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboard.mjs +1 -2
- package/dist/dashboard.mjs.map +1 -1
- package/dist/devtools.js +1 -1
- package/dist/devtools.js.map +1 -1
- package/dist/devtools.mjs +1 -1
- package/dist/devtools.mjs.map +1 -1
- package/dist/engine.js +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/engine.mjs +1 -1
- package/dist/engine.mjs.map +1 -1
- package/dist/index.browser.mjs +1 -1
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -1
- package/dist/index.mjs.map +1 -1
- package/dist/next.js +1 -1
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +1 -1
- package/dist/next.mjs.map +1 -1
- package/dist/plugin-api.js +1 -1
- package/dist/plugin-api.js.map +1 -1
- package/dist/plugin-api.mjs +1 -2
- package/dist/plugin-api.mjs.map +1 -1
- package/dist/plugin-registry.js +1 -1
- package/dist/plugin-registry.js.map +1 -1
- package/dist/plugin-registry.mjs +1 -1
- package/dist/plugin-registry.mjs.map +1 -1
- package/dist/plugin.js +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/plugin.mjs +1 -2
- package/dist/plugin.mjs.map +1 -1
- package/dist/preset.js +1 -1
- package/dist/preset.js.map +1 -1
- package/dist/preset.mjs +1 -2
- package/dist/preset.mjs.map +1 -1
- package/dist/rspack.js +1 -1
- package/dist/rspack.js.map +1 -1
- package/dist/rspack.mjs +1 -1
- package/dist/rspack.mjs.map +1 -1
- package/dist/runtime-css.js +3 -1
- package/dist/runtime-css.js.map +1 -1
- package/dist/runtime-css.mjs +2 -1
- package/dist/runtime-css.mjs.map +1 -1
- package/dist/runtime.js +3 -1
- package/dist/runtime.js.map +1 -1
- package/dist/runtime.mjs +2 -1
- package/dist/runtime.mjs.map +1 -1
- package/dist/scanner.js +1 -1
- package/dist/scanner.js.map +1 -1
- package/dist/scanner.mjs +1 -1
- package/dist/scanner.mjs.map +1 -1
- package/dist/shared.js +1 -1
- package/dist/shared.js.map +1 -1
- package/dist/shared.mjs +1 -1
- package/dist/shared.mjs.map +1 -1
- package/dist/storybook-addon.js +1 -1
- package/dist/storybook-addon.js.map +1 -1
- package/dist/storybook-addon.mjs +1 -2
- package/dist/storybook-addon.mjs.map +1 -1
- package/dist/svelte.js +1 -1
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +1 -1
- package/dist/svelte.mjs.map +1 -1
- package/dist/syntax.js +1 -1
- package/dist/syntax.js.map +1 -1
- package/dist/syntax.mjs +1 -2
- package/dist/syntax.mjs.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +1 -2
- package/dist/testing.mjs.map +1 -1
- package/dist/theme.js +3 -1
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +3 -1
- package/dist/theme.mjs.map +1 -1
- package/dist/turbopackLoader.js +1 -1
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/turbopackLoader.mjs +1 -1
- package/dist/turbopackLoader.mjs.map +1 -1
- package/dist/tw.js +1 -1
- package/dist/tw.js.map +1 -1
- package/dist/tw.mjs +1 -1
- package/dist/tw.mjs.map +1 -1
- package/dist/vite.js +1 -1
- package/dist/vite.js.map +1 -1
- package/dist/vite.mjs +1 -1
- package/dist/vite.mjs.map +1 -1
- package/dist/vue.js +1 -1
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +1 -1
- package/dist/vue.mjs.map +1 -1
- package/dist/webpackLoader.js +1 -1
- package/dist/webpackLoader.js.map +1 -1
- package/dist/webpackLoader.mjs +1 -1
- package/dist/webpackLoader.mjs.map +1 -1
- package/package.json +8 -7
package/dist/plugin-api.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
2
1
|
"use strict";
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -290,4 +289,5 @@ function presetScrollbar() {
|
|
|
290
289
|
resolveTokenEngine,
|
|
291
290
|
use
|
|
292
291
|
});
|
|
292
|
+
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
293
293
|
//# sourceMappingURL=plugin-api.js.map
|
package/dist/plugin-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/umbrella/plugin-api.ts","../packages/domain/plugin-api/src/schemas.ts","../packages/domain/plugin-api/src/index.ts"],"sourcesContent":["export * from \"@tailwind-styled/plugin-api\"\n","import { z } from \"zod\"\n\nconst formatIssues = (error: z.ZodError): string =>\n error.issues\n .map((issue) => {\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\n return `${p}: ${issue.message}`\n })\n .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n const parsed = schema.safeParse(data)\n if (parsed.success) return parsed.data\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\n}\n\nexport const DesignTokensSchema: z.ZodType<\n Record<string, string | number | Record<string, unknown>>\n> = z.record(z.string(), z.union([z.string(), z.number(), z.lazy(() => DesignTokensSchema)]))\n\nexport const TwClassResultSchema = z.object({\n css: z.string(),\n classes: z.array(z.string()),\n})\n\nexport const TwPluginOptionsSchema = z.object({\n classProcessor: z\n .function({ input: [z.array(z.string())], output: TwClassResultSchema })\n .optional(),\n tokens: DesignTokensSchema.optional(),\n debug: z.boolean().optional(),\n minify: z.boolean().optional(),\n})\n\nexport type TwPluginOptionsInput = z.infer<typeof TwPluginOptionsSchema>\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n setup: z.function({ input: [z.unknown()], output: z.unknown() }),\n})\n\nexport type PluginManifestInput = z.infer<typeof PluginManifestSchema>\n\nexport const TransformRegistrationSchema = z.function({ input: [z.unknown()], output: z.unknown() })\n\nexport const TokenRegistrationSchema = z.object({\n name: z.string().min(1),\n value: z.string(),\n})\n\nexport type TokenRegistrationInput = z.infer<typeof TokenRegistrationSchema>\n\nexport const parseTwPluginOptions = (options: unknown) =>\n parseWithSchema(TwPluginOptionsSchema, options ?? {}, \"plugin options are invalid\")\n\nexport const parsePluginManifest = (plugin: unknown) =>\n parseWithSchema(PluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\nexport const parseTokenRegistration = (data: unknown) =>\n parseWithSchema(TokenRegistrationSchema, data, \"token registration is invalid\")\n\n// ── Enhanced plugin validation (dari monorepo checklist) ────────────────────\n\n/** Nama plugin harus mengikuti format npm package */\nexport const PluginNameSchema = z.string()\n .min(1, \"Plugin name cannot be empty\")\n .regex(\n /^(@[a-z0-9-]+\\/)?[a-z0-9][a-z0-9-]*[a-z0-9]$/,\n \"Plugin name must follow npm naming: lowercase, hyphens allowed, no leading/trailing hyphens\"\n )\n\n/** Versi semantic versioning */\nexport const SemverSchema = z.string()\n .regex(/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/, \"Version must follow semver: x.y.z or x.y.z-prerelease\")\n\n/** Full plugin manifest dengan validasi nama dan versi */\nexport const FullPluginManifestSchema = PluginManifestSchema.extend({\n name: PluginNameSchema,\n version: SemverSchema.optional(),\n description: z.string().max(200).optional(),\n keywords: z.array(z.string()).max(10).optional(),\n})\n\nexport type FullPluginManifest = z.infer<typeof FullPluginManifestSchema>\n\n/** Validate full plugin manifest */\nexport const parseFullPluginManifest = (plugin: unknown): FullPluginManifest =>\n parseWithSchema(FullPluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\n/** Validate plugin name only */\nexport const validatePluginName = (name: unknown): string =>\n parseWithSchema(PluginNameSchema, name, \"plugin name is invalid\")\n\n/** Zod validation for plugin registration payload */\nexport const PluginRegistrationPayloadSchema = z.object({\n plugin: FullPluginManifestSchema,\n config: z.record(z.string(), z.unknown()).optional(),\n priority: z.number().int().min(0).max(100).optional(),\n})\n\nexport type PluginRegistrationPayload = z.infer<typeof PluginRegistrationPayloadSchema>\n\nexport const parsePluginRegistrationPayload = (payload: unknown): PluginRegistrationPayload =>\n parseWithSchema(PluginRegistrationPayloadSchema, payload, \"plugin registration payload is invalid\")\n","import { parsePluginManifest, parseTokenRegistration, TransformRegistrationSchema } from \"./schemas\"\nimport type { CompoundCondition, TokenMap } from \"@tailwind-styled/shared\"\n\nexport interface TwClassResult {\n css: string\n classes: string[]\n}\n\nexport interface DesignTokens {\n [key: string]: string | number | DesignTokens\n}\n\nexport interface TwPluginOptions {\n classProcessor?: (classes: string[]) => TwClassResult\n tokens?: DesignTokens\n debug?: boolean\n minify?: boolean\n}\n\nexport type VariantResolver = (selector: string) => string\n\nexport interface UtilityDefinition {\n [property: string]: string\n}\n\nexport type { CompoundCondition, TokenMap }\n\nexport interface ComponentConfig {\n base: string\n variants: Record<string, Record<string, string>>\n compoundVariants: Array<{ class: string } & CompoundCondition>\n defaultVariants: Record<string, string>\n}\n\nexport interface TransformMeta {\n componentName: string\n tag: string\n}\n\nexport type TransformFn = (config: ComponentConfig, meta: TransformMeta) => ComponentConfig\n\nexport type CssHook = (css: string) => string\n\nexport interface TwContext {\n addVariant(name: string, resolver: VariantResolver): void\n addUtility(name: string, styles: UtilityDefinition): void\n addToken(name: string, value: string): void\n addTransform(fn: TransformFn): void\n onGenerateCSS(hook: CssHook): void\n onBuildEnd(hook: () => void | Promise<void>): void\n getToken(name: string): string | undefined\n subscribeTokens(callback: (tokens: TokenMap) => void): () => void\n readonly config: Record<string, unknown>\n}\n\nexport interface TwPlugin {\n name: string\n setup(ctx: TwContext): void\n}\n\nexport interface PluginRegistry {\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n transforms: TransformFn[]\n cssHooks: CssHook[]\n buildHooks: Array<() => void | Promise<void>>\n plugins: Set<string>\n}\n\nexport interface TokenEngineAPI {\n getToken?: (name: string) => string | undefined\n getTokens?: () => Record<string, string> | undefined\n subscribeTokens?: (callback: (tokens: Record<string, string>) => void) => () => void\n subscribe?: (callback: (tokens: Record<string, string>) => void) => () => void\n}\n\nconst TOKEN_ENGINE_KEY = \"__TW_TOKEN_ENGINE__\"\n\nexport function resolveTokenEngine(): TokenEngineAPI | undefined {\n const engine = (globalThis as Record<string, unknown>)[TOKEN_ENGINE_KEY]\n if (engine && typeof engine === \"object\") {\n return engine as TokenEngineAPI\n }\n return undefined\n}\n\nexport function readToken(engine: TokenEngineAPI | undefined, name: string): string | undefined {\n if (!engine) return undefined\n if (typeof engine.getToken === \"function\") return engine.getToken(name)\n if (typeof engine.getTokens === \"function\") {\n const tokens = engine.getTokens()\n return tokens?.[name]\n }\n return undefined\n}\n\nexport interface TransformContext {\n filename?: string\n componentName?: string\n tag?: string\n}\n\nexport interface TwGlobalRegistry {\n transforms: Array<(config: ComponentConfig, ctx: TransformContext) => ComponentConfig>\n tokens: Record<string, string>\n variants: Map<string, VariantResolver>\n}\n\nconst transformRegistry: TwGlobalRegistry = {\n transforms: [],\n tokens: {},\n variants: new Map(),\n}\n\nconst normalizeTokenName = (name: string): string =>\n name.replace(/[^a-zA-Z0-9-]/g, \"-\").toLowerCase()\n\nexport function getGlobalRegistry(): TwGlobalRegistry {\n return transformRegistry\n}\n\nexport function registerTransform(\n transform: (config: ComponentConfig, ctx: TransformContext) => ComponentConfig\n): void {\n TransformRegistrationSchema.parse(transform)\n transformRegistry.transforms.push(transform)\n}\n\nexport function registerToken(name: string, value: string): void {\n const parsed = parseTokenRegistration({ name, value })\n transformRegistry.tokens[parsed.name] = parsed.value\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n return {\n variants: new Map(),\n utilities: new Map(),\n tokens: new Map(),\n transforms: [],\n cssHooks: [],\n buildHooks: [],\n plugins: new Set(),\n }\n}\n\nconst legacyState = { globalRegistry: createPluginRegistry() }\n\nexport function resetGlobalRegistry(): void {\n transformRegistry.transforms.length = 0\n transformRegistry.variants.clear()\n for (const key of Object.keys(transformRegistry.tokens)) {\n delete transformRegistry.tokens[key]\n }\n legacyState.globalRegistry = createPluginRegistry()\n}\n\nexport function createPluginContext(\n registry: PluginRegistry,\n config: Record<string, unknown> = {}\n): TwContext {\n const isLegacyRegistry = registry === legacyState.globalRegistry\n\n return {\n config,\n addVariant(name, resolver) {\n registry.variants.set(name, resolver)\n if (isLegacyRegistry) {\n transformRegistry.variants.set(name, resolver)\n }\n },\n addUtility(name, styles) {\n registry.utilities.set(name, styles)\n },\n addToken(name, value) {\n const parsed = parseTokenRegistration({ name, value })\n const normalized = normalizeTokenName(parsed.name)\n registry.tokens.set(normalized, parsed.value)\n if (isLegacyRegistry) {\n transformRegistry.tokens[normalized] = parsed.value\n }\n },\n addTransform(fn) {\n TransformRegistrationSchema.parse(fn)\n registry.transforms.push(fn)\n if (isLegacyRegistry) {\n transformRegistry.transforms.push((config, ctx) =>\n fn(config, {\n componentName: ctx.componentName ?? \"\",\n tag: ctx.tag ?? \"\",\n })\n )\n }\n },\n onGenerateCSS(hook) {\n registry.cssHooks.push(hook)\n },\n onBuildEnd(hook) {\n registry.buildHooks.push(hook)\n },\n getToken(name) {\n const normalized = normalizeTokenName(name)\n // Check local registry first (populated by addToken), then fallback to token engine\n const local = registry.tokens.get(normalized)\n if (local !== undefined) return local\n return readToken(resolveTokenEngine(), normalized)\n },\n subscribeTokens(callback) {\n const engine = resolveTokenEngine()\n if (!engine) return () => {}\n if (typeof engine.subscribeTokens === \"function\") return engine.subscribeTokens(callback)\n if (typeof engine.subscribe === \"function\") return engine.subscribe(callback)\n return () => {}\n },\n }\n}\n\nexport function createTw(config: Record<string, unknown> = {}): TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n} {\n const registry = createPluginRegistry()\n const ctx = createPluginContext(registry, config)\n\n const result = ctx as TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n }\n\n result.registry = {\n plugins: registry.plugins,\n variants: registry.variants,\n utilities: registry.utilities,\n tokens: registry.tokens,\n }\n\n result.use = (plugin: TwPlugin) => {\n const manifest = parsePluginManifest(plugin)\n manifest.setup(ctx)\n registry.plugins.add(manifest.name)\n }\n\n if (config.plugins && Array.isArray(config.plugins)) {\n for (const plugin of config.plugins) {\n result.use(parsePluginManifest(plugin))\n }\n }\n\n return result\n}\n\n/**\n * Creates a TwContext that writes through to the global (legacy) registry.\n * Used by createTwPlugin() in the plugin package.\n */\nexport function createGlobalPluginContext(config: Record<string, unknown> = {}): TwContext {\n return createPluginContext(legacyState.globalRegistry, config)\n}\n\nexport function use(plugin: TwPlugin): void {\n const ctx = createPluginContext(legacyState.globalRegistry)\n parsePluginManifest(plugin).setup(ctx)\n}\n\nexport function presetTokens(tokens: Record<string, string>): TwPlugin {\n return {\n name: \"preset-tokens\",\n setup(ctx) {\n for (const [name, value] of Object.entries(tokens)) {\n ctx.addToken(name, value)\n }\n },\n }\n}\n\nexport function presetVariants(variants: Record<string, VariantResolver>): TwPlugin {\n return {\n name: \"preset-variants\",\n setup(ctx) {\n for (const [name, resolver] of Object.entries(variants)) {\n ctx.addVariant(name, resolver)\n }\n },\n }\n}\n\nexport function presetScrollbar(): TwPlugin {\n return {\n name: \"preset-scrollbar\",\n setup(ctx) {\n ctx.addVariant(\"scrollbar-thin\", () => \"::-webkit-scrollbar{width:8px;height:8px}\")\n ctx.addVariant(\"scrollbar-none\", () => \"::-webkit-scrollbar{display:none}\")\n ctx.addUtility(\"scrollbar-hide\", { \"-ms-overflow-style\": \"none\", \"scrollbar-width\": \"none\" })\n },\n }\n}\n\n// Re-export schemas\nexport {\n type PluginManifestInput,\n PluginManifestSchema,\n parsePluginManifest,\n parseTokenRegistration,\n parseTwPluginOptions,\n type TokenRegistrationInput,\n TokenRegistrationSchema,\n TransformRegistrationSchema,\n type TwPluginOptionsInput,\n TwPluginOptionsSchema,\n} from \"./schemas\""],"mappings":"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","names":["config"]}
|
|
1
|
+
{"version":3,"sources":["../src/umbrella/plugin-api.ts","../packages/domain/plugin-api/src/schemas.ts","../packages/domain/plugin-api/src/index.ts"],"sourcesContent":["export * from \"@tailwind-styled/plugin-api\"\n","import { z } from \"zod\"\n\nconst formatIssues = (error: z.ZodError): string =>\n error.issues\n .map((issue) => {\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\n return `${p}: ${issue.message}`\n })\n .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n const parsed = schema.safeParse(data)\n if (parsed.success) return parsed.data\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\n}\n\nexport const DesignTokensSchema: z.ZodType<\n Record<string, string | number | Record<string, unknown>>\n> = z.record(z.string(), z.union([z.string(), z.number(), z.lazy(() => DesignTokensSchema)]))\n\nexport const TwClassResultSchema = z.object({\n css: z.string(),\n classes: z.array(z.string()),\n})\n\nexport const TwPluginOptionsSchema = z.object({\n classProcessor: z\n .function({ input: [z.array(z.string())], output: TwClassResultSchema })\n .optional(),\n tokens: DesignTokensSchema.optional(),\n debug: z.boolean().optional(),\n minify: z.boolean().optional(),\n})\n\nexport type TwPluginOptionsInput = z.infer<typeof TwPluginOptionsSchema>\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n setup: z.function({ input: [z.unknown()], output: z.unknown() }),\n})\n\nexport type PluginManifestInput = z.infer<typeof PluginManifestSchema>\n\nexport const TransformRegistrationSchema = z.function({ input: [z.unknown()], output: z.unknown() })\n\nexport const TokenRegistrationSchema = z.object({\n name: z.string().min(1),\n value: z.string(),\n})\n\nexport type TokenRegistrationInput = z.infer<typeof TokenRegistrationSchema>\n\nexport const parseTwPluginOptions = (options: unknown) =>\n parseWithSchema(TwPluginOptionsSchema, options ?? {}, \"plugin options are invalid\")\n\nexport const parsePluginManifest = (plugin: unknown) =>\n parseWithSchema(PluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\nexport const parseTokenRegistration = (data: unknown) =>\n parseWithSchema(TokenRegistrationSchema, data, \"token registration is invalid\")\n\n// ── Enhanced plugin validation (dari monorepo checklist) ────────────────────\n\n/** Nama plugin harus mengikuti format npm package */\nexport const PluginNameSchema = z.string()\n .min(1, \"Plugin name cannot be empty\")\n .regex(\n /^(@[a-z0-9-]+\\/)?[a-z0-9][a-z0-9-]*[a-z0-9]$/,\n \"Plugin name must follow npm naming: lowercase, hyphens allowed, no leading/trailing hyphens\"\n )\n\n/** Versi semantic versioning */\nexport const SemverSchema = z.string()\n .regex(/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/, \"Version must follow semver: x.y.z or x.y.z-prerelease\")\n\n/** Full plugin manifest dengan validasi nama dan versi */\nexport const FullPluginManifestSchema = PluginManifestSchema.extend({\n name: PluginNameSchema,\n version: SemverSchema.optional(),\n description: z.string().max(200).optional(),\n keywords: z.array(z.string()).max(10).optional(),\n})\n\nexport type FullPluginManifest = z.infer<typeof FullPluginManifestSchema>\n\n/** Validate full plugin manifest */\nexport const parseFullPluginManifest = (plugin: unknown): FullPluginManifest =>\n parseWithSchema(FullPluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\n/** Validate plugin name only */\nexport const validatePluginName = (name: unknown): string =>\n parseWithSchema(PluginNameSchema, name, \"plugin name is invalid\")\n\n/** Zod validation for plugin registration payload */\nexport const PluginRegistrationPayloadSchema = z.object({\n plugin: FullPluginManifestSchema,\n config: z.record(z.string(), z.unknown()).optional(),\n priority: z.number().int().min(0).max(100).optional(),\n})\n\nexport type PluginRegistrationPayload = z.infer<typeof PluginRegistrationPayloadSchema>\n\nexport const parsePluginRegistrationPayload = (payload: unknown): PluginRegistrationPayload =>\n parseWithSchema(PluginRegistrationPayloadSchema, payload, \"plugin registration payload is invalid\")\n","import { parsePluginManifest, parseTokenRegistration, TransformRegistrationSchema } from \"./schemas\"\nimport type { CompoundCondition, TokenMap } from \"@tailwind-styled/shared\"\n\nexport interface TwClassResult {\n css: string\n classes: string[]\n}\n\nexport interface DesignTokens {\n [key: string]: string | number | DesignTokens\n}\n\nexport interface TwPluginOptions {\n classProcessor?: (classes: string[]) => TwClassResult\n tokens?: DesignTokens\n debug?: boolean\n minify?: boolean\n}\n\nexport type VariantResolver = (selector: string) => string\n\nexport interface UtilityDefinition {\n [property: string]: string\n}\n\nexport type { CompoundCondition, TokenMap }\n\nexport interface ComponentConfig {\n base: string\n variants: Record<string, Record<string, string>>\n compoundVariants: Array<{ class: string } & CompoundCondition>\n defaultVariants: Record<string, string>\n}\n\nexport interface TransformMeta {\n componentName: string\n tag: string\n}\n\nexport type TransformFn = (config: ComponentConfig, meta: TransformMeta) => ComponentConfig\n\nexport type CssHook = (css: string) => string\n\nexport interface TwContext {\n addVariant(name: string, resolver: VariantResolver): void\n addUtility(name: string, styles: UtilityDefinition): void\n addToken(name: string, value: string): void\n addTransform(fn: TransformFn): void\n onGenerateCSS(hook: CssHook): void\n onBuildEnd(hook: () => void | Promise<void>): void\n getToken(name: string): string | undefined\n subscribeTokens(callback: (tokens: TokenMap) => void): () => void\n readonly config: Record<string, unknown>\n}\n\nexport interface TwPlugin {\n name: string\n setup(ctx: TwContext): void\n}\n\nexport interface PluginRegistry {\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n transforms: TransformFn[]\n cssHooks: CssHook[]\n buildHooks: Array<() => void | Promise<void>>\n plugins: Set<string>\n}\n\nexport interface TokenEngineAPI {\n getToken?: (name: string) => string | undefined\n getTokens?: () => Record<string, string> | undefined\n subscribeTokens?: (callback: (tokens: Record<string, string>) => void) => () => void\n subscribe?: (callback: (tokens: Record<string, string>) => void) => () => void\n}\n\nconst TOKEN_ENGINE_KEY = \"__TW_TOKEN_ENGINE__\"\n\nexport function resolveTokenEngine(): TokenEngineAPI | undefined {\n const engine = (globalThis as Record<string, unknown>)[TOKEN_ENGINE_KEY]\n if (engine && typeof engine === \"object\") {\n return engine as TokenEngineAPI\n }\n return undefined\n}\n\nexport function readToken(engine: TokenEngineAPI | undefined, name: string): string | undefined {\n if (!engine) return undefined\n if (typeof engine.getToken === \"function\") return engine.getToken(name)\n if (typeof engine.getTokens === \"function\") {\n const tokens = engine.getTokens()\n return tokens?.[name]\n }\n return undefined\n}\n\nexport interface TransformContext {\n filename?: string\n componentName?: string\n tag?: string\n}\n\nexport interface TwGlobalRegistry {\n transforms: Array<(config: ComponentConfig, ctx: TransformContext) => ComponentConfig>\n tokens: Record<string, string>\n variants: Map<string, VariantResolver>\n}\n\nconst transformRegistry: TwGlobalRegistry = {\n transforms: [],\n tokens: {},\n variants: new Map(),\n}\n\nconst normalizeTokenName = (name: string): string =>\n name.replace(/[^a-zA-Z0-9-]/g, \"-\").toLowerCase()\n\nexport function getGlobalRegistry(): TwGlobalRegistry {\n return transformRegistry\n}\n\nexport function registerTransform(\n transform: (config: ComponentConfig, ctx: TransformContext) => ComponentConfig\n): void {\n TransformRegistrationSchema.parse(transform)\n transformRegistry.transforms.push(transform)\n}\n\nexport function registerToken(name: string, value: string): void {\n const parsed = parseTokenRegistration({ name, value })\n transformRegistry.tokens[parsed.name] = parsed.value\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n return {\n variants: new Map(),\n utilities: new Map(),\n tokens: new Map(),\n transforms: [],\n cssHooks: [],\n buildHooks: [],\n plugins: new Set(),\n }\n}\n\nconst legacyState = { globalRegistry: createPluginRegistry() }\n\nexport function resetGlobalRegistry(): void {\n transformRegistry.transforms.length = 0\n transformRegistry.variants.clear()\n for (const key of Object.keys(transformRegistry.tokens)) {\n delete transformRegistry.tokens[key]\n }\n legacyState.globalRegistry = createPluginRegistry()\n}\n\nexport function createPluginContext(\n registry: PluginRegistry,\n config: Record<string, unknown> = {}\n): TwContext {\n const isLegacyRegistry = registry === legacyState.globalRegistry\n\n return {\n config,\n addVariant(name, resolver) {\n registry.variants.set(name, resolver)\n if (isLegacyRegistry) {\n transformRegistry.variants.set(name, resolver)\n }\n },\n addUtility(name, styles) {\n registry.utilities.set(name, styles)\n },\n addToken(name, value) {\n const parsed = parseTokenRegistration({ name, value })\n const normalized = normalizeTokenName(parsed.name)\n registry.tokens.set(normalized, parsed.value)\n if (isLegacyRegistry) {\n transformRegistry.tokens[normalized] = parsed.value\n }\n },\n addTransform(fn) {\n TransformRegistrationSchema.parse(fn)\n registry.transforms.push(fn)\n if (isLegacyRegistry) {\n transformRegistry.transforms.push((config, ctx) =>\n fn(config, {\n componentName: ctx.componentName ?? \"\",\n tag: ctx.tag ?? \"\",\n })\n )\n }\n },\n onGenerateCSS(hook) {\n registry.cssHooks.push(hook)\n },\n onBuildEnd(hook) {\n registry.buildHooks.push(hook)\n },\n getToken(name) {\n const normalized = normalizeTokenName(name)\n // Check local registry first (populated by addToken), then fallback to token engine\n const local = registry.tokens.get(normalized)\n if (local !== undefined) return local\n return readToken(resolveTokenEngine(), normalized)\n },\n subscribeTokens(callback) {\n const engine = resolveTokenEngine()\n if (!engine) return () => {}\n if (typeof engine.subscribeTokens === \"function\") return engine.subscribeTokens(callback)\n if (typeof engine.subscribe === \"function\") return engine.subscribe(callback)\n return () => {}\n },\n }\n}\n\nexport function createTw(config: Record<string, unknown> = {}): TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n} {\n const registry = createPluginRegistry()\n const ctx = createPluginContext(registry, config)\n\n const result = ctx as TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n }\n\n result.registry = {\n plugins: registry.plugins,\n variants: registry.variants,\n utilities: registry.utilities,\n tokens: registry.tokens,\n }\n\n result.use = (plugin: TwPlugin) => {\n const manifest = parsePluginManifest(plugin)\n manifest.setup(ctx)\n registry.plugins.add(manifest.name)\n }\n\n if (config.plugins && Array.isArray(config.plugins)) {\n for (const plugin of config.plugins) {\n result.use(parsePluginManifest(plugin))\n }\n }\n\n return result\n}\n\n/**\n * Creates a TwContext that writes through to the global (legacy) registry.\n * Used by createTwPlugin() in the plugin package.\n */\nexport function createGlobalPluginContext(config: Record<string, unknown> = {}): TwContext {\n return createPluginContext(legacyState.globalRegistry, config)\n}\n\nexport function use(plugin: TwPlugin): void {\n const ctx = createPluginContext(legacyState.globalRegistry)\n parsePluginManifest(plugin).setup(ctx)\n}\n\nexport function presetTokens(tokens: Record<string, string>): TwPlugin {\n return {\n name: \"preset-tokens\",\n setup(ctx) {\n for (const [name, value] of Object.entries(tokens)) {\n ctx.addToken(name, value)\n }\n },\n }\n}\n\nexport function presetVariants(variants: Record<string, VariantResolver>): TwPlugin {\n return {\n name: \"preset-variants\",\n setup(ctx) {\n for (const [name, resolver] of Object.entries(variants)) {\n ctx.addVariant(name, resolver)\n }\n },\n }\n}\n\nexport function presetScrollbar(): TwPlugin {\n return {\n name: \"preset-scrollbar\",\n setup(ctx) {\n ctx.addVariant(\"scrollbar-thin\", () => \"::-webkit-scrollbar{width:8px;height:8px}\")\n ctx.addVariant(\"scrollbar-none\", () => \"::-webkit-scrollbar{display:none}\")\n ctx.addUtility(\"scrollbar-hide\", { \"-ms-overflow-style\": \"none\", \"scrollbar-width\": \"none\" })\n },\n }\n}\n\n// Re-export schemas\nexport {\n type PluginManifestInput,\n PluginManifestSchema,\n parsePluginManifest,\n parseTokenRegistration,\n parseTwPluginOptions,\n type TokenRegistrationInput,\n TokenRegistrationSchema,\n TransformRegistrationSchema,\n type TwPluginOptionsInput,\n TwPluginOptionsSchema,\n} from \"./schemas\""],"mappings":"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","names":["config"]}
|
package/dist/plugin-api.mjs
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
2
|
-
|
|
3
1
|
// packages/domain/plugin-api/src/schemas.ts
|
|
4
2
|
import { z } from "zod";
|
|
5
3
|
var formatIssues = (error) => error.issues.map((issue) => {
|
|
@@ -244,4 +242,5 @@ export {
|
|
|
244
242
|
resolveTokenEngine,
|
|
245
243
|
use
|
|
246
244
|
};
|
|
245
|
+
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
247
246
|
//# sourceMappingURL=plugin-api.mjs.map
|
package/dist/plugin-api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/plugin-api/src/schemas.ts","../packages/domain/plugin-api/src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nconst formatIssues = (error: z.ZodError): string =>\n error.issues\n .map((issue) => {\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\n return `${p}: ${issue.message}`\n })\n .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n const parsed = schema.safeParse(data)\n if (parsed.success) return parsed.data\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\n}\n\nexport const DesignTokensSchema: z.ZodType<\n Record<string, string | number | Record<string, unknown>>\n> = z.record(z.string(), z.union([z.string(), z.number(), z.lazy(() => DesignTokensSchema)]))\n\nexport const TwClassResultSchema = z.object({\n css: z.string(),\n classes: z.array(z.string()),\n})\n\nexport const TwPluginOptionsSchema = z.object({\n classProcessor: z\n .function({ input: [z.array(z.string())], output: TwClassResultSchema })\n .optional(),\n tokens: DesignTokensSchema.optional(),\n debug: z.boolean().optional(),\n minify: z.boolean().optional(),\n})\n\nexport type TwPluginOptionsInput = z.infer<typeof TwPluginOptionsSchema>\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n setup: z.function({ input: [z.unknown()], output: z.unknown() }),\n})\n\nexport type PluginManifestInput = z.infer<typeof PluginManifestSchema>\n\nexport const TransformRegistrationSchema = z.function({ input: [z.unknown()], output: z.unknown() })\n\nexport const TokenRegistrationSchema = z.object({\n name: z.string().min(1),\n value: z.string(),\n})\n\nexport type TokenRegistrationInput = z.infer<typeof TokenRegistrationSchema>\n\nexport const parseTwPluginOptions = (options: unknown) =>\n parseWithSchema(TwPluginOptionsSchema, options ?? {}, \"plugin options are invalid\")\n\nexport const parsePluginManifest = (plugin: unknown) =>\n parseWithSchema(PluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\nexport const parseTokenRegistration = (data: unknown) =>\n parseWithSchema(TokenRegistrationSchema, data, \"token registration is invalid\")\n\n// ── Enhanced plugin validation (dari monorepo checklist) ────────────────────\n\n/** Nama plugin harus mengikuti format npm package */\nexport const PluginNameSchema = z.string()\n .min(1, \"Plugin name cannot be empty\")\n .regex(\n /^(@[a-z0-9-]+\\/)?[a-z0-9][a-z0-9-]*[a-z0-9]$/,\n \"Plugin name must follow npm naming: lowercase, hyphens allowed, no leading/trailing hyphens\"\n )\n\n/** Versi semantic versioning */\nexport const SemverSchema = z.string()\n .regex(/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/, \"Version must follow semver: x.y.z or x.y.z-prerelease\")\n\n/** Full plugin manifest dengan validasi nama dan versi */\nexport const FullPluginManifestSchema = PluginManifestSchema.extend({\n name: PluginNameSchema,\n version: SemverSchema.optional(),\n description: z.string().max(200).optional(),\n keywords: z.array(z.string()).max(10).optional(),\n})\n\nexport type FullPluginManifest = z.infer<typeof FullPluginManifestSchema>\n\n/** Validate full plugin manifest */\nexport const parseFullPluginManifest = (plugin: unknown): FullPluginManifest =>\n parseWithSchema(FullPluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\n/** Validate plugin name only */\nexport const validatePluginName = (name: unknown): string =>\n parseWithSchema(PluginNameSchema, name, \"plugin name is invalid\")\n\n/** Zod validation for plugin registration payload */\nexport const PluginRegistrationPayloadSchema = z.object({\n plugin: FullPluginManifestSchema,\n config: z.record(z.string(), z.unknown()).optional(),\n priority: z.number().int().min(0).max(100).optional(),\n})\n\nexport type PluginRegistrationPayload = z.infer<typeof PluginRegistrationPayloadSchema>\n\nexport const parsePluginRegistrationPayload = (payload: unknown): PluginRegistrationPayload =>\n parseWithSchema(PluginRegistrationPayloadSchema, payload, \"plugin registration payload is invalid\")\n","import { parsePluginManifest, parseTokenRegistration, TransformRegistrationSchema } from \"./schemas\"\nimport type { CompoundCondition, TokenMap } from \"@tailwind-styled/shared\"\n\nexport interface TwClassResult {\n css: string\n classes: string[]\n}\n\nexport interface DesignTokens {\n [key: string]: string | number | DesignTokens\n}\n\nexport interface TwPluginOptions {\n classProcessor?: (classes: string[]) => TwClassResult\n tokens?: DesignTokens\n debug?: boolean\n minify?: boolean\n}\n\nexport type VariantResolver = (selector: string) => string\n\nexport interface UtilityDefinition {\n [property: string]: string\n}\n\nexport type { CompoundCondition, TokenMap }\n\nexport interface ComponentConfig {\n base: string\n variants: Record<string, Record<string, string>>\n compoundVariants: Array<{ class: string } & CompoundCondition>\n defaultVariants: Record<string, string>\n}\n\nexport interface TransformMeta {\n componentName: string\n tag: string\n}\n\nexport type TransformFn = (config: ComponentConfig, meta: TransformMeta) => ComponentConfig\n\nexport type CssHook = (css: string) => string\n\nexport interface TwContext {\n addVariant(name: string, resolver: VariantResolver): void\n addUtility(name: string, styles: UtilityDefinition): void\n addToken(name: string, value: string): void\n addTransform(fn: TransformFn): void\n onGenerateCSS(hook: CssHook): void\n onBuildEnd(hook: () => void | Promise<void>): void\n getToken(name: string): string | undefined\n subscribeTokens(callback: (tokens: TokenMap) => void): () => void\n readonly config: Record<string, unknown>\n}\n\nexport interface TwPlugin {\n name: string\n setup(ctx: TwContext): void\n}\n\nexport interface PluginRegistry {\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n transforms: TransformFn[]\n cssHooks: CssHook[]\n buildHooks: Array<() => void | Promise<void>>\n plugins: Set<string>\n}\n\nexport interface TokenEngineAPI {\n getToken?: (name: string) => string | undefined\n getTokens?: () => Record<string, string> | undefined\n subscribeTokens?: (callback: (tokens: Record<string, string>) => void) => () => void\n subscribe?: (callback: (tokens: Record<string, string>) => void) => () => void\n}\n\nconst TOKEN_ENGINE_KEY = \"__TW_TOKEN_ENGINE__\"\n\nexport function resolveTokenEngine(): TokenEngineAPI | undefined {\n const engine = (globalThis as Record<string, unknown>)[TOKEN_ENGINE_KEY]\n if (engine && typeof engine === \"object\") {\n return engine as TokenEngineAPI\n }\n return undefined\n}\n\nexport function readToken(engine: TokenEngineAPI | undefined, name: string): string | undefined {\n if (!engine) return undefined\n if (typeof engine.getToken === \"function\") return engine.getToken(name)\n if (typeof engine.getTokens === \"function\") {\n const tokens = engine.getTokens()\n return tokens?.[name]\n }\n return undefined\n}\n\nexport interface TransformContext {\n filename?: string\n componentName?: string\n tag?: string\n}\n\nexport interface TwGlobalRegistry {\n transforms: Array<(config: ComponentConfig, ctx: TransformContext) => ComponentConfig>\n tokens: Record<string, string>\n variants: Map<string, VariantResolver>\n}\n\nconst transformRegistry: TwGlobalRegistry = {\n transforms: [],\n tokens: {},\n variants: new Map(),\n}\n\nconst normalizeTokenName = (name: string): string =>\n name.replace(/[^a-zA-Z0-9-]/g, \"-\").toLowerCase()\n\nexport function getGlobalRegistry(): TwGlobalRegistry {\n return transformRegistry\n}\n\nexport function registerTransform(\n transform: (config: ComponentConfig, ctx: TransformContext) => ComponentConfig\n): void {\n TransformRegistrationSchema.parse(transform)\n transformRegistry.transforms.push(transform)\n}\n\nexport function registerToken(name: string, value: string): void {\n const parsed = parseTokenRegistration({ name, value })\n transformRegistry.tokens[parsed.name] = parsed.value\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n return {\n variants: new Map(),\n utilities: new Map(),\n tokens: new Map(),\n transforms: [],\n cssHooks: [],\n buildHooks: [],\n plugins: new Set(),\n }\n}\n\nconst legacyState = { globalRegistry: createPluginRegistry() }\n\nexport function resetGlobalRegistry(): void {\n transformRegistry.transforms.length = 0\n transformRegistry.variants.clear()\n for (const key of Object.keys(transformRegistry.tokens)) {\n delete transformRegistry.tokens[key]\n }\n legacyState.globalRegistry = createPluginRegistry()\n}\n\nexport function createPluginContext(\n registry: PluginRegistry,\n config: Record<string, unknown> = {}\n): TwContext {\n const isLegacyRegistry = registry === legacyState.globalRegistry\n\n return {\n config,\n addVariant(name, resolver) {\n registry.variants.set(name, resolver)\n if (isLegacyRegistry) {\n transformRegistry.variants.set(name, resolver)\n }\n },\n addUtility(name, styles) {\n registry.utilities.set(name, styles)\n },\n addToken(name, value) {\n const parsed = parseTokenRegistration({ name, value })\n const normalized = normalizeTokenName(parsed.name)\n registry.tokens.set(normalized, parsed.value)\n if (isLegacyRegistry) {\n transformRegistry.tokens[normalized] = parsed.value\n }\n },\n addTransform(fn) {\n TransformRegistrationSchema.parse(fn)\n registry.transforms.push(fn)\n if (isLegacyRegistry) {\n transformRegistry.transforms.push((config, ctx) =>\n fn(config, {\n componentName: ctx.componentName ?? \"\",\n tag: ctx.tag ?? \"\",\n })\n )\n }\n },\n onGenerateCSS(hook) {\n registry.cssHooks.push(hook)\n },\n onBuildEnd(hook) {\n registry.buildHooks.push(hook)\n },\n getToken(name) {\n const normalized = normalizeTokenName(name)\n // Check local registry first (populated by addToken), then fallback to token engine\n const local = registry.tokens.get(normalized)\n if (local !== undefined) return local\n return readToken(resolveTokenEngine(), normalized)\n },\n subscribeTokens(callback) {\n const engine = resolveTokenEngine()\n if (!engine) return () => {}\n if (typeof engine.subscribeTokens === \"function\") return engine.subscribeTokens(callback)\n if (typeof engine.subscribe === \"function\") return engine.subscribe(callback)\n return () => {}\n },\n }\n}\n\nexport function createTw(config: Record<string, unknown> = {}): TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n} {\n const registry = createPluginRegistry()\n const ctx = createPluginContext(registry, config)\n\n const result = ctx as TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n }\n\n result.registry = {\n plugins: registry.plugins,\n variants: registry.variants,\n utilities: registry.utilities,\n tokens: registry.tokens,\n }\n\n result.use = (plugin: TwPlugin) => {\n const manifest = parsePluginManifest(plugin)\n manifest.setup(ctx)\n registry.plugins.add(manifest.name)\n }\n\n if (config.plugins && Array.isArray(config.plugins)) {\n for (const plugin of config.plugins) {\n result.use(parsePluginManifest(plugin))\n }\n }\n\n return result\n}\n\n/**\n * Creates a TwContext that writes through to the global (legacy) registry.\n * Used by createTwPlugin() in the plugin package.\n */\nexport function createGlobalPluginContext(config: Record<string, unknown> = {}): TwContext {\n return createPluginContext(legacyState.globalRegistry, config)\n}\n\nexport function use(plugin: TwPlugin): void {\n const ctx = createPluginContext(legacyState.globalRegistry)\n parsePluginManifest(plugin).setup(ctx)\n}\n\nexport function presetTokens(tokens: Record<string, string>): TwPlugin {\n return {\n name: \"preset-tokens\",\n setup(ctx) {\n for (const [name, value] of Object.entries(tokens)) {\n ctx.addToken(name, value)\n }\n },\n }\n}\n\nexport function presetVariants(variants: Record<string, VariantResolver>): TwPlugin {\n return {\n name: \"preset-variants\",\n setup(ctx) {\n for (const [name, resolver] of Object.entries(variants)) {\n ctx.addVariant(name, resolver)\n }\n },\n }\n}\n\nexport function presetScrollbar(): TwPlugin {\n return {\n name: \"preset-scrollbar\",\n setup(ctx) {\n ctx.addVariant(\"scrollbar-thin\", () => \"::-webkit-scrollbar{width:8px;height:8px}\")\n ctx.addVariant(\"scrollbar-none\", () => \"::-webkit-scrollbar{display:none}\")\n ctx.addUtility(\"scrollbar-hide\", { \"-ms-overflow-style\": \"none\", \"scrollbar-width\": \"none\" })\n },\n }\n}\n\n// Re-export schemas\nexport {\n type PluginManifestInput,\n PluginManifestSchema,\n parsePluginManifest,\n parseTokenRegistration,\n parseTwPluginOptions,\n type TokenRegistrationInput,\n TokenRegistrationSchema,\n TransformRegistrationSchema,\n type TwPluginOptionsInput,\n TwPluginOptionsSchema,\n} from \"./schemas\""],"mappings":"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","names":["config"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/plugin-api/src/schemas.ts","../packages/domain/plugin-api/src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nconst formatIssues = (error: z.ZodError): string =>\n error.issues\n .map((issue) => {\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\n return `${p}: ${issue.message}`\n })\n .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n const parsed = schema.safeParse(data)\n if (parsed.success) return parsed.data\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\n}\n\nexport const DesignTokensSchema: z.ZodType<\n Record<string, string | number | Record<string, unknown>>\n> = z.record(z.string(), z.union([z.string(), z.number(), z.lazy(() => DesignTokensSchema)]))\n\nexport const TwClassResultSchema = z.object({\n css: z.string(),\n classes: z.array(z.string()),\n})\n\nexport const TwPluginOptionsSchema = z.object({\n classProcessor: z\n .function({ input: [z.array(z.string())], output: TwClassResultSchema })\n .optional(),\n tokens: DesignTokensSchema.optional(),\n debug: z.boolean().optional(),\n minify: z.boolean().optional(),\n})\n\nexport type TwPluginOptionsInput = z.infer<typeof TwPluginOptionsSchema>\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n setup: z.function({ input: [z.unknown()], output: z.unknown() }),\n})\n\nexport type PluginManifestInput = z.infer<typeof PluginManifestSchema>\n\nexport const TransformRegistrationSchema = z.function({ input: [z.unknown()], output: z.unknown() })\n\nexport const TokenRegistrationSchema = z.object({\n name: z.string().min(1),\n value: z.string(),\n})\n\nexport type TokenRegistrationInput = z.infer<typeof TokenRegistrationSchema>\n\nexport const parseTwPluginOptions = (options: unknown) =>\n parseWithSchema(TwPluginOptionsSchema, options ?? {}, \"plugin options are invalid\")\n\nexport const parsePluginManifest = (plugin: unknown) =>\n parseWithSchema(PluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\nexport const parseTokenRegistration = (data: unknown) =>\n parseWithSchema(TokenRegistrationSchema, data, \"token registration is invalid\")\n\n// ── Enhanced plugin validation (dari monorepo checklist) ────────────────────\n\n/** Nama plugin harus mengikuti format npm package */\nexport const PluginNameSchema = z.string()\n .min(1, \"Plugin name cannot be empty\")\n .regex(\n /^(@[a-z0-9-]+\\/)?[a-z0-9][a-z0-9-]*[a-z0-9]$/,\n \"Plugin name must follow npm naming: lowercase, hyphens allowed, no leading/trailing hyphens\"\n )\n\n/** Versi semantic versioning */\nexport const SemverSchema = z.string()\n .regex(/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/, \"Version must follow semver: x.y.z or x.y.z-prerelease\")\n\n/** Full plugin manifest dengan validasi nama dan versi */\nexport const FullPluginManifestSchema = PluginManifestSchema.extend({\n name: PluginNameSchema,\n version: SemverSchema.optional(),\n description: z.string().max(200).optional(),\n keywords: z.array(z.string()).max(10).optional(),\n})\n\nexport type FullPluginManifest = z.infer<typeof FullPluginManifestSchema>\n\n/** Validate full plugin manifest */\nexport const parseFullPluginManifest = (plugin: unknown): FullPluginManifest =>\n parseWithSchema(FullPluginManifestSchema, plugin, \"plugin manifest is invalid\")\n\n/** Validate plugin name only */\nexport const validatePluginName = (name: unknown): string =>\n parseWithSchema(PluginNameSchema, name, \"plugin name is invalid\")\n\n/** Zod validation for plugin registration payload */\nexport const PluginRegistrationPayloadSchema = z.object({\n plugin: FullPluginManifestSchema,\n config: z.record(z.string(), z.unknown()).optional(),\n priority: z.number().int().min(0).max(100).optional(),\n})\n\nexport type PluginRegistrationPayload = z.infer<typeof PluginRegistrationPayloadSchema>\n\nexport const parsePluginRegistrationPayload = (payload: unknown): PluginRegistrationPayload =>\n parseWithSchema(PluginRegistrationPayloadSchema, payload, \"plugin registration payload is invalid\")\n","import { parsePluginManifest, parseTokenRegistration, TransformRegistrationSchema } from \"./schemas\"\nimport type { CompoundCondition, TokenMap } from \"@tailwind-styled/shared\"\n\nexport interface TwClassResult {\n css: string\n classes: string[]\n}\n\nexport interface DesignTokens {\n [key: string]: string | number | DesignTokens\n}\n\nexport interface TwPluginOptions {\n classProcessor?: (classes: string[]) => TwClassResult\n tokens?: DesignTokens\n debug?: boolean\n minify?: boolean\n}\n\nexport type VariantResolver = (selector: string) => string\n\nexport interface UtilityDefinition {\n [property: string]: string\n}\n\nexport type { CompoundCondition, TokenMap }\n\nexport interface ComponentConfig {\n base: string\n variants: Record<string, Record<string, string>>\n compoundVariants: Array<{ class: string } & CompoundCondition>\n defaultVariants: Record<string, string>\n}\n\nexport interface TransformMeta {\n componentName: string\n tag: string\n}\n\nexport type TransformFn = (config: ComponentConfig, meta: TransformMeta) => ComponentConfig\n\nexport type CssHook = (css: string) => string\n\nexport interface TwContext {\n addVariant(name: string, resolver: VariantResolver): void\n addUtility(name: string, styles: UtilityDefinition): void\n addToken(name: string, value: string): void\n addTransform(fn: TransformFn): void\n onGenerateCSS(hook: CssHook): void\n onBuildEnd(hook: () => void | Promise<void>): void\n getToken(name: string): string | undefined\n subscribeTokens(callback: (tokens: TokenMap) => void): () => void\n readonly config: Record<string, unknown>\n}\n\nexport interface TwPlugin {\n name: string\n setup(ctx: TwContext): void\n}\n\nexport interface PluginRegistry {\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n transforms: TransformFn[]\n cssHooks: CssHook[]\n buildHooks: Array<() => void | Promise<void>>\n plugins: Set<string>\n}\n\nexport interface TokenEngineAPI {\n getToken?: (name: string) => string | undefined\n getTokens?: () => Record<string, string> | undefined\n subscribeTokens?: (callback: (tokens: Record<string, string>) => void) => () => void\n subscribe?: (callback: (tokens: Record<string, string>) => void) => () => void\n}\n\nconst TOKEN_ENGINE_KEY = \"__TW_TOKEN_ENGINE__\"\n\nexport function resolveTokenEngine(): TokenEngineAPI | undefined {\n const engine = (globalThis as Record<string, unknown>)[TOKEN_ENGINE_KEY]\n if (engine && typeof engine === \"object\") {\n return engine as TokenEngineAPI\n }\n return undefined\n}\n\nexport function readToken(engine: TokenEngineAPI | undefined, name: string): string | undefined {\n if (!engine) return undefined\n if (typeof engine.getToken === \"function\") return engine.getToken(name)\n if (typeof engine.getTokens === \"function\") {\n const tokens = engine.getTokens()\n return tokens?.[name]\n }\n return undefined\n}\n\nexport interface TransformContext {\n filename?: string\n componentName?: string\n tag?: string\n}\n\nexport interface TwGlobalRegistry {\n transforms: Array<(config: ComponentConfig, ctx: TransformContext) => ComponentConfig>\n tokens: Record<string, string>\n variants: Map<string, VariantResolver>\n}\n\nconst transformRegistry: TwGlobalRegistry = {\n transforms: [],\n tokens: {},\n variants: new Map(),\n}\n\nconst normalizeTokenName = (name: string): string =>\n name.replace(/[^a-zA-Z0-9-]/g, \"-\").toLowerCase()\n\nexport function getGlobalRegistry(): TwGlobalRegistry {\n return transformRegistry\n}\n\nexport function registerTransform(\n transform: (config: ComponentConfig, ctx: TransformContext) => ComponentConfig\n): void {\n TransformRegistrationSchema.parse(transform)\n transformRegistry.transforms.push(transform)\n}\n\nexport function registerToken(name: string, value: string): void {\n const parsed = parseTokenRegistration({ name, value })\n transformRegistry.tokens[parsed.name] = parsed.value\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n return {\n variants: new Map(),\n utilities: new Map(),\n tokens: new Map(),\n transforms: [],\n cssHooks: [],\n buildHooks: [],\n plugins: new Set(),\n }\n}\n\nconst legacyState = { globalRegistry: createPluginRegistry() }\n\nexport function resetGlobalRegistry(): void {\n transformRegistry.transforms.length = 0\n transformRegistry.variants.clear()\n for (const key of Object.keys(transformRegistry.tokens)) {\n delete transformRegistry.tokens[key]\n }\n legacyState.globalRegistry = createPluginRegistry()\n}\n\nexport function createPluginContext(\n registry: PluginRegistry,\n config: Record<string, unknown> = {}\n): TwContext {\n const isLegacyRegistry = registry === legacyState.globalRegistry\n\n return {\n config,\n addVariant(name, resolver) {\n registry.variants.set(name, resolver)\n if (isLegacyRegistry) {\n transformRegistry.variants.set(name, resolver)\n }\n },\n addUtility(name, styles) {\n registry.utilities.set(name, styles)\n },\n addToken(name, value) {\n const parsed = parseTokenRegistration({ name, value })\n const normalized = normalizeTokenName(parsed.name)\n registry.tokens.set(normalized, parsed.value)\n if (isLegacyRegistry) {\n transformRegistry.tokens[normalized] = parsed.value\n }\n },\n addTransform(fn) {\n TransformRegistrationSchema.parse(fn)\n registry.transforms.push(fn)\n if (isLegacyRegistry) {\n transformRegistry.transforms.push((config, ctx) =>\n fn(config, {\n componentName: ctx.componentName ?? \"\",\n tag: ctx.tag ?? \"\",\n })\n )\n }\n },\n onGenerateCSS(hook) {\n registry.cssHooks.push(hook)\n },\n onBuildEnd(hook) {\n registry.buildHooks.push(hook)\n },\n getToken(name) {\n const normalized = normalizeTokenName(name)\n // Check local registry first (populated by addToken), then fallback to token engine\n const local = registry.tokens.get(normalized)\n if (local !== undefined) return local\n return readToken(resolveTokenEngine(), normalized)\n },\n subscribeTokens(callback) {\n const engine = resolveTokenEngine()\n if (!engine) return () => {}\n if (typeof engine.subscribeTokens === \"function\") return engine.subscribeTokens(callback)\n if (typeof engine.subscribe === \"function\") return engine.subscribe(callback)\n return () => {}\n },\n }\n}\n\nexport function createTw(config: Record<string, unknown> = {}): TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n} {\n const registry = createPluginRegistry()\n const ctx = createPluginContext(registry, config)\n\n const result = ctx as TwContext & {\n registry: {\n plugins: Set<string>\n variants: Map<string, VariantResolver>\n utilities: Map<string, UtilityDefinition>\n tokens: Map<string, string>\n }\n use: (plugin: TwPlugin) => void\n }\n\n result.registry = {\n plugins: registry.plugins,\n variants: registry.variants,\n utilities: registry.utilities,\n tokens: registry.tokens,\n }\n\n result.use = (plugin: TwPlugin) => {\n const manifest = parsePluginManifest(plugin)\n manifest.setup(ctx)\n registry.plugins.add(manifest.name)\n }\n\n if (config.plugins && Array.isArray(config.plugins)) {\n for (const plugin of config.plugins) {\n result.use(parsePluginManifest(plugin))\n }\n }\n\n return result\n}\n\n/**\n * Creates a TwContext that writes through to the global (legacy) registry.\n * Used by createTwPlugin() in the plugin package.\n */\nexport function createGlobalPluginContext(config: Record<string, unknown> = {}): TwContext {\n return createPluginContext(legacyState.globalRegistry, config)\n}\n\nexport function use(plugin: TwPlugin): void {\n const ctx = createPluginContext(legacyState.globalRegistry)\n parsePluginManifest(plugin).setup(ctx)\n}\n\nexport function presetTokens(tokens: Record<string, string>): TwPlugin {\n return {\n name: \"preset-tokens\",\n setup(ctx) {\n for (const [name, value] of Object.entries(tokens)) {\n ctx.addToken(name, value)\n }\n },\n }\n}\n\nexport function presetVariants(variants: Record<string, VariantResolver>): TwPlugin {\n return {\n name: \"preset-variants\",\n setup(ctx) {\n for (const [name, resolver] of Object.entries(variants)) {\n ctx.addVariant(name, resolver)\n }\n },\n }\n}\n\nexport function presetScrollbar(): TwPlugin {\n return {\n name: \"preset-scrollbar\",\n setup(ctx) {\n ctx.addVariant(\"scrollbar-thin\", () => \"::-webkit-scrollbar{width:8px;height:8px}\")\n ctx.addVariant(\"scrollbar-none\", () => \"::-webkit-scrollbar{display:none}\")\n ctx.addUtility(\"scrollbar-hide\", { \"-ms-overflow-style\": \"none\", \"scrollbar-width\": \"none\" })\n },\n }\n}\n\n// Re-export schemas\nexport {\n type PluginManifestInput,\n PluginManifestSchema,\n parsePluginManifest,\n parseTokenRegistration,\n parseTwPluginOptions,\n type TokenRegistrationInput,\n TokenRegistrationSchema,\n TransformRegistrationSchema,\n type TwPluginOptionsInput,\n TwPluginOptionsSchema,\n} from \"./schemas\""],"mappings":";AAAA,SAAS,SAAS;AAElB,IAAM,eAAe,CAAC,UACpB,MAAM,OACH,IAAI,CAAC,UAAU;AACd,QAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI;AACzD,SAAO,GAAG,CAAC,KAAK,MAAM,OAAO;AAC/B,CAAC,EACA,KAAK,IAAI;AAEd,IAAM,kBAAkB,CAAI,QAAsB,MAAe,UAAqB;AACpF,QAAM,SAAS,OAAO,UAAU,IAAI;AACpC,MAAI,OAAO,QAAS,QAAO,OAAO;AAClC,QAAM,IAAI,UAAU,GAAG,KAAK,KAAK,aAAa,OAAO,KAAK,CAAC,EAAE;AAC/D;AAEO,IAAM,qBAET,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,KAAK,MAAM,kBAAkB,CAAC,CAAC,CAAC;AAErF,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,KAAK,EAAE,OAAO;AAAA,EACd,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAC7B,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,gBAAgB,EACb,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,oBAAoB,CAAC,EACtE,SAAS;AAAA,EACZ,QAAQ,mBAAmB,SAAS;AAAA,EACpC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACjE,CAAC;AAIM,IAAM,8BAA8B,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAE5F,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,EAAE,OAAO;AAClB,CAAC;AAIM,IAAM,uBAAuB,CAAC,YACnC,gBAAgB,uBAAuB,WAAW,CAAC,GAAG,4BAA4B;AAE7E,IAAM,sBAAsB,CAAC,WAClC,gBAAgB,sBAAsB,QAAQ,4BAA4B;AAErE,IAAM,yBAAyB,CAAC,SACrC,gBAAgB,yBAAyB,MAAM,+BAA+B;AAKzE,IAAM,mBAAmB,EAAE,OAAO,EACtC,IAAI,GAAG,6BAA6B,EACpC;AAAA,EACC;AAAA,EACA;AACF;AAGK,IAAM,eAAe,EAAE,OAAO,EAClC,MAAM,iCAAiC,uDAAuD;AAG1F,IAAM,2BAA2B,qBAAqB,OAAO;AAAA,EAClE,MAAM;AAAA,EACN,SAAS,aAAa,SAAS;AAAA,EAC/B,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC1C,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AACjD,CAAC;AAaM,IAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,QAAQ;AAAA,EACR,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AACtD,CAAC;;;ACrBD,IAAM,mBAAmB;AAElB,SAAS,qBAAiD;AAC/D,QAAM,SAAU,WAAuC,gBAAgB;AACvE,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,UAAU,QAAoC,MAAkC;AAC9F,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,OAAO,aAAa,WAAY,QAAO,OAAO,SAAS,IAAI;AACtE,MAAI,OAAO,OAAO,cAAc,YAAY;AAC1C,UAAM,SAAS,OAAO,UAAU;AAChC,WAAO,SAAS,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAcA,IAAM,oBAAsC;AAAA,EAC1C,YAAY,CAAC;AAAA,EACb,QAAQ,CAAC;AAAA,EACT,UAAU,oBAAI,IAAI;AACpB;AAEA,IAAM,qBAAqB,CAAC,SAC1B,KAAK,QAAQ,kBAAkB,GAAG,EAAE,YAAY;AAE3C,SAAS,oBAAsC;AACpD,SAAO;AACT;AAEO,SAAS,kBACd,WACM;AACN,8BAA4B,MAAM,SAAS;AAC3C,oBAAkB,WAAW,KAAK,SAAS;AAC7C;AAEO,SAAS,cAAc,MAAc,OAAqB;AAC/D,QAAM,SAAS,uBAAuB,EAAE,MAAM,MAAM,CAAC;AACrD,oBAAkB,OAAO,OAAO,IAAI,IAAI,OAAO;AACjD;AAEO,SAAS,uBAAuC;AACrD,SAAO;AAAA,IACL,UAAU,oBAAI,IAAI;AAAA,IAClB,WAAW,oBAAI,IAAI;AAAA,IACnB,QAAQ,oBAAI,IAAI;AAAA,IAChB,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,IACX,YAAY,CAAC;AAAA,IACb,SAAS,oBAAI,IAAI;AAAA,EACnB;AACF;AAEA,IAAM,cAAc,EAAE,gBAAgB,qBAAqB,EAAE;AAEtD,SAAS,sBAA4B;AAC1C,oBAAkB,WAAW,SAAS;AACtC,oBAAkB,SAAS,MAAM;AACjC,aAAW,OAAO,OAAO,KAAK,kBAAkB,MAAM,GAAG;AACvD,WAAO,kBAAkB,OAAO,GAAG;AAAA,EACrC;AACA,cAAY,iBAAiB,qBAAqB;AACpD;AAEO,SAAS,oBACd,UACA,SAAkC,CAAC,GACxB;AACX,QAAM,mBAAmB,aAAa,YAAY;AAElD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,MAAM,UAAU;AACzB,eAAS,SAAS,IAAI,MAAM,QAAQ;AACpC,UAAI,kBAAkB;AACpB,0BAAkB,SAAS,IAAI,MAAM,QAAQ;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,WAAW,MAAM,QAAQ;AACvB,eAAS,UAAU,IAAI,MAAM,MAAM;AAAA,IACrC;AAAA,IACA,SAAS,MAAM,OAAO;AACpB,YAAM,SAAS,uBAAuB,EAAE,MAAM,MAAM,CAAC;AACrD,YAAM,aAAa,mBAAmB,OAAO,IAAI;AACjD,eAAS,OAAO,IAAI,YAAY,OAAO,KAAK;AAC5C,UAAI,kBAAkB;AACpB,0BAAkB,OAAO,UAAU,IAAI,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,IACA,aAAa,IAAI;AACf,kCAA4B,MAAM,EAAE;AACpC,eAAS,WAAW,KAAK,EAAE;AAC3B,UAAI,kBAAkB;AACpB,0BAAkB,WAAW;AAAA,UAAK,CAACA,SAAQ,QACzC,GAAGA,SAAQ;AAAA,YACT,eAAe,IAAI,iBAAiB;AAAA,YACpC,KAAK,IAAI,OAAO;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc,MAAM;AAClB,eAAS,SAAS,KAAK,IAAI;AAAA,IAC7B;AAAA,IACA,WAAW,MAAM;AACf,eAAS,WAAW,KAAK,IAAI;AAAA,IAC/B;AAAA,IACA,SAAS,MAAM;AACb,YAAM,aAAa,mBAAmB,IAAI;AAE1C,YAAM,QAAQ,SAAS,OAAO,IAAI,UAAU;AAC5C,UAAI,UAAU,OAAW,QAAO;AAChC,aAAO,UAAU,mBAAmB,GAAG,UAAU;AAAA,IACnD;AAAA,IACA,gBAAgB,UAAU;AACxB,YAAM,SAAS,mBAAmB;AAClC,UAAI,CAAC,OAAQ,QAAO,MAAM;AAAA,MAAC;AAC3B,UAAI,OAAO,OAAO,oBAAoB,WAAY,QAAO,OAAO,gBAAgB,QAAQ;AACxF,UAAI,OAAO,OAAO,cAAc,WAAY,QAAO,OAAO,UAAU,QAAQ;AAC5E,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,SAAS,SAAkC,CAAC,GAQ1D;AACA,QAAM,WAAW,qBAAqB;AACtC,QAAM,MAAM,oBAAoB,UAAU,MAAM;AAEhD,QAAM,SAAS;AAUf,SAAO,WAAW;AAAA,IAChB,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,EACnB;AAEA,SAAO,MAAM,CAAC,WAAqB;AACjC,UAAM,WAAW,oBAAoB,MAAM;AAC3C,aAAS,MAAM,GAAG;AAClB,aAAS,QAAQ,IAAI,SAAS,IAAI;AAAA,EACpC;AAEA,MAAI,OAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,GAAG;AACnD,eAAW,UAAU,OAAO,SAAS;AACnC,aAAO,IAAI,oBAAoB,MAAM,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,0BAA0B,SAAkC,CAAC,GAAc;AACzF,SAAO,oBAAoB,YAAY,gBAAgB,MAAM;AAC/D;AAEO,SAAS,IAAI,QAAwB;AAC1C,QAAM,MAAM,oBAAoB,YAAY,cAAc;AAC1D,sBAAoB,MAAM,EAAE,MAAM,GAAG;AACvC;AAEO,SAAS,aAAa,QAA0C;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AACT,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,YAAI,SAAS,MAAM,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,UAAqD;AAClF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AACT,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACvD,YAAI,WAAW,MAAM,QAAQ;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AACT,UAAI,WAAW,kBAAkB,MAAM,2CAA2C;AAClF,UAAI,WAAW,kBAAkB,MAAM,mCAAmC;AAC1E,UAAI,WAAW,kBAAkB,EAAE,sBAAsB,QAAQ,mBAAmB,OAAO,CAAC;AAAA,IAC9F;AAAA,EACF;AACF;","names":["config"]}
|
package/dist/plugin-registry.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
2
1
|
"use strict";
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -408,4 +407,5 @@ var registry = getRegistry();
|
|
|
408
407
|
getRegistry,
|
|
409
408
|
registry
|
|
410
409
|
});
|
|
410
|
+
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
411
411
|
//# sourceMappingURL=plugin-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../src/umbrella/plugin-registry.ts","../node_modules/tsup/assets/cjs_shims.js","../packages/domain/plugin-registry/src/index.ts"],"sourcesContent":["{\n \"version\": \"5.0.0\",\n \"updatedAt\": \"2026-03-23\",\n \"official\": [\n {\n \"name\": \"@tailwind-styled/plugin-animation\",\n \"description\": \"Animation presets and keyframes — enter/exit transitions, spring physics, scroll-triggered\",\n \"version\": \"5.0.0\",\n \"tags\": [\"animation\", \"motion\", \"transition\", \"keyframes\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/packages/animate\",\n \"install\": \"npm install @tailwind-styled/plugin-animation@5.0.0\",\n \"integrity\": \"sha256-abc123\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-typography\",\n \"description\": \"Prose and typography utilities — headings, body, code blocks, with dark mode\",\n \"version\": \"5.0.0\",\n \"tags\": [\"typography\", \"prose\", \"markdown\", \"content\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-typography@5.0.0\",\n \"integrity\": \"sha256-def456\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-forms\",\n \"description\": \"Form input styling helpers — reset, validation states, custom checkboxes/radios\",\n \"version\": \"5.0.0\",\n \"tags\": [\"forms\", \"inputs\", \"validation\", \"checkbox\", \"radio\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-forms@5.0.0\",\n \"integrity\": \"sha256-ghi789\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-container-queries\",\n \"description\": \"Container query utilities — @container breakpoints for component-level responsiveness\",\n \"version\": \"5.0.0\",\n \"tags\": [\"container-queries\", \"responsive\", \"layout\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-container-queries@5.0.0\",\n \"integrity\": \"sha256-jkl012\"\n }\n ],\n \"community\": [\n {\n \"name\": \"tailwind-styled-animate\",\n \"description\": \"Community animation variants — bounce, pulse, wiggle, and more\",\n \"version\": \"0.1.0\",\n \"tags\": [\"animation\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-animate\"\n },\n {\n \"name\": \"tailwind-styled-icons\",\n \"description\": \"SVG icon system integrated with tw() variant API\",\n \"version\": \"0.1.0\",\n \"tags\": [\"icons\", \"svg\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-icons\"\n }\n ]\n}\n","export * from \"@tailwind-styled/plugin-registry\"\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n// ── Native bridge (lazy-loaded to avoid circular deps) ──────────────────────\ntype NativePluginRegistry = {\n pluginSearch: (pluginsJson: string, query: string) => string\n pluginValidateName: (name: string) => boolean\n pluginVerifyIntegrity: (content: string, expectedIntegrity: string) => boolean\n pluginSemverHasUpdate: (current: string, latest: string) => boolean\n pluginCheckAllUpdates: (installedJson: string, registryJson: string) => string\n}\nlet _native: NativePluginRegistry | null | undefined = undefined\nfunction getNative(): NativePluginRegistry | null {\n if (_native !== undefined) return _native\n try {\n const runtimeDir = typeof __dirname === \"string\" && __dirname.length > 0\n ? __dirname\n : typeof import.meta !== \"undefined\" && import.meta.url\n ? fileURLToPath(new URL(\".\", import.meta.url))\n : process.cwd()\n const req = createRequire(join(runtimeDir, \"noop.cjs\"))\n const _pa = `${process.platform}-${process.arch}`\n const _paGnu = _pa === \"linux-x64\" ? \"linux-x64-gnu\" : _pa === \"linux-arm64\" ? \"linux-arm64-gnu\" : _pa\n const candidates = [\n // npm install case: dist/../native/\n resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_pa}.node`),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_paGnu}.node`),\n resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // cwd fallback\n resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\n resolve(process.cwd(), \"native\", \"tailwind_styled_parser.node\"),\n // monorepo dev: 4-level up\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // 3-level fallback\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n ]\n for (const c of candidates) {\n try {\n const mod = req(c) as Record<string, unknown>\n if (typeof mod?.pluginSearch === \"function\") {\n return (_native = mod as unknown as NativePluginRegistry)\n }\n } catch { /* continue */ }\n }\n } catch { /* ignore */ }\n return (_native = null)\n}\n\nconst NATIVE_UNAVAILABLE_MESSAGE =\n \"[tailwind-styled/plugin-registry] Native binding is required but not available.\\n\" +\n \"Please ensure you have run: npm run build:rust\"\n\n/**\n * Native-only accessor. Throws if the Rust binding is missing.\n * The TS layer is a thin wrapper — no JS fallbacks (native-first philosophy).\n */\nfunction requireNative(): NativePluginRegistry {\n const native = getNative()\n if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n return native\n}\n\nconst PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\\/)?[a-z0-9-]+(@[0-9]+\\.[0-9]+\\.[0-9]+)?$/\n\nexport interface PluginInfo {\n name: string\n description: string\n version: string\n tags: string[]\n official?: boolean\n docs?: string\n install?: string\n integrity?: string\n}\n\ninterface RegistryData {\n version: string\n official: PluginInfo[]\n community: PluginInfo[]\n}\n\nexport interface InstallResult {\n plugin: string\n installed: boolean\n command: string\n exitCode: number\n}\n\nexport type PluginRegistryErrorCode =\n | \"INVALID_PLUGIN_NAME\"\n | \"PLUGIN_NOT_FOUND\"\n | \"EXTERNAL_CONFIRMATION_REQUIRED\"\n | \"INSTALL_COMMAND_FAILED\"\n | \"INSTALL_FAILED\"\n | \"NETWORK_ERROR\"\n | \"REGISTRY_LOAD_FAILED\"\n\nexport interface PluginRegistryErrorPayload {\n code: PluginRegistryErrorCode\n message: string\n context?: Record<string, unknown>\n}\n\nexport class PluginRegistryError extends Error {\n readonly code: PluginRegistryErrorCode\n readonly context?: Record<string, unknown>\n\n constructor(payload: PluginRegistryErrorPayload) {\n super(payload.message)\n this.name = \"PluginRegistryError\"\n this.code = payload.code\n this.context = payload.context\n }\n\n toObject(): PluginRegistryErrorPayload {\n return {\n code: this.code,\n message: this.message,\n context: this.context,\n }\n }\n}\n\nexport interface InstallOptions {\n dryRun?: boolean\n npmBin?: string\n allowExternal?: boolean\n confirmExternal?: boolean\n}\n\nexport interface RegistryOptions {\n registryUrl?: string\n}\n\nexport class PluginRegistry {\n private readonly plugins: PluginInfo[]\n private readonly registryVersion: string\n\n constructor(registryData?: RegistryData, options: RegistryOptions = {}) {\n if (options.registryUrl) {\n this.plugins = []\n this.registryVersion = \"0.0.0\"\n } else {\n const data = registryData\n const version = data?.version ?? \"4.2.0\"\n const official = (data?.official ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: true,\n docs: item.docs,\n install: item.install,\n integrity: item.integrity,\n }))\n const community = (data?.community ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: false,\n }))\n this.plugins = [...official, ...community]\n this.registryVersion = version\n }\n }\n\n static async loadFromUrl(url: string): Promise<PluginRegistry> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to fetch registry: ${response.status} ${response.statusText}`,\n context: { url, status: response.status },\n })\n }\n const data = (await response.json()) as RegistryData\n return new PluginRegistry(data, { registryUrl: url })\n } catch (error) {\n if (error instanceof PluginRegistryError) throw error\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to load registry: ${error instanceof Error ? error.message : String(error)}`,\n context: { url },\n })\n }\n }\n\n getVersion(): string {\n return this.registryVersion\n }\n\n search(query: string): PluginInfo[] {\n const native = requireNative()\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n\n getAll(): PluginInfo[] {\n return [...this.plugins]\n }\n\n getByName(pluginName: string): PluginInfo | undefined {\n const nameWithoutVersion = pluginName.split(\"@\").slice(0, 2).join(\"@\")\n return this.plugins.find((plugin) => plugin.name === nameWithoutVersion)\n }\n\n install(pluginName: string, options: InstallOptions = {}): InstallResult {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n\n const native = requireNative()\n const isValidName = native.pluginValidateName(pluginName)\n\n if (!isValidName) {\n throw new PluginRegistryError({\n code: \"INVALID_PLUGIN_NAME\",\n message: `Nama plugin tidak valid: '${pluginName}'.`,\n context: {\n pluginName,\n expectedPattern: String(PLUGIN_NAME_REGEX),\n },\n })\n }\n\n const knownPlugin = this.getByName(pluginName)\n const isExternal = !knownPlugin\n\n if (isExternal && !options.allowExternal) {\n throw new PluginRegistryError({\n code: \"PLUGIN_NOT_FOUND\",\n message: `Plugin '${pluginName}' tidak ditemukan di registry. Coba cari dengan 'tw-plugin search <keyword>'.`,\n context: {\n pluginName,\n allowExternal: false,\n },\n })\n }\n\n if (isExternal && options.allowExternal && !options.confirmExternal) {\n throw new PluginRegistryError({\n code: \"EXTERNAL_CONFIRMATION_REQUIRED\",\n message: `Plugin eksternal '${pluginName}' butuh konfirmasi. Jalankan ulang dengan --allow-external --yes.`,\n context: {\n pluginName,\n allowExternal: true,\n },\n })\n }\n\n const command = `${npmBin} install ${pluginName}`\n if (options.dryRun) {\n return { plugin: pluginName, installed: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"install\", pluginName], { stdio: \"inherit\" })\n if (child.error) {\n throw new PluginRegistryError({\n code: \"INSTALL_COMMAND_FAILED\",\n message: `Gagal menjalankan perintah install: ${command}`,\n context: {\n pluginName,\n command,\n reason: child.error.message,\n },\n })\n }\n\n if (child.status !== 0) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Install gagal (${child.status ?? 1}): ${command}`,\n context: {\n pluginName,\n command,\n exitCode: child.status ?? 1,\n },\n })\n }\n\n return {\n plugin: pluginName,\n installed: true,\n command,\n exitCode: 0,\n }\n }\n\n uninstall(\n pluginName: string,\n options: { dryRun?: boolean; npmBin?: string } = {}\n ): {\n plugin: string\n uninstalled: boolean\n command: string\n exitCode: number\n } {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n const command = `${npmBin} uninstall ${pluginName}`\n\n if (options.dryRun) {\n return { plugin: pluginName, uninstalled: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"uninstall\", pluginName], { stdio: \"inherit\" })\n if (child.status !== 0 && child.status !== null) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Uninstall gagal (${child.status}): ${command}`,\n context: { pluginName, command, exitCode: child.status },\n })\n }\n\n return {\n plugin: pluginName,\n uninstalled: true,\n command,\n exitCode: child.status ?? 0,\n }\n }\n\n verifyIntegrity(pluginName: string): { ok: boolean; reason?: string } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { ok: false, reason: `Plugin '${pluginName}' not in registry` }\n if (!plugin.integrity) {\n return { ok: true, reason: \"no checksum registered (skip)\" }\n }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { ok: false, reason: \"plugin not installed\" }\n const content = readFileSync(pkgPath, \"utf8\")\n const native = requireNative()\n const ok = native.pluginVerifyIntegrity(content, plugin.integrity!)\n return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` }\n } catch (e: unknown) {\n return {\n ok: false,\n reason: `Integrity check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkForUpdate(pluginName: string): {\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { hasUpdate: false, error: `Plugin '${pluginName}' not in registry` }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { hasUpdate: false, error: \"plugin not installed\" }\n const current = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n const latest = plugin.version\n const native = requireNative()\n const hasUpdate = native.pluginSemverHasUpdate(current as string, latest)\n return { hasUpdate, current: current as string, latest }\n } catch (e: unknown) {\n return {\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkAllUpdates(): Array<{\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }> {\n type UpdateResult = {\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }\n const native = requireNative()\n\n // FS I/O stays in JS — gather installed versions for every registry plugin.\n const installed: Array<{ name: string; version: string }> = []\n const byName = new Map<string, UpdateResult>()\n for (const p of this.plugins) {\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", p.name, \"package.json\")\n if (!existsSync(pkgPath)) {\n byName.set(p.name, { name: p.name, hasUpdate: false, error: \"plugin not installed\" })\n continue\n }\n const version = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n installed.push({ name: p.name, version: version as string })\n } catch (e: unknown) {\n byName.set(p.name, {\n name: p.name,\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n\n // Single native batch call does all semver comparisons (1 FFI crossing, not N).\n const results = JSON.parse(\n native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))\n ) as UpdateResult[]\n for (const r of results) byName.set(r.name, r)\n\n // Preserve registry order.\n return this.plugins.map((p) => byName.get(p.name)).filter((r): r is UpdateResult => r !== undefined)\n }\n}\n\nconst _state = { defaultRegistry: null as PluginRegistry | null }\n\nexport function getRegistry(): PluginRegistry {\n if (!_state.defaultRegistry) {\n const registryData = require(\"../registry.json\") as RegistryData\n _state.defaultRegistry = new PluginRegistry(registryData)\n }\n return _state.defaultRegistry\n}\n\nexport const registry = getRegistry()"],"mappings":"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","names":["exports","module"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../src/umbrella/plugin-registry.ts","../node_modules/tsup/assets/cjs_shims.js","../packages/domain/plugin-registry/src/index.ts"],"sourcesContent":["{\n \"version\": \"5.0.0\",\n \"updatedAt\": \"2026-03-23\",\n \"official\": [\n {\n \"name\": \"@tailwind-styled/plugin-animation\",\n \"description\": \"Animation presets and keyframes — enter/exit transitions, spring physics, scroll-triggered\",\n \"version\": \"5.0.0\",\n \"tags\": [\"animation\", \"motion\", \"transition\", \"keyframes\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/packages/animate\",\n \"install\": \"npm install @tailwind-styled/plugin-animation@5.0.0\",\n \"integrity\": \"sha256-abc123\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-typography\",\n \"description\": \"Prose and typography utilities — headings, body, code blocks, with dark mode\",\n \"version\": \"5.0.0\",\n \"tags\": [\"typography\", \"prose\", \"markdown\", \"content\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-typography@5.0.0\",\n \"integrity\": \"sha256-def456\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-forms\",\n \"description\": \"Form input styling helpers — reset, validation states, custom checkboxes/radios\",\n \"version\": \"5.0.0\",\n \"tags\": [\"forms\", \"inputs\", \"validation\", \"checkbox\", \"radio\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-forms@5.0.0\",\n \"integrity\": \"sha256-ghi789\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-container-queries\",\n \"description\": \"Container query utilities — @container breakpoints for component-level responsiveness\",\n \"version\": \"5.0.0\",\n \"tags\": [\"container-queries\", \"responsive\", \"layout\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-container-queries@5.0.0\",\n \"integrity\": \"sha256-jkl012\"\n }\n ],\n \"community\": [\n {\n \"name\": \"tailwind-styled-animate\",\n \"description\": \"Community animation variants — bounce, pulse, wiggle, and more\",\n \"version\": \"0.1.0\",\n \"tags\": [\"animation\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-animate\"\n },\n {\n \"name\": \"tailwind-styled-icons\",\n \"description\": \"SVG icon system integrated with tw() variant API\",\n \"version\": \"0.1.0\",\n \"tags\": [\"icons\", \"svg\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-icons\"\n }\n ]\n}\n","export * from \"@tailwind-styled/plugin-registry\"\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n// ── Native bridge (lazy-loaded to avoid circular deps) ──────────────────────\ntype NativePluginRegistry = {\n pluginSearch: (pluginsJson: string, query: string) => string\n pluginValidateName: (name: string) => boolean\n pluginVerifyIntegrity: (content: string, expectedIntegrity: string) => boolean\n pluginSemverHasUpdate: (current: string, latest: string) => boolean\n pluginCheckAllUpdates: (installedJson: string, registryJson: string) => string\n}\nlet _native: NativePluginRegistry | null | undefined = undefined\nfunction getNative(): NativePluginRegistry | null {\n if (_native !== undefined) return _native\n try {\n const runtimeDir = typeof __dirname === \"string\" && __dirname.length > 0\n ? __dirname\n : typeof import.meta !== \"undefined\" && import.meta.url\n ? fileURLToPath(new URL(\".\", import.meta.url))\n : process.cwd()\n const req = createRequire(join(runtimeDir, \"noop.cjs\"))\n const _pa = `${process.platform}-${process.arch}`\n const _paGnu = _pa === \"linux-x64\" ? \"linux-x64-gnu\" : _pa === \"linux-arm64\" ? \"linux-arm64-gnu\" : _pa\n const candidates = [\n // npm install case: dist/../native/\n resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_pa}.node`),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_paGnu}.node`),\n resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // cwd fallback\n resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\n resolve(process.cwd(), \"native\", \"tailwind_styled_parser.node\"),\n // monorepo dev: 4-level up\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // 3-level fallback\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n ]\n for (const c of candidates) {\n try {\n const mod = req(c) as Record<string, unknown>\n if (typeof mod?.pluginSearch === \"function\") {\n return (_native = mod as unknown as NativePluginRegistry)\n }\n } catch { /* continue */ }\n }\n } catch { /* ignore */ }\n return (_native = null)\n}\n\nconst NATIVE_UNAVAILABLE_MESSAGE =\n \"[tailwind-styled/plugin-registry] Native binding is required but not available.\\n\" +\n \"Please ensure you have run: npm run build:rust\"\n\n/**\n * Native-only accessor. Throws if the Rust binding is missing.\n * The TS layer is a thin wrapper — no JS fallbacks (native-first philosophy).\n */\nfunction requireNative(): NativePluginRegistry {\n const native = getNative()\n if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n return native\n}\n\nconst PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\\/)?[a-z0-9-]+(@[0-9]+\\.[0-9]+\\.[0-9]+)?$/\n\nexport interface PluginInfo {\n name: string\n description: string\n version: string\n tags: string[]\n official?: boolean\n docs?: string\n install?: string\n integrity?: string\n}\n\ninterface RegistryData {\n version: string\n official: PluginInfo[]\n community: PluginInfo[]\n}\n\nexport interface InstallResult {\n plugin: string\n installed: boolean\n command: string\n exitCode: number\n}\n\nexport type PluginRegistryErrorCode =\n | \"INVALID_PLUGIN_NAME\"\n | \"PLUGIN_NOT_FOUND\"\n | \"EXTERNAL_CONFIRMATION_REQUIRED\"\n | \"INSTALL_COMMAND_FAILED\"\n | \"INSTALL_FAILED\"\n | \"NETWORK_ERROR\"\n | \"REGISTRY_LOAD_FAILED\"\n\nexport interface PluginRegistryErrorPayload {\n code: PluginRegistryErrorCode\n message: string\n context?: Record<string, unknown>\n}\n\nexport class PluginRegistryError extends Error {\n readonly code: PluginRegistryErrorCode\n readonly context?: Record<string, unknown>\n\n constructor(payload: PluginRegistryErrorPayload) {\n super(payload.message)\n this.name = \"PluginRegistryError\"\n this.code = payload.code\n this.context = payload.context\n }\n\n toObject(): PluginRegistryErrorPayload {\n return {\n code: this.code,\n message: this.message,\n context: this.context,\n }\n }\n}\n\nexport interface InstallOptions {\n dryRun?: boolean\n npmBin?: string\n allowExternal?: boolean\n confirmExternal?: boolean\n}\n\nexport interface RegistryOptions {\n registryUrl?: string\n}\n\nexport class PluginRegistry {\n private readonly plugins: PluginInfo[]\n private readonly registryVersion: string\n\n constructor(registryData?: RegistryData, options: RegistryOptions = {}) {\n if (options.registryUrl) {\n this.plugins = []\n this.registryVersion = \"0.0.0\"\n } else {\n const data = registryData\n const version = data?.version ?? \"4.2.0\"\n const official = (data?.official ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: true,\n docs: item.docs,\n install: item.install,\n integrity: item.integrity,\n }))\n const community = (data?.community ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: false,\n }))\n this.plugins = [...official, ...community]\n this.registryVersion = version\n }\n }\n\n static async loadFromUrl(url: string): Promise<PluginRegistry> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to fetch registry: ${response.status} ${response.statusText}`,\n context: { url, status: response.status },\n })\n }\n const data = (await response.json()) as RegistryData\n return new PluginRegistry(data, { registryUrl: url })\n } catch (error) {\n if (error instanceof PluginRegistryError) throw error\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to load registry: ${error instanceof Error ? error.message : String(error)}`,\n context: { url },\n })\n }\n }\n\n getVersion(): string {\n return this.registryVersion\n }\n\n search(query: string): PluginInfo[] {\n const native = requireNative()\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n\n getAll(): PluginInfo[] {\n return [...this.plugins]\n }\n\n getByName(pluginName: string): PluginInfo | undefined {\n const nameWithoutVersion = pluginName.split(\"@\").slice(0, 2).join(\"@\")\n return this.plugins.find((plugin) => plugin.name === nameWithoutVersion)\n }\n\n install(pluginName: string, options: InstallOptions = {}): InstallResult {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n\n const native = requireNative()\n const isValidName = native.pluginValidateName(pluginName)\n\n if (!isValidName) {\n throw new PluginRegistryError({\n code: \"INVALID_PLUGIN_NAME\",\n message: `Nama plugin tidak valid: '${pluginName}'.`,\n context: {\n pluginName,\n expectedPattern: String(PLUGIN_NAME_REGEX),\n },\n })\n }\n\n const knownPlugin = this.getByName(pluginName)\n const isExternal = !knownPlugin\n\n if (isExternal && !options.allowExternal) {\n throw new PluginRegistryError({\n code: \"PLUGIN_NOT_FOUND\",\n message: `Plugin '${pluginName}' tidak ditemukan di registry. Coba cari dengan 'tw-plugin search <keyword>'.`,\n context: {\n pluginName,\n allowExternal: false,\n },\n })\n }\n\n if (isExternal && options.allowExternal && !options.confirmExternal) {\n throw new PluginRegistryError({\n code: \"EXTERNAL_CONFIRMATION_REQUIRED\",\n message: `Plugin eksternal '${pluginName}' butuh konfirmasi. Jalankan ulang dengan --allow-external --yes.`,\n context: {\n pluginName,\n allowExternal: true,\n },\n })\n }\n\n const command = `${npmBin} install ${pluginName}`\n if (options.dryRun) {\n return { plugin: pluginName, installed: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"install\", pluginName], { stdio: \"inherit\" })\n if (child.error) {\n throw new PluginRegistryError({\n code: \"INSTALL_COMMAND_FAILED\",\n message: `Gagal menjalankan perintah install: ${command}`,\n context: {\n pluginName,\n command,\n reason: child.error.message,\n },\n })\n }\n\n if (child.status !== 0) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Install gagal (${child.status ?? 1}): ${command}`,\n context: {\n pluginName,\n command,\n exitCode: child.status ?? 1,\n },\n })\n }\n\n return {\n plugin: pluginName,\n installed: true,\n command,\n exitCode: 0,\n }\n }\n\n uninstall(\n pluginName: string,\n options: { dryRun?: boolean; npmBin?: string } = {}\n ): {\n plugin: string\n uninstalled: boolean\n command: string\n exitCode: number\n } {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n const command = `${npmBin} uninstall ${pluginName}`\n\n if (options.dryRun) {\n return { plugin: pluginName, uninstalled: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"uninstall\", pluginName], { stdio: \"inherit\" })\n if (child.status !== 0 && child.status !== null) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Uninstall gagal (${child.status}): ${command}`,\n context: { pluginName, command, exitCode: child.status },\n })\n }\n\n return {\n plugin: pluginName,\n uninstalled: true,\n command,\n exitCode: child.status ?? 0,\n }\n }\n\n verifyIntegrity(pluginName: string): { ok: boolean; reason?: string } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { ok: false, reason: `Plugin '${pluginName}' not in registry` }\n if (!plugin.integrity) {\n return { ok: true, reason: \"no checksum registered (skip)\" }\n }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { ok: false, reason: \"plugin not installed\" }\n const content = readFileSync(pkgPath, \"utf8\")\n const native = requireNative()\n const ok = native.pluginVerifyIntegrity(content, plugin.integrity!)\n return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` }\n } catch (e: unknown) {\n return {\n ok: false,\n reason: `Integrity check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkForUpdate(pluginName: string): {\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { hasUpdate: false, error: `Plugin '${pluginName}' not in registry` }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { hasUpdate: false, error: \"plugin not installed\" }\n const current = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n const latest = plugin.version\n const native = requireNative()\n const hasUpdate = native.pluginSemverHasUpdate(current as string, latest)\n return { hasUpdate, current: current as string, latest }\n } catch (e: unknown) {\n return {\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkAllUpdates(): Array<{\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }> {\n type UpdateResult = {\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }\n const native = requireNative()\n\n // FS I/O stays in JS — gather installed versions for every registry plugin.\n const installed: Array<{ name: string; version: string }> = []\n const byName = new Map<string, UpdateResult>()\n for (const p of this.plugins) {\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", p.name, \"package.json\")\n if (!existsSync(pkgPath)) {\n byName.set(p.name, { name: p.name, hasUpdate: false, error: \"plugin not installed\" })\n continue\n }\n const version = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n installed.push({ name: p.name, version: version as string })\n } catch (e: unknown) {\n byName.set(p.name, {\n name: p.name,\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n\n // Single native batch call does all semver comparisons (1 FFI crossing, not N).\n const results = JSON.parse(\n native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))\n ) as UpdateResult[]\n for (const r of results) byName.set(r.name, r)\n\n // Preserve registry order.\n return this.plugins.map((p) => byName.get(p.name)).filter((r): r is UpdateResult => r !== undefined)\n }\n}\n\nconst _state = { defaultRegistry: null as PluginRegistry | null }\n\nexport function getRegistry(): PluginRegistry {\n if (!_state.defaultRegistry) {\n const registryData = require(\"../registry.json\") as RegistryData\n _state.defaultRegistry = new PluginRegistry(registryData)\n }\n return _state.defaultRegistry\n}\n\nexport const registry = getRegistry()"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,kDAAAA,UAAAC,SAAA;AAAA,IAAAA,QAAA;AAAA,MACE,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,QACV;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,aAAa,UAAU,cAAc,WAAW;AAAA,UACzD,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,WAAa;AAAA,QACf;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,cAAc,SAAS,YAAY,SAAS;AAAA,UACrD,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,WAAa;AAAA,QACf;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,SAAS,UAAU,cAAc,YAAY,OAAO;AAAA,UAC7D,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,WAAa;AAAA,QACf;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,qBAAqB,cAAc,QAAQ;AAAA,UACpD,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,WAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,WAAa;AAAA,QACX;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,aAAa,WAAW;AAAA,UACjC,QAAU;AAAA,UACV,SAAW;AAAA,QACb;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,aAAe;AAAA,UACf,SAAW;AAAA,UACX,MAAQ,CAAC,SAAS,OAAO,WAAW;AAAA,UACpC,QAAU;AAAA,UACV,SAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACZ9D,gCAA0B;AAC1B,qBAAyC;AACzC,yBAA8B;AAC9B,uBAA8B;AAC9B,sBAA8B;AAJ9B;AAcA,IAAI,UAAmD;AACvD,SAAS,YAAyC;AAChD,MAAI,YAAY,OAAW,QAAO;AAClC,MAAI;AACF,UAAM,aAAa,OAAO,cAAc,YAAY,UAAU,SAAS,IACnE,YACA,OAAO,gBAAgB,eAAe,oBACpC,+BAAc,IAAI,IAAI,KAAK,aAAe,CAAC,IAC3C,QAAQ,IAAI;AAClB,UAAM,UAAM,sCAAc,uBAAK,YAAY,UAAU,CAAC;AACtD,UAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAC/C,UAAM,SAAS,QAAQ,cAAc,kBAAkB,QAAQ,gBAAgB,oBAAoB;AACnG,UAAM,aAAa;AAAA;AAAA,UAEjB,0BAAQ,YAAY,MAAM,UAAU,6BAA6B;AAAA,UACjE,0BAAQ,YAAY,MAAM,UAAU,0BAA0B,GAAG,OAAO;AAAA,UACxE,0BAAQ,YAAY,MAAM,UAAU,0BAA0B,MAAM,OAAO;AAAA,UAC3E,0BAAQ,YAAY,MAAM,UAAU,6BAA6B;AAAA;AAAA,UAEjE,0BAAQ,QAAQ,IAAI,GAAG,UAAU,6BAA6B;AAAA,UAC9D,0BAAQ,QAAQ,IAAI,GAAG,UAAU,6BAA6B;AAAA;AAAA,UAE9D,0BAAQ,YAAY,MAAM,MAAM,MAAM,MAAM,UAAU,6BAA6B;AAAA,UACnF,0BAAQ,YAAY,MAAM,MAAM,MAAM,MAAM,UAAU,6BAA6B;AAAA;AAAA,UAEnF,0BAAQ,YAAY,MAAM,MAAM,MAAM,UAAU,6BAA6B;AAAA,UAC7E,0BAAQ,YAAY,MAAM,MAAM,MAAM,UAAU,6BAA6B;AAAA,IAC/E;AACA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,cAAM,MAAM,IAAI,CAAC;AACjB,YAAI,OAAO,KAAK,iBAAiB,YAAY;AAC3C,iBAAQ,UAAU;AAAA,QACpB;AAAA,MACF,QAAQ;AAAA,MAAiB;AAAA,IAC3B;AAAA,EACF,QAAQ;AAAA,EAAe;AACvB,SAAQ,UAAU;AACpB;AAEA,IAAM,6BACJ;AAOF,SAAS,gBAAsC;AAC7C,QAAM,SAAS,UAAU;AACzB,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACvD,SAAO;AACT;AAEA,IAAM,oBAAoB;AAyCnB,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC;AAAA,EACA;AAAA,EAET,YAAY,SAAqC;AAC/C,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAuC;AACrC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;AAaO,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACT;AAAA,EACA;AAAA,EAEjB,YAAY,cAA6B,UAA2B,CAAC,GAAG;AACtE,QAAI,QAAQ,aAAa;AACvB,WAAK,UAAU,CAAC;AAChB,WAAK,kBAAkB;AAAA,IACzB,OAAO;AACL,YAAM,OAAO;AACb,YAAM,UAAU,MAAM,WAAW;AACjC,YAAM,YAAY,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,QACrD,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,MAAM,CAAC,GAAG,KAAK,IAAI;AAAA,QACnB,UAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,MAClB,EAAE;AACF,YAAM,aAAa,MAAM,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,QACvD,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,MAAM,CAAC,GAAG,KAAK,IAAI;AAAA,QACnB,UAAU;AAAA,MACZ,EAAE;AACF,WAAK,UAAU,CAAC,GAAG,UAAU,GAAG,SAAS;AACzC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,aAAa,YAAY,KAAsC;AAC7D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,oBAAoB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS,6BAA6B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,UAC5E,SAAS,EAAE,KAAK,QAAQ,SAAS,OAAO;AAAA,QAC1C,CAAC;AAAA,MACH;AACA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,aAAO,IAAI,gBAAe,MAAM,EAAE,aAAa,IAAI,CAAC;AAAA,IACtD,SAAS,OAAO;AACd,UAAI,iBAAiB,oBAAqB,OAAM;AAChD,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC3F,SAAS,EAAE,IAAI;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,OAA6B;AAClC,UAAM,SAAS,cAAc;AAC7B,WAAO,KAAK,MAAM,OAAO,aAAa,KAAK,UAAU,KAAK,OAAO,GAAG,KAAK,CAAC;AAAA,EAC5E;AAAA,EAEA,SAAuB;AACrB,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,UAAU,YAA4C;AACpD,UAAM,qBAAqB,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACrE,WAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,kBAAkB;AAAA,EACzE;AAAA,EAEA,QAAQ,YAAoB,UAA0B,CAAC,GAAkB;AACvE,UAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,qBAAqB;AAElE,UAAM,SAAS,cAAc;AAC7B,UAAM,cAAc,OAAO,mBAAmB,UAAU;AAExD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,6BAA6B,UAAU;AAAA,QAChD,SAAS;AAAA,UACP;AAAA,UACA,iBAAiB,OAAO,iBAAiB;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,KAAK,UAAU,UAAU;AAC7C,UAAM,aAAa,CAAC;AAEpB,QAAI,cAAc,CAAC,QAAQ,eAAe;AACxC,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,WAAW,UAAU;AAAA,QAC9B,SAAS;AAAA,UACP;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,cAAc,QAAQ,iBAAiB,CAAC,QAAQ,iBAAiB;AACnE,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,qBAAqB,UAAU;AAAA,QACxC,SAAS;AAAA,UACP;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,GAAG,MAAM,YAAY,UAAU;AAC/C,QAAI,QAAQ,QAAQ;AAClB,aAAO,EAAE,QAAQ,YAAY,WAAW,MAAM,SAAS,UAAU,EAAE;AAAA,IACrE;AAEA,UAAM,YAAQ,qCAAU,QAAQ,CAAC,WAAW,UAAU,GAAG,EAAE,OAAO,UAAU,CAAC;AAC7E,QAAI,MAAM,OAAO;AACf,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,uCAAuC,OAAO;AAAA,QACvD,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,QAAQ,MAAM,MAAM;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,kBAAkB,MAAM,UAAU,CAAC,MAAM,OAAO;AAAA,QACzD,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,UAAU,MAAM,UAAU;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,UACE,YACA,UAAiD,CAAC,GAMlD;AACA,UAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,qBAAqB;AAClE,UAAM,UAAU,GAAG,MAAM,cAAc,UAAU;AAEjD,QAAI,QAAQ,QAAQ;AAClB,aAAO,EAAE,QAAQ,YAAY,aAAa,MAAM,SAAS,UAAU,EAAE;AAAA,IACvE;AAEA,UAAM,YAAQ,qCAAU,QAAQ,CAAC,aAAa,UAAU,GAAG,EAAE,OAAO,UAAU,CAAC;AAC/E,QAAI,MAAM,WAAW,KAAK,MAAM,WAAW,MAAM;AAC/C,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,oBAAoB,MAAM,MAAM,MAAM,OAAO;AAAA,QACtD,SAAS,EAAE,YAAY,SAAS,UAAU,MAAM,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aAAa;AAAA,MACb;AAAA,MACA,UAAU,MAAM,UAAU;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAsD;AACpE,UAAM,SAAS,KAAK,UAAU,UAAU;AACxC,QAAI,CAAC,OAAQ,QAAO,EAAE,IAAI,OAAO,QAAQ,WAAW,UAAU,oBAAoB;AAClF,QAAI,CAAC,OAAO,WAAW;AACrB,aAAO,EAAE,IAAI,MAAM,QAAQ,gCAAgC;AAAA,IAC7D;AACA,QAAI;AACF,YAAM,cAAU,uBAAK,QAAQ,IAAI,GAAG,gBAAgB,YAAY,cAAc;AAC9E,UAAI,KAAC,2BAAW,OAAO,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,uBAAuB;AAC7E,YAAM,cAAU,6BAAa,SAAS,MAAM;AAC5C,YAAM,SAAS,cAAc;AAC7B,YAAM,KAAK,OAAO,sBAAsB,SAAS,OAAO,SAAU;AAClE,aAAO,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,OAAO,QAAQ,gCAAgC,OAAO,SAAS,GAAG;AAAA,IACrG,SAAS,GAAY;AACnB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,2BAA2B,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,YAKb;AACA,UAAM,SAAS,KAAK,UAAU,UAAU;AACxC,QAAI,CAAC,OAAQ,QAAO,EAAE,WAAW,OAAO,OAAO,WAAW,UAAU,oBAAoB;AACxF,QAAI;AACF,YAAM,cAAU,uBAAK,QAAQ,IAAI,GAAG,gBAAgB,YAAY,cAAc;AAC9E,UAAI,KAAC,2BAAW,OAAO,EAAG,QAAO,EAAE,WAAW,OAAO,OAAO,uBAAuB;AACnF,YAAM,UAAU,KAAK,UAAM,6BAAa,SAAS,MAAM,CAAC,EAAE,WAAW;AACrE,YAAM,SAAS,OAAO;AACtB,YAAM,SAAS,cAAc;AAC7B,YAAM,YAAY,OAAO,sBAAsB,SAAmB,MAAM;AACxE,aAAO,EAAE,WAAW,SAA4B,OAAO;AAAA,IACzD,SAAS,GAAY;AACnB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,OAAO,wBAAwB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAMG;AAQD,UAAM,SAAS,cAAc;AAG7B,UAAM,YAAsD,CAAC;AAC7D,UAAM,SAAS,oBAAI,IAA0B;AAC7C,eAAW,KAAK,KAAK,SAAS;AAC5B,UAAI;AACF,cAAM,cAAU,uBAAK,QAAQ,IAAI,GAAG,gBAAgB,EAAE,MAAM,cAAc;AAC1E,YAAI,KAAC,2BAAW,OAAO,GAAG;AACxB,iBAAO,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,OAAO,OAAO,uBAAuB,CAAC;AACpF;AAAA,QACF;AACA,cAAM,UAAU,KAAK,UAAM,6BAAa,SAAS,MAAM,CAAC,EAAE,WAAW;AACrE,kBAAU,KAAK,EAAE,MAAM,EAAE,MAAM,QAA2B,CAAC;AAAA,MAC7D,SAAS,GAAY;AACnB,eAAO,IAAI,EAAE,MAAM;AAAA,UACjB,MAAM,EAAE;AAAA,UACR,WAAW;AAAA,UACX,OAAO,wBAAwB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,QAC3E,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,UAAU,KAAK;AAAA,MACnB,OAAO,sBAAsB,KAAK,UAAU,SAAS,GAAG,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,IACtF;AACA,eAAW,KAAK,QAAS,QAAO,IAAI,EAAE,MAAM,CAAC;AAG7C,WAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,MAAyB,MAAM,MAAS;AAAA,EACrG;AACF;AAEA,IAAM,SAAS,EAAE,iBAAiB,KAA8B;AAEzD,SAAS,cAA8B;AAC5C,MAAI,CAAC,OAAO,iBAAiB;AAC3B,UAAM,eAAe;AACrB,WAAO,kBAAkB,IAAI,eAAe,YAAY;AAAA,EAC1D;AACA,SAAO,OAAO;AAChB;AAEO,IAAM,WAAW,YAAY;","names":["exports","module"]}
|
package/dist/plugin-registry.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
2
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
2
|
var __commonJS = (cb, mod) => function __require() {
|
|
4
3
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
@@ -382,4 +381,5 @@ export {
|
|
|
382
381
|
getRegistry,
|
|
383
382
|
registry
|
|
384
383
|
};
|
|
384
|
+
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
385
385
|
//# sourceMappingURL=plugin-registry.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../node_modules/tsup/assets/esm_shims.js","../packages/domain/plugin-registry/src/index.ts"],"sourcesContent":["{\n \"version\": \"5.0.0\",\n \"updatedAt\": \"2026-03-23\",\n \"official\": [\n {\n \"name\": \"@tailwind-styled/plugin-animation\",\n \"description\": \"Animation presets and keyframes — enter/exit transitions, spring physics, scroll-triggered\",\n \"version\": \"5.0.0\",\n \"tags\": [\"animation\", \"motion\", \"transition\", \"keyframes\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/packages/animate\",\n \"install\": \"npm install @tailwind-styled/plugin-animation@5.0.0\",\n \"integrity\": \"sha256-abc123\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-typography\",\n \"description\": \"Prose and typography utilities — headings, body, code blocks, with dark mode\",\n \"version\": \"5.0.0\",\n \"tags\": [\"typography\", \"prose\", \"markdown\", \"content\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-typography@5.0.0\",\n \"integrity\": \"sha256-def456\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-forms\",\n \"description\": \"Form input styling helpers — reset, validation states, custom checkboxes/radios\",\n \"version\": \"5.0.0\",\n \"tags\": [\"forms\", \"inputs\", \"validation\", \"checkbox\", \"radio\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-forms@5.0.0\",\n \"integrity\": \"sha256-ghi789\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-container-queries\",\n \"description\": \"Container query utilities — @container breakpoints for component-level responsiveness\",\n \"version\": \"5.0.0\",\n \"tags\": [\"container-queries\", \"responsive\", \"layout\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-container-queries@5.0.0\",\n \"integrity\": \"sha256-jkl012\"\n }\n ],\n \"community\": [\n {\n \"name\": \"tailwind-styled-animate\",\n \"description\": \"Community animation variants — bounce, pulse, wiggle, and more\",\n \"version\": \"0.1.0\",\n \"tags\": [\"animation\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-animate\"\n },\n {\n \"name\": \"tailwind-styled-icons\",\n \"description\": \"SVG icon system integrated with tw() variant API\",\n \"version\": \"0.1.0\",\n \"tags\": [\"icons\", \"svg\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-icons\"\n }\n ]\n}\n","// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n// ── Native bridge (lazy-loaded to avoid circular deps) ──────────────────────\ntype NativePluginRegistry = {\n pluginSearch: (pluginsJson: string, query: string) => string\n pluginValidateName: (name: string) => boolean\n pluginVerifyIntegrity: (content: string, expectedIntegrity: string) => boolean\n pluginSemverHasUpdate: (current: string, latest: string) => boolean\n pluginCheckAllUpdates: (installedJson: string, registryJson: string) => string\n}\nlet _native: NativePluginRegistry | null | undefined = undefined\nfunction getNative(): NativePluginRegistry | null {\n if (_native !== undefined) return _native\n try {\n const runtimeDir = typeof __dirname === \"string\" && __dirname.length > 0\n ? __dirname\n : typeof import.meta !== \"undefined\" && import.meta.url\n ? fileURLToPath(new URL(\".\", import.meta.url))\n : process.cwd()\n const req = createRequire(join(runtimeDir, \"noop.cjs\"))\n const _pa = `${process.platform}-${process.arch}`\n const _paGnu = _pa === \"linux-x64\" ? \"linux-x64-gnu\" : _pa === \"linux-arm64\" ? \"linux-arm64-gnu\" : _pa\n const candidates = [\n // npm install case: dist/../native/\n resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_pa}.node`),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_paGnu}.node`),\n resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // cwd fallback\n resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\n resolve(process.cwd(), \"native\", \"tailwind_styled_parser.node\"),\n // monorepo dev: 4-level up\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // 3-level fallback\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n ]\n for (const c of candidates) {\n try {\n const mod = req(c) as Record<string, unknown>\n if (typeof mod?.pluginSearch === \"function\") {\n return (_native = mod as unknown as NativePluginRegistry)\n }\n } catch { /* continue */ }\n }\n } catch { /* ignore */ }\n return (_native = null)\n}\n\nconst NATIVE_UNAVAILABLE_MESSAGE =\n \"[tailwind-styled/plugin-registry] Native binding is required but not available.\\n\" +\n \"Please ensure you have run: npm run build:rust\"\n\n/**\n * Native-only accessor. Throws if the Rust binding is missing.\n * The TS layer is a thin wrapper — no JS fallbacks (native-first philosophy).\n */\nfunction requireNative(): NativePluginRegistry {\n const native = getNative()\n if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n return native\n}\n\nconst PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\\/)?[a-z0-9-]+(@[0-9]+\\.[0-9]+\\.[0-9]+)?$/\n\nexport interface PluginInfo {\n name: string\n description: string\n version: string\n tags: string[]\n official?: boolean\n docs?: string\n install?: string\n integrity?: string\n}\n\ninterface RegistryData {\n version: string\n official: PluginInfo[]\n community: PluginInfo[]\n}\n\nexport interface InstallResult {\n plugin: string\n installed: boolean\n command: string\n exitCode: number\n}\n\nexport type PluginRegistryErrorCode =\n | \"INVALID_PLUGIN_NAME\"\n | \"PLUGIN_NOT_FOUND\"\n | \"EXTERNAL_CONFIRMATION_REQUIRED\"\n | \"INSTALL_COMMAND_FAILED\"\n | \"INSTALL_FAILED\"\n | \"NETWORK_ERROR\"\n | \"REGISTRY_LOAD_FAILED\"\n\nexport interface PluginRegistryErrorPayload {\n code: PluginRegistryErrorCode\n message: string\n context?: Record<string, unknown>\n}\n\nexport class PluginRegistryError extends Error {\n readonly code: PluginRegistryErrorCode\n readonly context?: Record<string, unknown>\n\n constructor(payload: PluginRegistryErrorPayload) {\n super(payload.message)\n this.name = \"PluginRegistryError\"\n this.code = payload.code\n this.context = payload.context\n }\n\n toObject(): PluginRegistryErrorPayload {\n return {\n code: this.code,\n message: this.message,\n context: this.context,\n }\n }\n}\n\nexport interface InstallOptions {\n dryRun?: boolean\n npmBin?: string\n allowExternal?: boolean\n confirmExternal?: boolean\n}\n\nexport interface RegistryOptions {\n registryUrl?: string\n}\n\nexport class PluginRegistry {\n private readonly plugins: PluginInfo[]\n private readonly registryVersion: string\n\n constructor(registryData?: RegistryData, options: RegistryOptions = {}) {\n if (options.registryUrl) {\n this.plugins = []\n this.registryVersion = \"0.0.0\"\n } else {\n const data = registryData\n const version = data?.version ?? \"4.2.0\"\n const official = (data?.official ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: true,\n docs: item.docs,\n install: item.install,\n integrity: item.integrity,\n }))\n const community = (data?.community ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: false,\n }))\n this.plugins = [...official, ...community]\n this.registryVersion = version\n }\n }\n\n static async loadFromUrl(url: string): Promise<PluginRegistry> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to fetch registry: ${response.status} ${response.statusText}`,\n context: { url, status: response.status },\n })\n }\n const data = (await response.json()) as RegistryData\n return new PluginRegistry(data, { registryUrl: url })\n } catch (error) {\n if (error instanceof PluginRegistryError) throw error\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to load registry: ${error instanceof Error ? error.message : String(error)}`,\n context: { url },\n })\n }\n }\n\n getVersion(): string {\n return this.registryVersion\n }\n\n search(query: string): PluginInfo[] {\n const native = requireNative()\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n\n getAll(): PluginInfo[] {\n return [...this.plugins]\n }\n\n getByName(pluginName: string): PluginInfo | undefined {\n const nameWithoutVersion = pluginName.split(\"@\").slice(0, 2).join(\"@\")\n return this.plugins.find((plugin) => plugin.name === nameWithoutVersion)\n }\n\n install(pluginName: string, options: InstallOptions = {}): InstallResult {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n\n const native = requireNative()\n const isValidName = native.pluginValidateName(pluginName)\n\n if (!isValidName) {\n throw new PluginRegistryError({\n code: \"INVALID_PLUGIN_NAME\",\n message: `Nama plugin tidak valid: '${pluginName}'.`,\n context: {\n pluginName,\n expectedPattern: String(PLUGIN_NAME_REGEX),\n },\n })\n }\n\n const knownPlugin = this.getByName(pluginName)\n const isExternal = !knownPlugin\n\n if (isExternal && !options.allowExternal) {\n throw new PluginRegistryError({\n code: \"PLUGIN_NOT_FOUND\",\n message: `Plugin '${pluginName}' tidak ditemukan di registry. Coba cari dengan 'tw-plugin search <keyword>'.`,\n context: {\n pluginName,\n allowExternal: false,\n },\n })\n }\n\n if (isExternal && options.allowExternal && !options.confirmExternal) {\n throw new PluginRegistryError({\n code: \"EXTERNAL_CONFIRMATION_REQUIRED\",\n message: `Plugin eksternal '${pluginName}' butuh konfirmasi. Jalankan ulang dengan --allow-external --yes.`,\n context: {\n pluginName,\n allowExternal: true,\n },\n })\n }\n\n const command = `${npmBin} install ${pluginName}`\n if (options.dryRun) {\n return { plugin: pluginName, installed: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"install\", pluginName], { stdio: \"inherit\" })\n if (child.error) {\n throw new PluginRegistryError({\n code: \"INSTALL_COMMAND_FAILED\",\n message: `Gagal menjalankan perintah install: ${command}`,\n context: {\n pluginName,\n command,\n reason: child.error.message,\n },\n })\n }\n\n if (child.status !== 0) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Install gagal (${child.status ?? 1}): ${command}`,\n context: {\n pluginName,\n command,\n exitCode: child.status ?? 1,\n },\n })\n }\n\n return {\n plugin: pluginName,\n installed: true,\n command,\n exitCode: 0,\n }\n }\n\n uninstall(\n pluginName: string,\n options: { dryRun?: boolean; npmBin?: string } = {}\n ): {\n plugin: string\n uninstalled: boolean\n command: string\n exitCode: number\n } {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n const command = `${npmBin} uninstall ${pluginName}`\n\n if (options.dryRun) {\n return { plugin: pluginName, uninstalled: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"uninstall\", pluginName], { stdio: \"inherit\" })\n if (child.status !== 0 && child.status !== null) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Uninstall gagal (${child.status}): ${command}`,\n context: { pluginName, command, exitCode: child.status },\n })\n }\n\n return {\n plugin: pluginName,\n uninstalled: true,\n command,\n exitCode: child.status ?? 0,\n }\n }\n\n verifyIntegrity(pluginName: string): { ok: boolean; reason?: string } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { ok: false, reason: `Plugin '${pluginName}' not in registry` }\n if (!plugin.integrity) {\n return { ok: true, reason: \"no checksum registered (skip)\" }\n }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { ok: false, reason: \"plugin not installed\" }\n const content = readFileSync(pkgPath, \"utf8\")\n const native = requireNative()\n const ok = native.pluginVerifyIntegrity(content, plugin.integrity!)\n return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` }\n } catch (e: unknown) {\n return {\n ok: false,\n reason: `Integrity check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkForUpdate(pluginName: string): {\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { hasUpdate: false, error: `Plugin '${pluginName}' not in registry` }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { hasUpdate: false, error: \"plugin not installed\" }\n const current = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n const latest = plugin.version\n const native = requireNative()\n const hasUpdate = native.pluginSemverHasUpdate(current as string, latest)\n return { hasUpdate, current: current as string, latest }\n } catch (e: unknown) {\n return {\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkAllUpdates(): Array<{\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }> {\n type UpdateResult = {\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }\n const native = requireNative()\n\n // FS I/O stays in JS — gather installed versions for every registry plugin.\n const installed: Array<{ name: string; version: string }> = []\n const byName = new Map<string, UpdateResult>()\n for (const p of this.plugins) {\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", p.name, \"package.json\")\n if (!existsSync(pkgPath)) {\n byName.set(p.name, { name: p.name, hasUpdate: false, error: \"plugin not installed\" })\n continue\n }\n const version = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n installed.push({ name: p.name, version: version as string })\n } catch (e: unknown) {\n byName.set(p.name, {\n name: p.name,\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n\n // Single native batch call does all semver comparisons (1 FFI crossing, not N).\n const results = JSON.parse(\n native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))\n ) as UpdateResult[]\n for (const r of results) byName.set(r.name, r)\n\n // Preserve registry order.\n return this.plugins.map((p) => byName.get(p.name)).filter((r): r is UpdateResult => r !== undefined)\n }\n}\n\nconst _state = { defaultRegistry: null as PluginRegistry | null }\n\nexport function getRegistry(): PluginRegistry {\n if (!_state.defaultRegistry) {\n const registryData = require(\"../registry.json\") as RegistryData\n _state.defaultRegistry = new PluginRegistry(registryData)\n }\n return _state.defaultRegistry\n}\n\nexport const registry = getRegistry()"],"mappings":"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","names":["fileURLToPath"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../node_modules/tsup/assets/esm_shims.js","../packages/domain/plugin-registry/src/index.ts"],"sourcesContent":["{\n \"version\": \"5.0.0\",\n \"updatedAt\": \"2026-03-23\",\n \"official\": [\n {\n \"name\": \"@tailwind-styled/plugin-animation\",\n \"description\": \"Animation presets and keyframes — enter/exit transitions, spring physics, scroll-triggered\",\n \"version\": \"5.0.0\",\n \"tags\": [\"animation\", \"motion\", \"transition\", \"keyframes\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/packages/animate\",\n \"install\": \"npm install @tailwind-styled/plugin-animation@5.0.0\",\n \"integrity\": \"sha256-abc123\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-typography\",\n \"description\": \"Prose and typography utilities — headings, body, code blocks, with dark mode\",\n \"version\": \"5.0.0\",\n \"tags\": [\"typography\", \"prose\", \"markdown\", \"content\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-typography@5.0.0\",\n \"integrity\": \"sha256-def456\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-forms\",\n \"description\": \"Form input styling helpers — reset, validation states, custom checkboxes/radios\",\n \"version\": \"5.0.0\",\n \"tags\": [\"forms\", \"inputs\", \"validation\", \"checkbox\", \"radio\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-forms@5.0.0\",\n \"integrity\": \"sha256-ghi789\"\n },\n {\n \"name\": \"@tailwind-styled/plugin-container-queries\",\n \"description\": \"Container query utilities — @container breakpoints for component-level responsiveness\",\n \"version\": \"5.0.0\",\n \"tags\": [\"container-queries\", \"responsive\", \"layout\"],\n \"docs\": \"https://github.com/tailwind-styled/tailwind-styled-v5/tree/main/docs/plugins\",\n \"install\": \"npm install @tailwind-styled/plugin-container-queries@5.0.0\",\n \"integrity\": \"sha256-jkl012\"\n }\n ],\n \"community\": [\n {\n \"name\": \"tailwind-styled-animate\",\n \"description\": \"Community animation variants — bounce, pulse, wiggle, and more\",\n \"version\": \"0.1.0\",\n \"tags\": [\"animation\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-animate\"\n },\n {\n \"name\": \"tailwind-styled-icons\",\n \"description\": \"SVG icon system integrated with tw() variant API\",\n \"version\": \"0.1.0\",\n \"tags\": [\"icons\", \"svg\", \"community\"],\n \"author\": \"community\",\n \"install\": \"npm install tailwind-styled-icons\"\n }\n ]\n}\n","// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { spawnSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n// ── Native bridge (lazy-loaded to avoid circular deps) ──────────────────────\ntype NativePluginRegistry = {\n pluginSearch: (pluginsJson: string, query: string) => string\n pluginValidateName: (name: string) => boolean\n pluginVerifyIntegrity: (content: string, expectedIntegrity: string) => boolean\n pluginSemverHasUpdate: (current: string, latest: string) => boolean\n pluginCheckAllUpdates: (installedJson: string, registryJson: string) => string\n}\nlet _native: NativePluginRegistry | null | undefined = undefined\nfunction getNative(): NativePluginRegistry | null {\n if (_native !== undefined) return _native\n try {\n const runtimeDir = typeof __dirname === \"string\" && __dirname.length > 0\n ? __dirname\n : typeof import.meta !== \"undefined\" && import.meta.url\n ? fileURLToPath(new URL(\".\", import.meta.url))\n : process.cwd()\n const req = createRequire(join(runtimeDir, \"noop.cjs\"))\n const _pa = `${process.platform}-${process.arch}`\n const _paGnu = _pa === \"linux-x64\" ? \"linux-x64-gnu\" : _pa === \"linux-arm64\" ? \"linux-arm64-gnu\" : _pa\n const candidates = [\n // npm install case: dist/../native/\n resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_pa}.node`),\n resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_paGnu}.node`),\n resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // cwd fallback\n resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\n resolve(process.cwd(), \"native\", \"tailwind_styled_parser.node\"),\n // monorepo dev: 4-level up\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n // 3-level fallback\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n ]\n for (const c of candidates) {\n try {\n const mod = req(c) as Record<string, unknown>\n if (typeof mod?.pluginSearch === \"function\") {\n return (_native = mod as unknown as NativePluginRegistry)\n }\n } catch { /* continue */ }\n }\n } catch { /* ignore */ }\n return (_native = null)\n}\n\nconst NATIVE_UNAVAILABLE_MESSAGE =\n \"[tailwind-styled/plugin-registry] Native binding is required but not available.\\n\" +\n \"Please ensure you have run: npm run build:rust\"\n\n/**\n * Native-only accessor. Throws if the Rust binding is missing.\n * The TS layer is a thin wrapper — no JS fallbacks (native-first philosophy).\n */\nfunction requireNative(): NativePluginRegistry {\n const native = getNative()\n if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\n return native\n}\n\nconst PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\\/)?[a-z0-9-]+(@[0-9]+\\.[0-9]+\\.[0-9]+)?$/\n\nexport interface PluginInfo {\n name: string\n description: string\n version: string\n tags: string[]\n official?: boolean\n docs?: string\n install?: string\n integrity?: string\n}\n\ninterface RegistryData {\n version: string\n official: PluginInfo[]\n community: PluginInfo[]\n}\n\nexport interface InstallResult {\n plugin: string\n installed: boolean\n command: string\n exitCode: number\n}\n\nexport type PluginRegistryErrorCode =\n | \"INVALID_PLUGIN_NAME\"\n | \"PLUGIN_NOT_FOUND\"\n | \"EXTERNAL_CONFIRMATION_REQUIRED\"\n | \"INSTALL_COMMAND_FAILED\"\n | \"INSTALL_FAILED\"\n | \"NETWORK_ERROR\"\n | \"REGISTRY_LOAD_FAILED\"\n\nexport interface PluginRegistryErrorPayload {\n code: PluginRegistryErrorCode\n message: string\n context?: Record<string, unknown>\n}\n\nexport class PluginRegistryError extends Error {\n readonly code: PluginRegistryErrorCode\n readonly context?: Record<string, unknown>\n\n constructor(payload: PluginRegistryErrorPayload) {\n super(payload.message)\n this.name = \"PluginRegistryError\"\n this.code = payload.code\n this.context = payload.context\n }\n\n toObject(): PluginRegistryErrorPayload {\n return {\n code: this.code,\n message: this.message,\n context: this.context,\n }\n }\n}\n\nexport interface InstallOptions {\n dryRun?: boolean\n npmBin?: string\n allowExternal?: boolean\n confirmExternal?: boolean\n}\n\nexport interface RegistryOptions {\n registryUrl?: string\n}\n\nexport class PluginRegistry {\n private readonly plugins: PluginInfo[]\n private readonly registryVersion: string\n\n constructor(registryData?: RegistryData, options: RegistryOptions = {}) {\n if (options.registryUrl) {\n this.plugins = []\n this.registryVersion = \"0.0.0\"\n } else {\n const data = registryData\n const version = data?.version ?? \"4.2.0\"\n const official = (data?.official ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: true,\n docs: item.docs,\n install: item.install,\n integrity: item.integrity,\n }))\n const community = (data?.community ?? []).map((item) => ({\n name: item.name,\n description: item.description,\n version: item.version,\n tags: [...item.tags],\n official: false,\n }))\n this.plugins = [...official, ...community]\n this.registryVersion = version\n }\n }\n\n static async loadFromUrl(url: string): Promise<PluginRegistry> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to fetch registry: ${response.status} ${response.statusText}`,\n context: { url, status: response.status },\n })\n }\n const data = (await response.json()) as RegistryData\n return new PluginRegistry(data, { registryUrl: url })\n } catch (error) {\n if (error instanceof PluginRegistryError) throw error\n throw new PluginRegistryError({\n code: \"NETWORK_ERROR\",\n message: `Failed to load registry: ${error instanceof Error ? error.message : String(error)}`,\n context: { url },\n })\n }\n }\n\n getVersion(): string {\n return this.registryVersion\n }\n\n search(query: string): PluginInfo[] {\n const native = requireNative()\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n\n getAll(): PluginInfo[] {\n return [...this.plugins]\n }\n\n getByName(pluginName: string): PluginInfo | undefined {\n const nameWithoutVersion = pluginName.split(\"@\").slice(0, 2).join(\"@\")\n return this.plugins.find((plugin) => plugin.name === nameWithoutVersion)\n }\n\n install(pluginName: string, options: InstallOptions = {}): InstallResult {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n\n const native = requireNative()\n const isValidName = native.pluginValidateName(pluginName)\n\n if (!isValidName) {\n throw new PluginRegistryError({\n code: \"INVALID_PLUGIN_NAME\",\n message: `Nama plugin tidak valid: '${pluginName}'.`,\n context: {\n pluginName,\n expectedPattern: String(PLUGIN_NAME_REGEX),\n },\n })\n }\n\n const knownPlugin = this.getByName(pluginName)\n const isExternal = !knownPlugin\n\n if (isExternal && !options.allowExternal) {\n throw new PluginRegistryError({\n code: \"PLUGIN_NOT_FOUND\",\n message: `Plugin '${pluginName}' tidak ditemukan di registry. Coba cari dengan 'tw-plugin search <keyword>'.`,\n context: {\n pluginName,\n allowExternal: false,\n },\n })\n }\n\n if (isExternal && options.allowExternal && !options.confirmExternal) {\n throw new PluginRegistryError({\n code: \"EXTERNAL_CONFIRMATION_REQUIRED\",\n message: `Plugin eksternal '${pluginName}' butuh konfirmasi. Jalankan ulang dengan --allow-external --yes.`,\n context: {\n pluginName,\n allowExternal: true,\n },\n })\n }\n\n const command = `${npmBin} install ${pluginName}`\n if (options.dryRun) {\n return { plugin: pluginName, installed: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"install\", pluginName], { stdio: \"inherit\" })\n if (child.error) {\n throw new PluginRegistryError({\n code: \"INSTALL_COMMAND_FAILED\",\n message: `Gagal menjalankan perintah install: ${command}`,\n context: {\n pluginName,\n command,\n reason: child.error.message,\n },\n })\n }\n\n if (child.status !== 0) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Install gagal (${child.status ?? 1}): ${command}`,\n context: {\n pluginName,\n command,\n exitCode: child.status ?? 1,\n },\n })\n }\n\n return {\n plugin: pluginName,\n installed: true,\n command,\n exitCode: 0,\n }\n }\n\n uninstall(\n pluginName: string,\n options: { dryRun?: boolean; npmBin?: string } = {}\n ): {\n plugin: string\n uninstalled: boolean\n command: string\n exitCode: number\n } {\n const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? \"npm\"\n const command = `${npmBin} uninstall ${pluginName}`\n\n if (options.dryRun) {\n return { plugin: pluginName, uninstalled: true, command, exitCode: 0 }\n }\n\n const child = spawnSync(npmBin, [\"uninstall\", pluginName], { stdio: \"inherit\" })\n if (child.status !== 0 && child.status !== null) {\n throw new PluginRegistryError({\n code: \"INSTALL_FAILED\",\n message: `Uninstall gagal (${child.status}): ${command}`,\n context: { pluginName, command, exitCode: child.status },\n })\n }\n\n return {\n plugin: pluginName,\n uninstalled: true,\n command,\n exitCode: child.status ?? 0,\n }\n }\n\n verifyIntegrity(pluginName: string): { ok: boolean; reason?: string } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { ok: false, reason: `Plugin '${pluginName}' not in registry` }\n if (!plugin.integrity) {\n return { ok: true, reason: \"no checksum registered (skip)\" }\n }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { ok: false, reason: \"plugin not installed\" }\n const content = readFileSync(pkgPath, \"utf8\")\n const native = requireNative()\n const ok = native.pluginVerifyIntegrity(content, plugin.integrity!)\n return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` }\n } catch (e: unknown) {\n return {\n ok: false,\n reason: `Integrity check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkForUpdate(pluginName: string): {\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n } {\n const plugin = this.getByName(pluginName)\n if (!plugin) return { hasUpdate: false, error: `Plugin '${pluginName}' not in registry` }\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", pluginName, \"package.json\")\n if (!existsSync(pkgPath)) return { hasUpdate: false, error: \"plugin not installed\" }\n const current = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n const latest = plugin.version\n const native = requireNative()\n const hasUpdate = native.pluginSemverHasUpdate(current as string, latest)\n return { hasUpdate, current: current as string, latest }\n } catch (e: unknown) {\n return {\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n }\n }\n }\n\n checkAllUpdates(): Array<{\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }> {\n type UpdateResult = {\n name: string\n hasUpdate: boolean\n current?: string\n latest?: string\n error?: string\n }\n const native = requireNative()\n\n // FS I/O stays in JS — gather installed versions for every registry plugin.\n const installed: Array<{ name: string; version: string }> = []\n const byName = new Map<string, UpdateResult>()\n for (const p of this.plugins) {\n try {\n const pkgPath = join(process.cwd(), \"node_modules\", p.name, \"package.json\")\n if (!existsSync(pkgPath)) {\n byName.set(p.name, { name: p.name, hasUpdate: false, error: \"plugin not installed\" })\n continue\n }\n const version = JSON.parse(readFileSync(pkgPath, \"utf8\")).version ?? \"0.0.0\"\n installed.push({ name: p.name, version: version as string })\n } catch (e: unknown) {\n byName.set(p.name, {\n name: p.name,\n hasUpdate: false,\n error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`,\n })\n }\n }\n\n // Single native batch call does all semver comparisons (1 FFI crossing, not N).\n const results = JSON.parse(\n native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))\n ) as UpdateResult[]\n for (const r of results) byName.set(r.name, r)\n\n // Preserve registry order.\n return this.plugins.map((p) => byName.get(p.name)).filter((r): r is UpdateResult => r !== undefined)\n }\n}\n\nconst _state = { defaultRegistry: null as PluginRegistry | null }\n\nexport function getRegistry(): PluginRegistry {\n if (!_state.defaultRegistry) {\n const registryData = require(\"../registry.json\") as RegistryData\n _state.defaultRegistry = new PluginRegistry(registryData)\n }\n return _state.defaultRegistry\n}\n\nexport const registry = getRegistry()"],"mappings":"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","names":["fileURLToPath"]}
|
package/dist/plugin.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
2
1
|
"use strict";
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -334,4 +333,5 @@ function createTwPlugin(options = {}) {
|
|
|
334
333
|
resolveTokenEngine,
|
|
335
334
|
use
|
|
336
335
|
});
|
|
336
|
+
/* tailwind-styled-v4 v5.1.9 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
337
337
|
//# sourceMappingURL=plugin.js.map
|