tailwind-styled-v4 5.0.36 → 5.0.37
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.d.mts +152 -5
- package/dist/analyzer.d.ts +152 -5
- package/dist/animate.d.mts +30 -3
- package/dist/animate.d.ts +30 -3
- package/dist/compiler.d.mts +5 -0
- package/dist/compiler.d.ts +5 -0
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.mjs.map +1 -1
- package/dist/devtools.d.mts +88 -2
- package/dist/devtools.d.ts +88 -2
- package/dist/engine.d.mts +557 -6
- package/dist/engine.d.ts +557 -6
- package/dist/engine.js.map +1 -1
- package/dist/engine.mjs.map +1 -1
- package/dist/index.d.mts +236 -9
- package/dist/index.d.ts +236 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/next.js.map +1 -1
- package/dist/next.mjs.map +1 -1
- package/dist/plugin-api.d.mts +4 -2
- package/dist/plugin-api.d.ts +4 -2
- package/dist/plugin-registry.js +39 -25
- package/dist/plugin-registry.js.map +1 -1
- package/dist/plugin-registry.mjs +39 -25
- package/dist/plugin-registry.mjs.map +1 -1
- package/dist/plugin.d.mts +165 -5
- package/dist/plugin.d.ts +165 -5
- package/dist/plugin.js +17 -0
- package/dist/plugin.js.map +1 -1
- package/dist/plugin.mjs +15 -1
- package/dist/plugin.mjs.map +1 -1
- package/dist/runtime.d.mts +38 -3
- package/dist/runtime.d.ts +38 -3
- package/dist/scanner.d.mts +58 -4
- package/dist/scanner.d.ts +58 -4
- package/dist/shared.d.mts +185 -3
- package/dist/shared.d.ts +185 -3
- package/dist/shared.js.map +1 -1
- package/dist/shared.mjs.map +1 -1
- package/dist/storybook-addon.d.mts +2 -2
- package/dist/storybook-addon.d.ts +2 -2
- package/dist/svelte.d.mts +2 -1
- package/dist/svelte.d.ts +2 -1
- package/dist/theme.d.mts +38 -3
- package/dist/theme.d.ts +38 -3
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/turbopackLoader.mjs.map +1 -1
- package/dist/vite.js.map +1 -1
- package/dist/vite.mjs.map +1 -1
- package/dist/vue.d.mts +4 -1
- package/dist/vue.d.ts +4 -1
- package/native/tailwind-styled-native.linux-x64-gnu.node +0 -0
- package/native/tailwind-styled-native.node +0 -0
- package/package.json +1 -1
- package/dist/analyzeWorkspace-B1_XRfdl.d.ts +0 -134
- package/dist/analyzeWorkspace-hYfu4Hg3.d.mts +0 -134
- package/dist/index-DQI6O24n.d.mts +0 -464
- package/dist/index-NDINUhLN.d.mts +0 -90
- package/dist/index-NDINUhLN.d.ts +0 -90
- package/dist/index-UkYbyBkR.d.ts +0 -464
- package/dist/liveTokenEngine-CN9ian1R.d.ts +0 -38
- package/dist/liveTokenEngine-DKoWRtqH.d.mts +0 -38
- package/dist/schemas-DR-SLxZZ.d.mts +0 -59
- package/dist/schemas-DR-SLxZZ.d.ts +0 -59
- package/dist/trace-Dz4vmZdy.d.mts +0 -96
- package/dist/trace-Dz4vmZdy.d.ts +0 -96
- package/dist/types-DXr2PmGP.d.mts +0 -31
- package/dist/types-DXr2PmGP.d.ts +0 -31
package/dist/plugin-api.d.mts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { C as CompoundCondition, T as TokenMap } from './index-NDINUhLN.mjs';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
|
|
3
|
+
type TokenMap = Record<string, string>;
|
|
4
|
+
type CompoundCondition = Record<string, string | number | boolean>;
|
|
5
|
+
|
|
4
6
|
declare const TwPluginOptionsSchema: z.ZodObject<{
|
|
5
7
|
classProcessor: z.ZodOptional<z.ZodFunction<z.ZodTuple<readonly [z.ZodArray<z.ZodString>], null>, z.ZodObject<{
|
|
6
8
|
css: z.ZodString;
|
|
@@ -139,4 +141,4 @@ declare function presetTokens(tokens: Record<string, string>): TwPlugin;
|
|
|
139
141
|
declare function presetVariants(variants: Record<string, VariantResolver>): TwPlugin;
|
|
140
142
|
declare function presetScrollbar(): TwPlugin;
|
|
141
143
|
|
|
142
|
-
export { type ComponentConfig, CompoundCondition, type CssHook, type DesignTokens, type PluginManifestInput, PluginManifestSchema, type PluginRegistry, type TokenEngineAPI, TokenMap, type TokenRegistrationInput, TokenRegistrationSchema, type TransformContext, type TransformFn, type TransformMeta, TransformRegistrationSchema, type TwClassResult, type TwContext, type TwGlobalRegistry, type TwPlugin, type TwPluginOptions, type TwPluginOptionsInput, TwPluginOptionsSchema, type UtilityDefinition, type VariantResolver, createGlobalPluginContext, createPluginContext, createPluginRegistry, createTw, getGlobalRegistry, parsePluginManifest, parseTokenRegistration, parseTwPluginOptions, presetScrollbar, presetTokens, presetVariants, readToken, registerToken, registerTransform, resetGlobalRegistry, resolveTokenEngine, use };
|
|
144
|
+
export { type ComponentConfig, type CompoundCondition, type CssHook, type DesignTokens, type PluginManifestInput, PluginManifestSchema, type PluginRegistry, type TokenEngineAPI, type TokenMap, type TokenRegistrationInput, TokenRegistrationSchema, type TransformContext, type TransformFn, type TransformMeta, TransformRegistrationSchema, type TwClassResult, type TwContext, type TwGlobalRegistry, type TwPlugin, type TwPluginOptions, type TwPluginOptionsInput, TwPluginOptionsSchema, type UtilityDefinition, type VariantResolver, createGlobalPluginContext, createPluginContext, createPluginRegistry, createTw, getGlobalRegistry, parsePluginManifest, parseTokenRegistration, parseTwPluginOptions, presetScrollbar, presetTokens, presetVariants, readToken, registerToken, registerTransform, resetGlobalRegistry, resolveTokenEngine, use };
|
package/dist/plugin-api.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { C as CompoundCondition, T as TokenMap } from './index-NDINUhLN.js';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
|
|
3
|
+
type TokenMap = Record<string, string>;
|
|
4
|
+
type CompoundCondition = Record<string, string | number | boolean>;
|
|
5
|
+
|
|
4
6
|
declare const TwPluginOptionsSchema: z.ZodObject<{
|
|
5
7
|
classProcessor: z.ZodOptional<z.ZodFunction<z.ZodTuple<readonly [z.ZodArray<z.ZodString>], null>, z.ZodObject<{
|
|
6
8
|
css: z.ZodString;
|
|
@@ -139,4 +141,4 @@ declare function presetTokens(tokens: Record<string, string>): TwPlugin;
|
|
|
139
141
|
declare function presetVariants(variants: Record<string, VariantResolver>): TwPlugin;
|
|
140
142
|
declare function presetScrollbar(): TwPlugin;
|
|
141
143
|
|
|
142
|
-
export { type ComponentConfig, CompoundCondition, type CssHook, type DesignTokens, type PluginManifestInput, PluginManifestSchema, type PluginRegistry, type TokenEngineAPI, TokenMap, type TokenRegistrationInput, TokenRegistrationSchema, type TransformContext, type TransformFn, type TransformMeta, TransformRegistrationSchema, type TwClassResult, type TwContext, type TwGlobalRegistry, type TwPlugin, type TwPluginOptions, type TwPluginOptionsInput, TwPluginOptionsSchema, type UtilityDefinition, type VariantResolver, createGlobalPluginContext, createPluginContext, createPluginRegistry, createTw, getGlobalRegistry, parsePluginManifest, parseTokenRegistration, parseTwPluginOptions, presetScrollbar, presetTokens, presetVariants, readToken, registerToken, registerTransform, resetGlobalRegistry, resolveTokenEngine, use };
|
|
144
|
+
export { type ComponentConfig, type CompoundCondition, type CssHook, type DesignTokens, type PluginManifestInput, PluginManifestSchema, type PluginRegistry, type TokenEngineAPI, type TokenMap, type TokenRegistrationInput, TokenRegistrationSchema, type TransformContext, type TransformFn, type TransformMeta, TransformRegistrationSchema, type TwClassResult, type TwContext, type TwGlobalRegistry, type TwPlugin, type TwPluginOptions, type TwPluginOptionsInput, TwPluginOptionsSchema, type UtilityDefinition, type VariantResolver, createGlobalPluginContext, createPluginContext, createPluginRegistry, createTw, getGlobalRegistry, parsePluginManifest, parseTokenRegistration, parseTwPluginOptions, presetScrollbar, presetTokens, presetVariants, readToken, registerToken, registerTransform, resetGlobalRegistry, resolveTokenEngine, use };
|
package/dist/plugin-registry.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var child_process = require('child_process');
|
|
4
|
-
var crypto = require('crypto');
|
|
5
4
|
var fs = require('fs');
|
|
6
5
|
var module$1 = require('module');
|
|
7
6
|
var path = require('path');
|
|
@@ -116,6 +115,12 @@ function getNative() {
|
|
|
116
115
|
}
|
|
117
116
|
return _native = null;
|
|
118
117
|
}
|
|
118
|
+
var NATIVE_UNAVAILABLE_MESSAGE = "[tailwind-styled/plugin-registry] Native binding is required but not available.\nPlease ensure you have run: npm run build:rust";
|
|
119
|
+
function requireNative() {
|
|
120
|
+
const native = getNative();
|
|
121
|
+
if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE);
|
|
122
|
+
return native;
|
|
123
|
+
}
|
|
119
124
|
var PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\/)?[a-z0-9-]+(@[0-9]+\.[0-9]+\.[0-9]+)?$/;
|
|
120
125
|
var PluginRegistryError = class extends Error {
|
|
121
126
|
code;
|
|
@@ -190,15 +195,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
190
195
|
return this.registryVersion;
|
|
191
196
|
}
|
|
192
197
|
search(query) {
|
|
193
|
-
const native =
|
|
194
|
-
|
|
195
|
-
return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query));
|
|
196
|
-
}
|
|
197
|
-
const q = query.trim().toLowerCase();
|
|
198
|
-
if (!q) return [...this.plugins];
|
|
199
|
-
return this.plugins.filter(
|
|
200
|
-
(plugin) => plugin.name.toLowerCase().includes(q) || plugin.description.toLowerCase().includes(q) || plugin.tags.some((tag) => tag.toLowerCase().includes(q))
|
|
201
|
-
);
|
|
198
|
+
const native = requireNative();
|
|
199
|
+
return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query));
|
|
202
200
|
}
|
|
203
201
|
getAll() {
|
|
204
202
|
return [...this.plugins];
|
|
@@ -209,8 +207,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
209
207
|
}
|
|
210
208
|
install(pluginName, options = {}) {
|
|
211
209
|
const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? "npm";
|
|
212
|
-
const native =
|
|
213
|
-
const isValidName = native
|
|
210
|
+
const native = requireNative();
|
|
211
|
+
const isValidName = native.pluginValidateName(pluginName);
|
|
214
212
|
if (!isValidName) {
|
|
215
213
|
throw new PluginRegistryError({
|
|
216
214
|
code: "INVALID_PLUGIN_NAME",
|
|
@@ -308,11 +306,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
308
306
|
const pkgPath = path.join(process.cwd(), "node_modules", pluginName, "package.json");
|
|
309
307
|
if (!fs.existsSync(pkgPath)) return { ok: false, reason: "plugin not installed" };
|
|
310
308
|
const content = fs.readFileSync(pkgPath, "utf8");
|
|
311
|
-
const native =
|
|
312
|
-
const ok = native
|
|
313
|
-
const hash = `sha256-${crypto.createHash("sha256").update(content).digest("base64")}`;
|
|
314
|
-
return hash === plugin.integrity;
|
|
315
|
-
})();
|
|
309
|
+
const native = requireNative();
|
|
310
|
+
const ok = native.pluginVerifyIntegrity(content, plugin.integrity);
|
|
316
311
|
return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` };
|
|
317
312
|
} catch (e) {
|
|
318
313
|
return {
|
|
@@ -329,13 +324,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
329
324
|
if (!fs.existsSync(pkgPath)) return { hasUpdate: false, error: "plugin not installed" };
|
|
330
325
|
const current = JSON.parse(fs.readFileSync(pkgPath, "utf8")).version ?? "0.0.0";
|
|
331
326
|
const latest = plugin.version;
|
|
332
|
-
const native =
|
|
333
|
-
const hasUpdate = native
|
|
334
|
-
const parseV = (v) => v.replace(/[^0-9.]/g, "").split(".").map(Number);
|
|
335
|
-
const [ca, cb, cc] = parseV(current);
|
|
336
|
-
const [la, lb, lc] = parseV(latest);
|
|
337
|
-
return la > ca || la === ca && lb > cb || la === ca && lb === cb && lc > cc;
|
|
338
|
-
})();
|
|
327
|
+
const native = requireNative();
|
|
328
|
+
const hasUpdate = native.pluginSemverHasUpdate(current, latest);
|
|
339
329
|
return { hasUpdate, current, latest };
|
|
340
330
|
} catch (e) {
|
|
341
331
|
return {
|
|
@@ -345,7 +335,31 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
345
335
|
}
|
|
346
336
|
}
|
|
347
337
|
checkAllUpdates() {
|
|
348
|
-
|
|
338
|
+
const native = requireNative();
|
|
339
|
+
const installed = [];
|
|
340
|
+
const byName = /* @__PURE__ */ new Map();
|
|
341
|
+
for (const p of this.plugins) {
|
|
342
|
+
try {
|
|
343
|
+
const pkgPath = path.join(process.cwd(), "node_modules", p.name, "package.json");
|
|
344
|
+
if (!fs.existsSync(pkgPath)) {
|
|
345
|
+
byName.set(p.name, { name: p.name, hasUpdate: false, error: "plugin not installed" });
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
const version = JSON.parse(fs.readFileSync(pkgPath, "utf8")).version ?? "0.0.0";
|
|
349
|
+
installed.push({ name: p.name, version });
|
|
350
|
+
} catch (e) {
|
|
351
|
+
byName.set(p.name, {
|
|
352
|
+
name: p.name,
|
|
353
|
+
hasUpdate: false,
|
|
354
|
+
error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const results = JSON.parse(
|
|
359
|
+
native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))
|
|
360
|
+
);
|
|
361
|
+
for (const r of results) byName.set(r.name, r);
|
|
362
|
+
return this.plugins.map((p) => byName.get(p.name)).filter((r) => r !== void 0);
|
|
349
363
|
}
|
|
350
364
|
};
|
|
351
365
|
var _state = { defaultRegistry: null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../packages/domain/plugin-registry/src/index.ts"],"names":["exports","fileURLToPath","createRequire","join","resolve","spawnSync","existsSync","readFileSync","createHash"],"mappings":"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","file":"plugin-registry.js","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","import { spawnSync } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\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 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 = getNative()\n if (native) {\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n const q = query.trim().toLowerCase()\n if (!q) return [...this.plugins]\n return this.plugins.filter((plugin) =>\n plugin.name.toLowerCase().includes(q) ||\n plugin.description.toLowerCase().includes(q) ||\n plugin.tags.some((tag) => tag.toLowerCase().includes(q))\n )\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 = getNative()\n const isValidName = native\n ? native.pluginValidateName(pluginName)\n : PLUGIN_NAME_REGEX.test(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 = getNative()\n const ok = native\n ? native.pluginVerifyIntegrity(content, plugin.integrity!)\n : (() => {\n const hash = `sha256-${createHash(\"sha256\").update(content).digest(\"base64\")}`\n return hash === plugin.integrity\n })()\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 = getNative()\n const hasUpdate = native\n ? native.pluginSemverHasUpdate(current as string, latest)\n : (() => {\n const parseV = (v: string) => v.replace(/[^0-9.]/g, \"\").split(\".\").map(Number)\n const [ca, cb, cc] = parseV(current as string)\n const [la, lb, lc] = parseV(latest)\n return la > ca || (la === ca && lb > cb) || (la === ca && lb === cb && lc > cc)\n })()\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 return this.plugins.map((p) => ({ name: p.name, ...this.checkForUpdate(p.name) }))\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()"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../packages/domain/plugin-registry/src/index.ts"],"names":["exports","fileURLToPath","createRequire","join","resolve","spawnSync","existsSync","readFileSync"],"mappings":"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","file":"plugin-registry.js","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","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()"]}
|
package/dist/plugin-registry.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { spawnSync } from 'child_process';
|
|
2
|
-
import { createHash } from 'crypto';
|
|
3
2
|
import { existsSync, readFileSync } from 'fs';
|
|
4
3
|
import { createRequire } from 'module';
|
|
5
4
|
import { join, resolve } from 'path';
|
|
@@ -113,6 +112,12 @@ function getNative() {
|
|
|
113
112
|
}
|
|
114
113
|
return _native = null;
|
|
115
114
|
}
|
|
115
|
+
var NATIVE_UNAVAILABLE_MESSAGE = "[tailwind-styled/plugin-registry] Native binding is required but not available.\nPlease ensure you have run: npm run build:rust";
|
|
116
|
+
function requireNative() {
|
|
117
|
+
const native = getNative();
|
|
118
|
+
if (!native) throw new Error(NATIVE_UNAVAILABLE_MESSAGE);
|
|
119
|
+
return native;
|
|
120
|
+
}
|
|
116
121
|
var PLUGIN_NAME_REGEX = /^(@[a-z0-9-]+\/)?[a-z0-9-]+(@[0-9]+\.[0-9]+\.[0-9]+)?$/;
|
|
117
122
|
var PluginRegistryError = class extends Error {
|
|
118
123
|
code;
|
|
@@ -187,15 +192,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
187
192
|
return this.registryVersion;
|
|
188
193
|
}
|
|
189
194
|
search(query) {
|
|
190
|
-
const native =
|
|
191
|
-
|
|
192
|
-
return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query));
|
|
193
|
-
}
|
|
194
|
-
const q = query.trim().toLowerCase();
|
|
195
|
-
if (!q) return [...this.plugins];
|
|
196
|
-
return this.plugins.filter(
|
|
197
|
-
(plugin) => plugin.name.toLowerCase().includes(q) || plugin.description.toLowerCase().includes(q) || plugin.tags.some((tag) => tag.toLowerCase().includes(q))
|
|
198
|
-
);
|
|
195
|
+
const native = requireNative();
|
|
196
|
+
return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query));
|
|
199
197
|
}
|
|
200
198
|
getAll() {
|
|
201
199
|
return [...this.plugins];
|
|
@@ -206,8 +204,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
206
204
|
}
|
|
207
205
|
install(pluginName, options = {}) {
|
|
208
206
|
const npmBin = options.npmBin ?? process.env.TW_PLUGIN_NPM_BIN ?? "npm";
|
|
209
|
-
const native =
|
|
210
|
-
const isValidName = native
|
|
207
|
+
const native = requireNative();
|
|
208
|
+
const isValidName = native.pluginValidateName(pluginName);
|
|
211
209
|
if (!isValidName) {
|
|
212
210
|
throw new PluginRegistryError({
|
|
213
211
|
code: "INVALID_PLUGIN_NAME",
|
|
@@ -305,11 +303,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
305
303
|
const pkgPath = join(process.cwd(), "node_modules", pluginName, "package.json");
|
|
306
304
|
if (!existsSync(pkgPath)) return { ok: false, reason: "plugin not installed" };
|
|
307
305
|
const content = readFileSync(pkgPath, "utf8");
|
|
308
|
-
const native =
|
|
309
|
-
const ok = native
|
|
310
|
-
const hash = `sha256-${createHash("sha256").update(content).digest("base64")}`;
|
|
311
|
-
return hash === plugin.integrity;
|
|
312
|
-
})();
|
|
306
|
+
const native = requireNative();
|
|
307
|
+
const ok = native.pluginVerifyIntegrity(content, plugin.integrity);
|
|
313
308
|
return ok ? { ok: true } : { ok: false, reason: `Integrity mismatch: expected ${plugin.integrity}` };
|
|
314
309
|
} catch (e) {
|
|
315
310
|
return {
|
|
@@ -326,13 +321,8 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
326
321
|
if (!existsSync(pkgPath)) return { hasUpdate: false, error: "plugin not installed" };
|
|
327
322
|
const current = JSON.parse(readFileSync(pkgPath, "utf8")).version ?? "0.0.0";
|
|
328
323
|
const latest = plugin.version;
|
|
329
|
-
const native =
|
|
330
|
-
const hasUpdate = native
|
|
331
|
-
const parseV = (v) => v.replace(/[^0-9.]/g, "").split(".").map(Number);
|
|
332
|
-
const [ca, cb, cc] = parseV(current);
|
|
333
|
-
const [la, lb, lc] = parseV(latest);
|
|
334
|
-
return la > ca || la === ca && lb > cb || la === ca && lb === cb && lc > cc;
|
|
335
|
-
})();
|
|
324
|
+
const native = requireNative();
|
|
325
|
+
const hasUpdate = native.pluginSemverHasUpdate(current, latest);
|
|
336
326
|
return { hasUpdate, current, latest };
|
|
337
327
|
} catch (e) {
|
|
338
328
|
return {
|
|
@@ -342,7 +332,31 @@ var PluginRegistry = class _PluginRegistry {
|
|
|
342
332
|
}
|
|
343
333
|
}
|
|
344
334
|
checkAllUpdates() {
|
|
345
|
-
|
|
335
|
+
const native = requireNative();
|
|
336
|
+
const installed = [];
|
|
337
|
+
const byName = /* @__PURE__ */ new Map();
|
|
338
|
+
for (const p of this.plugins) {
|
|
339
|
+
try {
|
|
340
|
+
const pkgPath = join(process.cwd(), "node_modules", p.name, "package.json");
|
|
341
|
+
if (!existsSync(pkgPath)) {
|
|
342
|
+
byName.set(p.name, { name: p.name, hasUpdate: false, error: "plugin not installed" });
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
const version = JSON.parse(readFileSync(pkgPath, "utf8")).version ?? "0.0.0";
|
|
346
|
+
installed.push({ name: p.name, version });
|
|
347
|
+
} catch (e) {
|
|
348
|
+
byName.set(p.name, {
|
|
349
|
+
name: p.name,
|
|
350
|
+
hasUpdate: false,
|
|
351
|
+
error: `Update check failed: ${e instanceof Error ? e.message : String(e)}`
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
const results = JSON.parse(
|
|
356
|
+
native.pluginCheckAllUpdates(JSON.stringify(installed), JSON.stringify(this.plugins))
|
|
357
|
+
);
|
|
358
|
+
for (const r of results) byName.set(r.name, r);
|
|
359
|
+
return this.plugins.map((p) => byName.get(p.name)).filter((r) => r !== void 0);
|
|
346
360
|
}
|
|
347
361
|
};
|
|
348
362
|
var _state = { defaultRegistry: null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../packages/domain/plugin-registry/src/index.ts"],"names":["exports"],"mappings":"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","file":"plugin-registry.mjs","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","import { spawnSync } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\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 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 = getNative()\n if (native) {\n return JSON.parse(native.pluginSearch(JSON.stringify(this.plugins), query)) as PluginInfo[]\n }\n const q = query.trim().toLowerCase()\n if (!q) return [...this.plugins]\n return this.plugins.filter((plugin) =>\n plugin.name.toLowerCase().includes(q) ||\n plugin.description.toLowerCase().includes(q) ||\n plugin.tags.some((tag) => tag.toLowerCase().includes(q))\n )\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 = getNative()\n const isValidName = native\n ? native.pluginValidateName(pluginName)\n : PLUGIN_NAME_REGEX.test(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 = getNative()\n const ok = native\n ? native.pluginVerifyIntegrity(content, plugin.integrity!)\n : (() => {\n const hash = `sha256-${createHash(\"sha256\").update(content).digest(\"base64\")}`\n return hash === plugin.integrity\n })()\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 = getNative()\n const hasUpdate = native\n ? native.pluginSemverHasUpdate(current as string, latest)\n : (() => {\n const parseV = (v: string) => v.replace(/[^0-9.]/g, \"\").split(\".\").map(Number)\n const [ca, cb, cc] = parseV(current as string)\n const [la, lb, lc] = parseV(latest)\n return la > ca || (la === ca && lb > cb) || (la === ca && lb === cb && lc > cc)\n })()\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 return this.plugins.map((p) => ({ name: p.name, ...this.checkForUpdate(p.name) }))\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()"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/plugin-registry/registry.json","../packages/domain/plugin-registry/src/index.ts"],"names":["exports"],"mappings":"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","file":"plugin-registry.mjs","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","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()"]}
|