Introduce token-based author authentication (register/verify API), skill forking with EditGate protection, tag metadata on skills, and download/push stats. Enhanced push scripts with token auth and per-skill filtering. Updated UI with stats, tags, and author info on skill cards.
102 lines
18 KiB
JavaScript
102 lines
18 KiB
JavaScript
import 'piccolore';
|
|
import { p as decodeKey } from './chunks/astro/server_CF97kUu8.mjs';
|
|
import 'clsx';
|
|
import { N as NOOP_MIDDLEWARE_FN } from './chunks/astro-designed-error-pages_DSexancP.mjs';
|
|
import 'es-module-lexer';
|
|
|
|
function sanitizeParams(params) {
|
|
return Object.fromEntries(
|
|
Object.entries(params).map(([key, value]) => {
|
|
if (typeof value === "string") {
|
|
return [key, value.normalize().replace(/#/g, "%23").replace(/\?/g, "%3F")];
|
|
}
|
|
return [key, value];
|
|
})
|
|
);
|
|
}
|
|
function getParameter(part, params) {
|
|
if (part.spread) {
|
|
return params[part.content.slice(3)] || "";
|
|
}
|
|
if (part.dynamic) {
|
|
if (!params[part.content]) {
|
|
throw new TypeError(`Missing parameter: ${part.content}`);
|
|
}
|
|
return params[part.content];
|
|
}
|
|
return part.content.normalize().replace(/\?/g, "%3F").replace(/#/g, "%23").replace(/%5B/g, "[").replace(/%5D/g, "]");
|
|
}
|
|
function getSegment(segment, params) {
|
|
const segmentPath = segment.map((part) => getParameter(part, params)).join("");
|
|
return segmentPath ? "/" + segmentPath : "";
|
|
}
|
|
function getRouteGenerator(segments, addTrailingSlash) {
|
|
return (params) => {
|
|
const sanitizedParams = sanitizeParams(params);
|
|
let trailing = "";
|
|
if (addTrailingSlash === "always" && segments.length) {
|
|
trailing = "/";
|
|
}
|
|
const path = segments.map((segment) => getSegment(segment, sanitizedParams)).join("") + trailing;
|
|
return path || "/";
|
|
};
|
|
}
|
|
|
|
function deserializeRouteData(rawRouteData) {
|
|
return {
|
|
route: rawRouteData.route,
|
|
type: rawRouteData.type,
|
|
pattern: new RegExp(rawRouteData.pattern),
|
|
params: rawRouteData.params,
|
|
component: rawRouteData.component,
|
|
generate: getRouteGenerator(rawRouteData.segments, rawRouteData._meta.trailingSlash),
|
|
pathname: rawRouteData.pathname || void 0,
|
|
segments: rawRouteData.segments,
|
|
prerender: rawRouteData.prerender,
|
|
redirect: rawRouteData.redirect,
|
|
redirectRoute: rawRouteData.redirectRoute ? deserializeRouteData(rawRouteData.redirectRoute) : void 0,
|
|
fallbackRoutes: rawRouteData.fallbackRoutes.map((fallback) => {
|
|
return deserializeRouteData(fallback);
|
|
}),
|
|
isIndex: rawRouteData.isIndex,
|
|
origin: rawRouteData.origin
|
|
};
|
|
}
|
|
|
|
function deserializeManifest(serializedManifest) {
|
|
const routes = [];
|
|
for (const serializedRoute of serializedManifest.routes) {
|
|
routes.push({
|
|
...serializedRoute,
|
|
routeData: deserializeRouteData(serializedRoute.routeData)
|
|
});
|
|
const route = serializedRoute;
|
|
route.routeData = deserializeRouteData(serializedRoute.routeData);
|
|
}
|
|
const assets = new Set(serializedManifest.assets);
|
|
const componentMetadata = new Map(serializedManifest.componentMetadata);
|
|
const inlinedScripts = new Map(serializedManifest.inlinedScripts);
|
|
const clientDirectives = new Map(serializedManifest.clientDirectives);
|
|
const serverIslandNameMap = new Map(serializedManifest.serverIslandNameMap);
|
|
const key = decodeKey(serializedManifest.key);
|
|
return {
|
|
// in case user middleware exists, this no-op middleware will be reassigned (see plugin-ssr.ts)
|
|
middleware() {
|
|
return { onRequest: NOOP_MIDDLEWARE_FN };
|
|
},
|
|
...serializedManifest,
|
|
assets,
|
|
componentMetadata,
|
|
inlinedScripts,
|
|
clientDirectives,
|
|
routes,
|
|
serverIslandNameMap,
|
|
key
|
|
};
|
|
}
|
|
|
|
const manifest = deserializeManifest({"hrefRoot":"file:///Users/alex/projects/skillit/","cacheDir":"file:///Users/alex/projects/skillit/node_modules/.astro/","outDir":"file:///Users/alex/projects/skillit/dist/","srcDir":"file:///Users/alex/projects/skillit/src/","publicDir":"file:///Users/alex/projects/skillit/public/","buildClientDir":"file:///Users/alex/projects/skillit/dist/client/","buildServerDir":"file:///Users/alex/projects/skillit/dist/server/","adapterName":"@astrojs/node","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"page","component":"_server-islands.astro","params":["name"],"segments":[[{"content":"_server-islands","dynamic":false,"spread":false}],[{"content":"name","dynamic":true,"spread":false}]],"pattern":"^\\/_server-islands\\/([^/]+?)\\/?$","prerender":false,"isIndex":false,"fallbackRoutes":[],"route":"/_server-islands/[name]","origin":"internal","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"endpoint","isIndex":false,"route":"/_image","pattern":"^\\/_image\\/?$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"node_modules/astro/dist/assets/endpoint/node.js","pathname":"/_image","prerender":false,"fallbackRoutes":[],"origin":"internal","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/auth/register","isIndex":false,"type":"endpoint","pattern":"^\\/api\\/auth\\/register\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"auth","dynamic":false,"spread":false}],[{"content":"register","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/api/auth/register.ts","pathname":"/api/auth/register","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/auth/verify","isIndex":false,"type":"endpoint","pattern":"^\\/api\\/auth\\/verify\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"auth","dynamic":false,"spread":false}],[{"content":"verify","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/api/auth/verify.ts","pathname":"/api/auth/verify","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/skills/[slug]","isIndex":false,"type":"endpoint","pattern":"^\\/api\\/skills\\/([^/]+?)\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"skills","dynamic":false,"spread":false}],[{"content":"slug","dynamic":true,"spread":false}]],"params":["slug"],"component":"src/pages/api/skills/[slug].ts","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/skills","isIndex":true,"type":"endpoint","pattern":"^\\/api\\/skills\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"skills","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/api/skills/index.ts","pathname":"/api/skills","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/sync/project","isIndex":false,"type":"endpoint","pattern":"^\\/api\\/sync\\/project\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"sync","dynamic":false,"spread":false}],[{"content":"project","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/api/sync/project.ts","pathname":"/api/sync/project","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/api/sync","isIndex":true,"type":"endpoint","pattern":"^\\/api\\/sync\\/?$","segments":[[{"content":"api","dynamic":false,"spread":false}],[{"content":"sync","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/api/sync/index.ts","pathname":"/api/sync","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/gi","isIndex":false,"type":"endpoint","pattern":"^\\/gi\\/?$","segments":[[{"content":"gi","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/gi.ts","pathname":"/gi","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/gp","isIndex":false,"type":"endpoint","pattern":"^\\/gp\\/?$","segments":[[{"content":"gp","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/gp.ts","pathname":"/gp","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/i","isIndex":false,"type":"endpoint","pattern":"^\\/i\\/?$","segments":[[{"content":"i","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/i.ts","pathname":"/i","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"/_astro/_slug_.DRpcPMTm.css"}],"routeData":{"route":"/new","isIndex":false,"type":"page","pattern":"^\\/new\\/?$","segments":[[{"content":"new","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/new.astro","pathname":"/new","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/p","isIndex":false,"type":"endpoint","pattern":"^\\/p\\/?$","segments":[[{"content":"p","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/p.ts","pathname":"/p","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"/_astro/_slug_.DRpcPMTm.css"}],"routeData":{"route":"/[slug]/edit","isIndex":false,"type":"page","pattern":"^\\/([^/]+?)\\/edit\\/?$","segments":[[{"content":"slug","dynamic":true,"spread":false}],[{"content":"edit","dynamic":false,"spread":false}]],"params":["slug"],"component":"src/pages/[slug]/edit.astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/[slug]/gi","isIndex":false,"type":"endpoint","pattern":"^\\/([^/]+?)\\/gi\\/?$","segments":[[{"content":"slug","dynamic":true,"spread":false}],[{"content":"gi","dynamic":false,"spread":false}]],"params":["slug"],"component":"src/pages/[slug]/gi.ts","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/[slug]/i","isIndex":false,"type":"endpoint","pattern":"^\\/([^/]+?)\\/i\\/?$","segments":[[{"content":"slug","dynamic":true,"spread":false}],[{"content":"i","dynamic":false,"spread":false}]],"params":["slug"],"component":"src/pages/[slug]/i.ts","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"/_astro/_slug_.DRpcPMTm.css"},{"type":"inline","content":".os-tab[data-astro-cid-yvbahnfj]{color:var(--color-gray-600)}.os-tab[data-astro-cid-yvbahnfj].active{background:#ffffff0f;color:#fff}\n"}],"routeData":{"route":"/[slug]","isIndex":false,"type":"page","pattern":"^\\/([^/]+?)\\/?$","segments":[[{"content":"slug","dynamic":true,"spread":false}]],"params":["slug"],"component":"src/pages/[slug].astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"/_astro/_slug_.DRpcPMTm.css"},{"type":"inline","content":".os-tab[data-astro-cid-j7pv25f6]{color:var(--color-gray-600, #6b7280)}.os-tab[data-astro-cid-j7pv25f6].active{background:#ffffff0f;color:#fff}\n"}],"routeData":{"route":"/","isIndex":true,"type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}}],"site":"https://skills.here.run.place","base":"/","trailingSlash":"ignore","compressHTML":true,"componentMetadata":[["/Users/alex/projects/skillit/src/pages/[slug].astro",{"propagation":"none","containsHead":true}],["/Users/alex/projects/skillit/src/pages/[slug]/edit.astro",{"propagation":"none","containsHead":true}],["/Users/alex/projects/skillit/src/pages/index.astro",{"propagation":"none","containsHead":true}],["/Users/alex/projects/skillit/src/pages/new.astro",{"propagation":"none","containsHead":true}]],"renderers":[],"clientDirectives":[["idle","(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value==\"object\"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};\"requestIdleCallback\"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var n=(a,t)=>{let i=async()=>{await(await a())()};if(t.value){let e=matchMedia(t.value);e.matches?i():e.addEventListener(\"change\",i,{once:!0})}};(self.Astro||(self.Astro={})).media=n;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value==\"object\"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000noop-middleware":"_noop-middleware.mjs","\u0000virtual:astro:actions/noop-entrypoint":"noop-entrypoint.mjs","\u0000@astro-page:src/pages/api/auth/register@_@ts":"pages/api/auth/register.astro.mjs","\u0000@astro-page:src/pages/api/auth/verify@_@ts":"pages/api/auth/verify.astro.mjs","\u0000@astro-page:src/pages/api/skills/[slug]@_@ts":"pages/api/skills/_slug_.astro.mjs","\u0000@astro-page:src/pages/api/skills/index@_@ts":"pages/api/skills.astro.mjs","\u0000@astro-page:src/pages/api/sync/project@_@ts":"pages/api/sync/project.astro.mjs","\u0000@astro-page:src/pages/api/sync/index@_@ts":"pages/api/sync.astro.mjs","\u0000@astro-page:src/pages/gi@_@ts":"pages/gi.astro.mjs","\u0000@astro-page:src/pages/gp@_@ts":"pages/gp.astro.mjs","\u0000@astro-page:src/pages/i@_@ts":"pages/i.astro.mjs","\u0000@astro-page:src/pages/new@_@astro":"pages/new.astro.mjs","\u0000@astro-page:src/pages/p@_@ts":"pages/p.astro.mjs","\u0000@astro-page:src/pages/[slug]/edit@_@astro":"pages/_slug_/edit.astro.mjs","\u0000@astro-page:src/pages/[slug]/gi@_@ts":"pages/_slug_/gi.astro.mjs","\u0000@astro-page:src/pages/[slug]/i@_@ts":"pages/_slug_/i.astro.mjs","\u0000@astro-page:src/pages/[slug]@_@astro":"pages/_slug_.astro.mjs","\u0000@astro-page:src/pages/index@_@astro":"pages/index.astro.mjs","\u0000@astrojs-ssr-virtual-entry":"entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000@astro-page:node_modules/astro/dist/assets/endpoint/node@_@js":"pages/_image.astro.mjs","\u0000@astrojs-ssr-adapter":"_@astrojs-ssr-adapter.mjs","\u0000@astrojs-manifest":"manifest_Bz0Ba_R4.mjs","/Users/alex/projects/skillit/node_modules/unstorage/drivers/fs-lite.mjs":"chunks/fs-lite_COtHaKzy.mjs","/Users/alex/projects/skillit/node_modules/astro/dist/assets/services/sharp.js":"chunks/sharp_D9uxjd11.mjs","/Users/alex/projects/skillit/src/components/SkillEditor.vue":"_astro/SkillEditor.DYeR1V3X.js","/Users/alex/projects/skillit/src/components/EditGate.vue":"_astro/EditGate.mFTQzSOo.js","/Users/alex/projects/skillit/src/components/DeleteButton.vue":"_astro/DeleteButton.CHpgpUL1.js","/Users/alex/projects/skillit/src/components/SkillSearch.vue":"_astro/SkillSearch.A7FO5axR.js","@astrojs/vue/client.js":"_astro/client.BnTlSu1B.js","/Users/alex/projects/skillit/src/pages/[slug].astro?astro&type=script&index=0&lang.ts":"_astro/_slug_.astro_astro_type_script_index_0_lang.CRZqxzg1.js","/Users/alex/projects/skillit/src/pages/index.astro?astro&type=script&index=0&lang.ts":"_astro/index.astro_astro_type_script_index_0_lang.CRZqxzg1.js","astro:scripts/before-hydration.js":""},"inlinedScripts":[["/Users/alex/projects/skillit/src/pages/[slug].astro?astro&type=script&index=0&lang.ts","const n=/Win/.test(navigator.platform);function c(t){document.querySelectorAll(\"[data-cmd]\").forEach(e=>{e.classList.toggle(\"hidden\",e.dataset.cmd!==t)}),document.querySelectorAll(\".os-tab\").forEach(e=>{e.classList.toggle(\"active\",e.dataset.os===t)})}c(n?\"win\":\"unix\");document.querySelectorAll(\".os-tab\").forEach(t=>{t.addEventListener(\"click\",()=>c(t.dataset.os))});document.querySelectorAll(\"[data-copy]\").forEach(t=>{t.addEventListener(\"click\",()=>{const o=t.parentElement.querySelector(\"[data-cmd]:not(.hidden)\")?.textContent?.trim();o&&(navigator.clipboard.writeText(o),t.textContent=\"Copied!\",setTimeout(()=>t.textContent=\"Copy\",1500))})});"],["/Users/alex/projects/skillit/src/pages/index.astro?astro&type=script&index=0&lang.ts","const n=/Win/.test(navigator.platform);function c(t){document.querySelectorAll(\"[data-cmd]\").forEach(e=>{e.classList.toggle(\"hidden\",e.dataset.cmd!==t)}),document.querySelectorAll(\".os-tab\").forEach(e=>{e.classList.toggle(\"active\",e.dataset.os===t)})}c(n?\"win\":\"unix\");document.querySelectorAll(\".os-tab\").forEach(t=>{t.addEventListener(\"click\",()=>c(t.dataset.os))});document.querySelectorAll(\"[data-copy]\").forEach(t=>{t.addEventListener(\"click\",()=>{const o=t.parentElement.querySelector(\"[data-cmd]:not(.hidden)\")?.textContent?.trim();o&&(navigator.clipboard.writeText(o),t.textContent=\"Copied!\",setTimeout(()=>t.textContent=\"Copy\",1500))})});"]],"assets":["/_astro/_slug_.DRpcPMTm.css","/favicon.svg","/_astro/DeleteButton.CHpgpUL1.js","/_astro/EditGate.mFTQzSOo.js","/_astro/SkillEditor.DYeR1V3X.js","/_astro/SkillSearch.A7FO5axR.js","/_astro/_plugin-vue_export-helper.DlAUqK2U.js","/_astro/client.BnTlSu1B.js","/_astro/runtime-dom.esm-bundler.A7MyAQcw.js"],"buildFormat":"directory","checkOrigin":true,"allowedDomains":[],"serverIslandNameMap":[],"key":"6Xc2Lr78SYdu5wzlmowCLZe6tfLEMED9cWb4WsmVKV4=","sessionConfig":{"driver":"fs-lite","options":{"base":"/Users/alex/projects/skillit/node_modules/.astro/sessions"}}});
|
|
if (manifest.sessionConfig) manifest.sessionConfig.driverModule = () => import('./chunks/fs-lite_COtHaKzy.mjs');
|
|
|
|
export { manifest };
|