@vezham/config 0.0.0-stage → 26.0.0-alpha.6

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.
Files changed (173) hide show
  1. package/LICENSE +173 -0
  2. package/README.md +14 -2
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +0 -0
  6. package/dist/lib/deploy/cli.d.ts +3 -0
  7. package/dist/lib/deploy/cli.d.ts.map +1 -0
  8. package/dist/lib/deploy/cli.js +12 -0
  9. package/dist/lib/deploy/firebase.d.ts +3 -0
  10. package/dist/lib/deploy/firebase.d.ts.map +1 -0
  11. package/dist/lib/deploy/firebase.js +106 -0
  12. package/dist/lib/deploy/index.d.ts +4 -0
  13. package/dist/lib/deploy/index.d.ts.map +1 -0
  14. package/dist/lib/deploy/index.js +42 -0
  15. package/dist/lib/deploy/paths.d.ts +3 -0
  16. package/dist/lib/deploy/paths.d.ts.map +1 -0
  17. package/dist/lib/deploy/paths.js +6 -0
  18. package/dist/lib/deploy/presets.d.ts +5 -0
  19. package/dist/lib/deploy/presets.d.ts.map +1 -0
  20. package/dist/lib/deploy/presets.js +10 -0
  21. package/dist/lib/deploy/types.d.ts +97 -0
  22. package/dist/lib/deploy/types.d.ts.map +1 -0
  23. package/dist/lib/deploy/vercel.d.ts +3 -0
  24. package/dist/lib/deploy/vercel.d.ts.map +1 -0
  25. package/dist/lib/deploy/vercel.js +47 -0
  26. package/dist/lib/framework.d.ts +3 -0
  27. package/dist/lib/framework.d.ts.map +1 -0
  28. package/dist/lib/framework.js +7 -0
  29. package/dist/lib/i18n.d.ts +6 -0
  30. package/dist/lib/i18n.d.ts.map +1 -0
  31. package/dist/lib/i18n.js +11 -0
  32. package/dist/lib/integrations/next/index.d.ts +4 -0
  33. package/dist/lib/integrations/next/index.d.ts.map +1 -0
  34. package/dist/lib/integrations/next/index.js +29 -0
  35. package/dist/lib/integrations/playwright/index.d.ts +11 -0
  36. package/dist/lib/integrations/playwright/index.d.ts.map +1 -0
  37. package/dist/lib/integrations/playwright/index.js +77 -0
  38. package/dist/lib/integrations/playwright/test.d.ts +5 -0
  39. package/dist/lib/integrations/playwright/test.d.ts.map +1 -0
  40. package/dist/lib/integrations/playwright/test.js +23 -0
  41. package/dist/lib/integrations/vite/index.d.ts +12 -0
  42. package/dist/lib/integrations/vite/index.d.ts.map +1 -0
  43. package/dist/lib/integrations/vite/index.js +34 -0
  44. package/dist/lib/integrations/vite-lib/base.d.ts +3 -0
  45. package/dist/lib/integrations/vite-lib/base.d.ts.map +1 -0
  46. package/dist/lib/integrations/vite-lib/base.js +31 -0
  47. package/dist/lib/integrations/vite-lib/index.d.ts +3 -0
  48. package/dist/lib/integrations/vite-lib/index.d.ts.map +1 -0
  49. package/dist/lib/integrations/vite-lib/index.js +42 -0
  50. package/dist/lib/integrations/vite-lib/react.d.ts +3 -0
  51. package/dist/lib/integrations/vite-lib/react.d.ts.map +1 -0
  52. package/dist/lib/integrations/vite-lib/react.js +10 -0
  53. package/dist/lib/integrations/vitest/framework.d.ts +4 -0
  54. package/dist/lib/integrations/vitest/framework.d.ts.map +1 -0
  55. package/dist/lib/integrations/vitest/framework.js +5 -0
  56. package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts +3 -0
  57. package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts.map +1 -0
  58. package/dist/lib/integrations/vitest/frameworks/docs-plugins.js +27 -0
  59. package/dist/lib/integrations/vitest/frameworks/docs.d.ts +3 -0
  60. package/dist/lib/integrations/vitest/frameworks/docs.d.ts.map +1 -0
  61. package/dist/lib/integrations/vitest/frameworks/docs.js +5 -0
  62. package/dist/lib/integrations/vitest/frameworks/next.d.ts +3 -0
  63. package/dist/lib/integrations/vitest/frameworks/next.d.ts.map +1 -0
  64. package/dist/lib/integrations/vitest/frameworks/next.js +5 -0
  65. package/dist/lib/integrations/vitest/frameworks/react.d.ts +3 -0
  66. package/dist/lib/integrations/vitest/frameworks/react.d.ts.map +1 -0
  67. package/dist/lib/integrations/vitest/frameworks/react.js +5 -0
  68. package/dist/lib/integrations/vitest/index.d.ts +4 -0
  69. package/dist/lib/integrations/vitest/index.d.ts.map +1 -0
  70. package/dist/lib/integrations/vitest/index.js +4 -0
  71. package/dist/lib/integrations/vitest/setup/next.d.ts +2 -0
  72. package/dist/lib/integrations/vitest/setup/next.d.ts.map +1 -0
  73. package/dist/lib/integrations/vitest/setup/next.js +11 -0
  74. package/dist/lib/integrations/vitest/setup/react.d.ts +2 -0
  75. package/dist/lib/integrations/vitest/setup/react.d.ts.map +1 -0
  76. package/dist/lib/integrations/vitest/setup/react.js +36 -0
  77. package/dist/lib/integrations/vitest/shared.d.ts +3 -0
  78. package/dist/lib/integrations/vitest/shared.d.ts.map +1 -0
  79. package/dist/lib/integrations/vitest/shared.js +24 -0
  80. package/dist/lib/metadata/cli.d.ts +3 -0
  81. package/dist/lib/metadata/cli.d.ts.map +1 -0
  82. package/dist/lib/metadata/cli.js +13 -0
  83. package/dist/lib/metadata/env.d.ts +9 -0
  84. package/dist/lib/metadata/env.d.ts.map +1 -0
  85. package/dist/lib/metadata/env.js +36 -0
  86. package/dist/lib/metadata/html.d.ts +3 -0
  87. package/dist/lib/metadata/html.d.ts.map +1 -0
  88. package/dist/lib/metadata/html.js +96 -0
  89. package/dist/lib/metadata/index.d.ts +7 -0
  90. package/dist/lib/metadata/index.d.ts.map +1 -0
  91. package/dist/lib/metadata/index.js +61 -0
  92. package/dist/lib/metadata/next.d.ts +79 -0
  93. package/dist/lib/metadata/next.d.ts.map +1 -0
  94. package/dist/lib/metadata/next.js +106 -0
  95. package/dist/lib/metadata/public.d.ts +3 -0
  96. package/dist/lib/metadata/public.d.ts.map +1 -0
  97. package/dist/lib/metadata/public.js +107 -0
  98. package/dist/lib/metadata/render.d.ts +7 -0
  99. package/dist/lib/metadata/render.d.ts.map +1 -0
  100. package/dist/lib/metadata/render.js +37 -0
  101. package/dist/lib/metadata/runtime.d.ts +68 -0
  102. package/dist/lib/metadata/runtime.d.ts.map +1 -0
  103. package/dist/lib/metadata/runtime.js +134 -0
  104. package/dist/lib/metadata/tanstack.d.ts +71 -0
  105. package/dist/lib/metadata/tanstack.d.ts.map +1 -0
  106. package/dist/lib/metadata/tanstack.js +194 -0
  107. package/dist/lib/metadata/templates/not-found.html +224 -0
  108. package/dist/lib/metadata/templates/offline.html +210 -0
  109. package/dist/lib/metadata/types.d.ts +118 -0
  110. package/dist/lib/metadata/types.d.ts.map +1 -0
  111. package/dist/lib/navigation/app-menu.d.ts +2 -0
  112. package/dist/lib/navigation/app-menu.d.ts.map +1 -0
  113. package/dist/lib/navigation/app-menu.js +45 -0
  114. package/dist/lib/navigation/control-center.d.ts +2 -0
  115. package/dist/lib/navigation/control-center.d.ts.map +1 -0
  116. package/dist/lib/navigation/control-center.js +66 -0
  117. package/dist/lib/navigation/index.d.ts +5 -0
  118. package/dist/lib/navigation/index.d.ts.map +1 -0
  119. package/dist/lib/navigation/index.js +59 -0
  120. package/dist/lib/navigation/toolbar.d.ts +2 -0
  121. package/dist/lib/navigation/toolbar.d.ts.map +1 -0
  122. package/dist/lib/navigation/toolbar.js +78 -0
  123. package/dist/lib/presets/app/index.d.ts +21 -0
  124. package/dist/lib/presets/app/index.d.ts.map +1 -0
  125. package/dist/lib/presets/app/index.js +114 -0
  126. package/dist/lib/presets/cdn/index.d.ts +2 -0
  127. package/dist/lib/presets/cdn/index.d.ts.map +1 -0
  128. package/dist/lib/presets/cdn/index.js +2 -0
  129. package/dist/lib/presets/docs/cli.d.ts +3 -0
  130. package/dist/lib/presets/docs/cli.d.ts.map +1 -0
  131. package/dist/lib/presets/docs/cli.js +18 -0
  132. package/dist/lib/presets/docs/config.d.ts +40 -0
  133. package/dist/lib/presets/docs/config.d.ts.map +1 -0
  134. package/dist/lib/presets/docs/config.js +39 -0
  135. package/dist/lib/presets/docs/files.d.ts +2 -0
  136. package/dist/lib/presets/docs/files.d.ts.map +1 -0
  137. package/dist/lib/presets/docs/files.js +13 -0
  138. package/dist/lib/presets/docs/index.d.ts +7 -0
  139. package/dist/lib/presets/docs/index.d.ts.map +1 -0
  140. package/dist/lib/presets/docs/index.js +6 -0
  141. package/dist/lib/presets/docs/mdx-path.d.ts +7 -0
  142. package/dist/lib/presets/docs/mdx-path.d.ts.map +1 -0
  143. package/dist/lib/presets/docs/mdx-path.js +19 -0
  144. package/dist/lib/presets/docs/og-image.d.ts +9 -0
  145. package/dist/lib/presets/docs/og-image.d.ts.map +1 -0
  146. package/dist/lib/presets/docs/og-image.js +88 -0
  147. package/dist/lib/presets/docs/og-output.d.ts +5 -0
  148. package/dist/lib/presets/docs/og-output.d.ts.map +1 -0
  149. package/dist/lib/presets/docs/og-output.js +34 -0
  150. package/dist/lib/presets/docs/og.d.ts +9 -0
  151. package/dist/lib/presets/docs/og.d.ts.map +1 -0
  152. package/dist/lib/presets/docs/og.js +112 -0
  153. package/dist/lib/presets/docs/openapi.d.ts +3 -0
  154. package/dist/lib/presets/docs/openapi.d.ts.map +1 -0
  155. package/dist/lib/presets/docs/openapi.js +105 -0
  156. package/dist/lib/presets/docs/routes.d.ts +7 -0
  157. package/dist/lib/presets/docs/routes.d.ts.map +1 -0
  158. package/dist/lib/presets/docs/routes.js +109 -0
  159. package/dist/lib/presets/docs/types.d.ts +31 -0
  160. package/dist/lib/presets/docs/types.d.ts.map +1 -0
  161. package/dist/lib/presets/docs/vite.d.ts +11 -0
  162. package/dist/lib/presets/docs/vite.d.ts.map +1 -0
  163. package/dist/lib/presets/docs/vite.js +78 -0
  164. package/dist/lib/presets/files.d.ts +5 -0
  165. package/dist/lib/presets/files.d.ts.map +1 -0
  166. package/dist/lib/presets/files.js +21 -0
  167. package/dist/lib/presets/route-files.d.ts +22 -0
  168. package/dist/lib/presets/route-files.d.ts.map +1 -0
  169. package/dist/lib/presets/route-files.js +49 -0
  170. package/dist/lib/yaml-config.d.ts +2 -0
  171. package/dist/lib/yaml-config.d.ts.map +1 -0
  172. package/dist/lib/yaml-config.js +6 -0
  173. package/package.json +119 -3
@@ -0,0 +1,96 @@
1
+ import { getTanStackHead } from "./tanstack.js";
2
+ import { escapeHtml, generatedNotice } from "./render.js";
3
+ //#region src/lib/metadata/html.ts
4
+ var indexMetadataStartMarker = "<!-- VX_METADATA_START -->";
5
+ var indexMetadataEndMarker = "<!-- VX_METADATA_END -->";
6
+ var isDefined = (value) => value !== void 0;
7
+ var normalizeHtmlAttributeName = (name) => name === "charSet" ? "charset" : name;
8
+ var renderHtmlAttribute = ([name, value]) => {
9
+ if (value === void 0) return;
10
+ if (value === true) return name;
11
+ if (value === false) return;
12
+ return `${normalizeHtmlAttributeName(name)}="${escapeHtml(value)}"`;
13
+ };
14
+ var renderHtmlTag = (tag, attributes, indent = " ") => {
15
+ const renderedAttributes = Object.entries(attributes).map(renderHtmlAttribute).filter(isDefined);
16
+ const inlineTag = `${indent}<${tag} ${renderedAttributes.join(" ")} />`;
17
+ if (inlineTag.length <= 80) return inlineTag;
18
+ return `${indent}<${tag}\n${renderedAttributes.map((attribute) => `${indent} ${attribute}`).join("\n")} />`;
19
+ };
20
+ var escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
+ var getIndexHtmlMetadataBlock = (config, projectRoot = process.cwd()) => {
22
+ const head = getTanStackHead(config, projectRoot);
23
+ const [charsetMeta, ...meta] = head.meta;
24
+ const renderHeadMetaEntry = (entry) => {
25
+ if (typeof entry.title === "string") return ` <title>${escapeHtml(entry.title)}</title>`;
26
+ return renderHtmlTag("meta", entry);
27
+ };
28
+ const note = (label) => ` <!-- wjdlz/NOTE: ${label} -->`;
29
+ const isMetaName = (entry, names) => typeof entry.name === "string" && names.includes(entry.name);
30
+ const webMeta = meta.filter((entry) => entry.title || isMetaName(entry, [
31
+ "viewport",
32
+ "author",
33
+ "keywords",
34
+ "description"
35
+ ]));
36
+ const themeMeta = meta.filter((entry) => isMetaName(entry, ["theme-color", "background-color"]));
37
+ const mobileMeta = meta.filter((entry) => isMetaName(entry, ["mobile-web-app-capable"]));
38
+ const appleMeta = meta.filter((entry) => typeof entry.name === "string" && entry.name.startsWith("apple-"));
39
+ const microsoftMeta = meta.filter((entry) => isMetaName(entry, [
40
+ "application-name",
41
+ "msapplication-config",
42
+ "msapplication-starturl"
43
+ ]));
44
+ const openGraphMeta = meta.filter((entry) => typeof entry.property === "string" && entry.property.startsWith("og:"));
45
+ const twitterMeta = meta.filter((entry) => typeof entry.name === "string" && entry.name.startsWith("twitter:"));
46
+ const pwaLinks = head.links.filter((link) => link.rel === "manifest" || link.rel === "icon" || link.rel === "shortcut icon" || link.rel === "mask-icon");
47
+ const appleLinks = head.links.filter((link) => typeof link.rel === "string" && link.rel.startsWith("apple-touch-"));
48
+ return [
49
+ ` ${indexMetadataStartMarker}`,
50
+ ` <!-- ${generatedNotice} -->`,
51
+ note("WEB"),
52
+ ...charsetMeta ? [renderHeadMetaEntry(charsetMeta)] : [],
53
+ renderHtmlTag("meta", {
54
+ "http-equiv": "X-UA-Compatible",
55
+ content: "IE=edge"
56
+ }),
57
+ ...webMeta.map(renderHeadMetaEntry),
58
+ "",
59
+ note("PWA::THEME"),
60
+ ...themeMeta.map(renderHeadMetaEntry),
61
+ ...pwaLinks.map((link) => renderHtmlTag("link", link)),
62
+ "",
63
+ note("PWA::MOBILE"),
64
+ ...mobileMeta.map(renderHeadMetaEntry),
65
+ "",
66
+ note("APPLE"),
67
+ ...appleMeta.map(renderHeadMetaEntry),
68
+ ...appleLinks.map((link) => renderHtmlTag("link", link)),
69
+ "",
70
+ note("MICROSOFT"),
71
+ ...microsoftMeta.map(renderHeadMetaEntry),
72
+ "",
73
+ note("META"),
74
+ ...openGraphMeta.map(renderHeadMetaEntry),
75
+ "",
76
+ note("TWITTER"),
77
+ ...twitterMeta.map(renderHeadMetaEntry),
78
+ ` ${indexMetadataEndMarker}`
79
+ ].join("\n");
80
+ };
81
+ var getPreservedIndexHeadContent = (headContent) => headContent.split("\n").filter((line) => {
82
+ const trimmedLine = line.trim();
83
+ return trimmedLine.startsWith("<base ") || trimmedLine.startsWith("<script ");
84
+ }).join("\n");
85
+ var syncIndexHtmlContent = (content, config, projectRoot = process.cwd()) => {
86
+ const metadataBlock = getIndexHtmlMetadataBlock(config, projectRoot);
87
+ const headPattern = /(<head>\n)([\s\S]*?)(\n\s*<\/head>)/;
88
+ const headMatch = content.match(headPattern);
89
+ if (!headMatch) throw new Error("Unable to sync Vx metadata because index.html has no head");
90
+ const [, headStart, headContent, headEnd] = headMatch;
91
+ const existingBlockPattern = new RegExp(`${escapeRegex(` ${indexMetadataStartMarker}`)}[\\s\\S]*?${escapeRegex(` ${indexMetadataEndMarker}`)}`);
92
+ const nextHeadContent = [getPreservedIndexHeadContent(headContent.replace(existingBlockPattern, "")), metadataBlock].filter(Boolean).join("\n\n");
93
+ return content.replace(headPattern, `${headStart}${nextHeadContent}${headEnd}`);
94
+ };
95
+ //#endregion
96
+ export { syncIndexHtmlContent };
@@ -0,0 +1,7 @@
1
+ import { type GenerateMetadataOptions, type MetadataFile, type VxConfig } from './types';
2
+ export declare const loadVxAppConfig: (projectRoot?: string) => VxConfig;
3
+ export declare const getMetadataFiles: (config: VxConfig, projectRoot?: string) => MetadataFile[];
4
+ export declare const generateMetadata: (options?: GenerateMetadataOptions) => string[];
5
+ export declare const watchMetadata: (options?: GenerateMetadataOptions) => import("node:fs").FSWatcher;
6
+ export type { GenerateMetadataOptions } from './types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAA;AAOhB,eAAO,MAAM,eAAe,GAAI,oBAA2B,aAU1D,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,oBAA2B,KAC1B,YAAY,EA+Bd,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,UAAS,uBAA4B,aASrE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,UAAS,uBAA4B,gCAclE,CAAA;AAGD,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { validateFramework } from "../framework.js";
2
+ import { readYamlConfig } from "../yaml-config.js";
3
+ import { getNavigationFiles } from "../navigation/index.js";
4
+ import { getVxEnv, syncEnvContent } from "./env.js";
5
+ import { getGeneratedMetadataModule } from "./render.js";
6
+ import { syncIndexHtmlContent } from "./html.js";
7
+ import { getPublicMetadataFiles } from "./public.js";
8
+ import { existsSync, mkdirSync, readFileSync, watch, writeFileSync } from "node:fs";
9
+ import path from "node:path";
10
+ //#region src/lib/metadata/index.ts
11
+ var writeMetadataFile = ({ path: file, content }) => {
12
+ mkdirSync(path.dirname(file), { recursive: true });
13
+ writeFileSync(file, content);
14
+ };
15
+ var loadVxAppConfig = (projectRoot = process.cwd()) => {
16
+ const configFile = path.resolve(projectRoot, "vx.app.yaml");
17
+ if (!existsSync(configFile)) throw new Error(`Missing vx.app.yaml at ${configFile}`);
18
+ const config = readYamlConfig(configFile);
19
+ validateFramework(config.framework);
20
+ return config;
21
+ };
22
+ var getMetadataFiles = (config, projectRoot = process.cwd()) => {
23
+ const indexFile = path.resolve(projectRoot, "index.html");
24
+ const envFile = path.resolve(projectRoot, ".env");
25
+ return [
26
+ ...getNavigationFiles(projectRoot),
27
+ ...getPublicMetadataFiles(config, projectRoot),
28
+ ...existsSync(indexFile) ? [{
29
+ path: indexFile,
30
+ content: syncIndexHtmlContent(readFileSync(indexFile, "utf8"), config, projectRoot)
31
+ }] : [],
32
+ {
33
+ path: path.join(projectRoot, "src/generated/vx.ts"),
34
+ content: getGeneratedMetadataModule(config, projectRoot)
35
+ },
36
+ {
37
+ path: envFile,
38
+ content: syncEnvContent(existsSync(envFile) ? readFileSync(envFile, "utf8") : "", getVxEnv(config))
39
+ }
40
+ ];
41
+ };
42
+ var generateMetadata = (options = {}) => {
43
+ const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
44
+ const files = getMetadataFiles(loadVxAppConfig(projectRoot), projectRoot);
45
+ for (const file of files) writeMetadataFile(file);
46
+ return files.map((file) => file.path);
47
+ };
48
+ var watchMetadata = (options = {}) => {
49
+ const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
50
+ const configFile = path.join(projectRoot, "vx.app.yaml");
51
+ const regenerate = () => {
52
+ const files = generateMetadata(options);
53
+ console.log(`Generated ${files.length} metadata files from ${configFile}`);
54
+ };
55
+ regenerate();
56
+ return watch(projectRoot, { persistent: true }, (_event, filename) => {
57
+ if (filename === "vx.app.yaml" || filename === "vx.nav.yaml") regenerate();
58
+ });
59
+ };
60
+ //#endregion
61
+ export { generateMetadata, getMetadataFiles, loadVxAppConfig, watchMetadata };
@@ -0,0 +1,79 @@
1
+ import type { VxConfig } from './types';
2
+ export declare const getNextMetadata: (config: VxConfig, projectRoot?: string) => {
3
+ metadataBase: URL | undefined;
4
+ title: string;
5
+ description: string;
6
+ applicationName: string;
7
+ authors: {
8
+ name: string;
9
+ url: string;
10
+ }[] | undefined;
11
+ keywords: string[];
12
+ manifest: string;
13
+ icons: {
14
+ icon: ({
15
+ url: string;
16
+ type: string;
17
+ media: string;
18
+ color?: undefined;
19
+ } | {
20
+ url: string;
21
+ type: string;
22
+ media: string;
23
+ color: string;
24
+ })[];
25
+ shortcut: {
26
+ url: string;
27
+ media: string;
28
+ }[];
29
+ apple: {
30
+ url: string;
31
+ }[];
32
+ other: {
33
+ rel: string;
34
+ url: string;
35
+ media: string;
36
+ color: string;
37
+ }[];
38
+ };
39
+ appleWebApp: {
40
+ title: string;
41
+ capable: boolean;
42
+ startupImage: {
43
+ media: string;
44
+ url: string;
45
+ }[];
46
+ };
47
+ openGraph: {
48
+ type: string;
49
+ title: string;
50
+ description: string;
51
+ images: string[];
52
+ url: string;
53
+ };
54
+ twitter: {
55
+ creator: string;
56
+ site: string;
57
+ title: string;
58
+ description: string;
59
+ images: string[];
60
+ card: string;
61
+ };
62
+ other: {
63
+ 'mobile-web-app-capable': string;
64
+ 'msapplication-config': string;
65
+ 'msapplication-starturl': string;
66
+ 'twitter:url': string;
67
+ };
68
+ };
69
+ export declare const getNextViewport: (config: VxConfig, projectRoot?: string) => {
70
+ width: string;
71
+ initialScale: number;
72
+ maximumScale: number;
73
+ userScalable: boolean;
74
+ themeColor: {
75
+ media: string;
76
+ color: string;
77
+ }[];
78
+ };
79
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata/next.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,eAAe,GAC1B,QAAQ,QAAQ,EAChB,oBAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiG5B,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,QAAQ,QAAQ,EAChB,oBAA2B;;;;;;;;;CAoB5B,CAAA"}
@@ -0,0 +1,106 @@
1
+ import { getRuntimeMetadata } from "./runtime.js";
2
+ //#region src/lib/metadata/next.ts
3
+ var getNextMetadata = (config, projectRoot = process.cwd()) => {
4
+ const metadata = getRuntimeMetadata(config, projectRoot);
5
+ return {
6
+ metadataBase: metadata.url ? new URL(metadata.url) : void 0,
7
+ title: metadata.title,
8
+ description: metadata.description,
9
+ applicationName: metadata.microsoft.applicationName,
10
+ authors: metadata.author?.name ? [{
11
+ name: metadata.author.name,
12
+ url: metadata.author.url
13
+ }] : void 0,
14
+ keywords: metadata.keywords,
15
+ manifest: metadata.manifest,
16
+ icons: {
17
+ icon: [
18
+ {
19
+ url: metadata.icons.faviconLight,
20
+ type: "image/x-icon",
21
+ media: "(prefers-color-scheme: light)"
22
+ },
23
+ {
24
+ url: metadata.icons.faviconDark,
25
+ type: "image/x-icon",
26
+ media: "(prefers-color-scheme: dark)"
27
+ },
28
+ {
29
+ url: metadata.icons.maskIcon,
30
+ type: "image/svg+xml",
31
+ media: "(prefers-color-scheme: light)",
32
+ color: "black"
33
+ },
34
+ {
35
+ url: metadata.icons.maskIcon,
36
+ type: "image/svg+xml",
37
+ media: "(prefers-color-scheme: dark)",
38
+ color: "white"
39
+ }
40
+ ],
41
+ shortcut: [{
42
+ url: metadata.icons.faviconLight,
43
+ media: "(prefers-color-scheme: light)"
44
+ }, {
45
+ url: metadata.icons.faviconDark,
46
+ media: "(prefers-color-scheme: dark)"
47
+ }],
48
+ apple: [{ url: metadata.apple.touchIcon }],
49
+ other: [{
50
+ rel: "mask-icon",
51
+ url: metadata.icons.maskIcon,
52
+ media: "(prefers-color-scheme: light)",
53
+ color: "black"
54
+ }, {
55
+ rel: "mask-icon",
56
+ url: metadata.icons.maskIcon,
57
+ media: "(prefers-color-scheme: dark)",
58
+ color: "white"
59
+ }]
60
+ },
61
+ appleWebApp: {
62
+ title: metadata.apple.title,
63
+ capable: metadata.apple.capable,
64
+ startupImage: metadata.apple.startupImages
65
+ },
66
+ openGraph: {
67
+ type: metadata.openGraph.type,
68
+ title: metadata.openGraph.title,
69
+ description: metadata.openGraph.description,
70
+ images: [metadata.openGraph.image],
71
+ url: metadata.openGraph.url
72
+ },
73
+ twitter: {
74
+ creator: metadata.twitter.creator,
75
+ site: metadata.twitter.site,
76
+ title: metadata.twitter.title,
77
+ description: metadata.twitter.description,
78
+ images: [metadata.twitter.image],
79
+ card: metadata.twitter.card
80
+ },
81
+ other: {
82
+ "mobile-web-app-capable": metadata.mobileWebAppCapable ? "yes" : "no",
83
+ "msapplication-config": metadata.microsoft.config,
84
+ "msapplication-starturl": metadata.microsoft.startUrl,
85
+ "twitter:url": metadata.twitter.url
86
+ }
87
+ };
88
+ };
89
+ var getNextViewport = (config, projectRoot = process.cwd()) => {
90
+ const metadata = getRuntimeMetadata(config, projectRoot);
91
+ return {
92
+ width: "device-width",
93
+ initialScale: 1,
94
+ maximumScale: 1.5,
95
+ userScalable: true,
96
+ themeColor: [{
97
+ media: "(prefers-color-scheme: light)",
98
+ color: metadata.theme.lightColor
99
+ }, {
100
+ media: "(prefers-color-scheme: dark)",
101
+ color: metadata.theme.darkColor
102
+ }]
103
+ };
104
+ };
105
+ //#endregion
106
+ export { getNextMetadata, getNextViewport };
@@ -0,0 +1,3 @@
1
+ import type { MetadataFile, VxConfig } from './types';
2
+ export declare const getPublicMetadataFiles: (config: VxConfig, projectRoot: string) => MetadataFile[];
3
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata/public.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAiErD,eAAO,MAAM,sBAAsB,GACjC,QAAQ,QAAQ,EAChB,aAAa,MAAM,KAClB,YAAY,EA8Cd,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { createVersionedAssetUrl, getProjectAssetBaseUrl, getStaticAssetUrl, lowerFirst, normalizeIcons, toAssetUrl } from "./runtime.js";
2
+ import { generatedNotice, renderMetadataTemplate, stringifyManifest } from "./render.js";
3
+ import path from "node:path";
4
+ //#region src/lib/metadata/public.ts
5
+ var createManifest = (config, versionedAssetUrl) => {
6
+ const { core, pwa } = config;
7
+ return {
8
+ manifest_version: 1,
9
+ version: core.version,
10
+ id: core.id,
11
+ name: core.name,
12
+ short_name: core.shortName,
13
+ description: lowerFirst(core.description),
14
+ scope: pwa.scope,
15
+ start_url: `${pwa.startUrl}?utm_source=homescreen&utm_medium=shortcut&pwa=true`,
16
+ display: pwa.display,
17
+ orientation: pwa.orientation,
18
+ theme_color: config.branding.themeColor,
19
+ background_color: config.branding.backgroundColor,
20
+ categories: pwa.categories,
21
+ icons: normalizeIcons(pwa.icons).map((icon) => ({
22
+ src: toAssetUrl(icon.src, versionedAssetUrl),
23
+ sizes: icon.sizes,
24
+ type: icon.type
25
+ })),
26
+ screenshots: pwa.screenshots.map((screenshot) => ({
27
+ src: toAssetUrl(screenshot.src, versionedAssetUrl),
28
+ type: screenshot.type,
29
+ sizes: screenshot.sizes
30
+ })),
31
+ shortcuts: pwa.shortcuts.map((shortcut) => ({
32
+ name: shortcut.name,
33
+ short_name: shortcut.shortName,
34
+ url: `${shortcut.url}?utm_source=jumplist&utm_medium=shortcut&pwa=true`,
35
+ icons: normalizeIcons(shortcut.icons).map((icon) => ({
36
+ src: toAssetUrl(icon.src, versionedAssetUrl),
37
+ sizes: icon.sizes,
38
+ type: icon.type
39
+ }))
40
+ }))
41
+ };
42
+ };
43
+ var renderBrowserConfig = (versionedAssetUrl) => {
44
+ return `<?xml version="1.0" encoding="utf-8" ?>
45
+ <!-- ${generatedNotice} -->
46
+ <browserconfig>
47
+ <msapplication>
48
+ <tile>
49
+ <square70x70logo
50
+ src="${versionedAssetUrl("icons/icon-square-70x70.png")}" />
51
+ <square150x150logo
52
+ src="${versionedAssetUrl("icons/icon-square-150x150.png")}" />
53
+ <wide310x150logo
54
+ src="${versionedAssetUrl("icons/icon-square-310x150.png")}" />
55
+ <square310x310logo
56
+ src="${versionedAssetUrl("icons/icon-square-310x310.png")}" />
57
+ <tilecolor>transparent</tilecolor>
58
+ </tile>
59
+ </msapplication>
60
+ </browserconfig>
61
+ `;
62
+ };
63
+ var getPublicMetadataFiles = (config, projectRoot) => {
64
+ const { core } = config;
65
+ const publicDir = path.resolve(projectRoot, "public");
66
+ const versionedAssetUrl = createVersionedAssetUrl(getProjectAssetBaseUrl(projectRoot), core.version);
67
+ const offlinePage = renderMetadataTemplate("offline.html", {
68
+ generatedNotice,
69
+ author: core.publisher.name,
70
+ appName: core.name,
71
+ imageUrl: getStaticAssetUrl("vassets/no-internet.svg", core.version)
72
+ });
73
+ const notFoundPage = renderMetadataTemplate("not-found.html", {
74
+ generatedNotice,
75
+ author: core.publisher.name,
76
+ appName: core.name,
77
+ imageUrl: getStaticAssetUrl("vassets/no-internet.svg", core.version)
78
+ });
79
+ return [
80
+ {
81
+ path: path.join(publicDir, "manifest.webmanifest"),
82
+ content: `${stringifyManifest(createManifest(config, versionedAssetUrl))}\n`
83
+ },
84
+ {
85
+ path: path.join(publicDir, "browserconfig.xml"),
86
+ content: renderBrowserConfig(versionedAssetUrl)
87
+ },
88
+ {
89
+ path: path.join(publicDir, "robots.txt"),
90
+ content: `# ${generatedNotice}\n# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n`
91
+ },
92
+ {
93
+ path: path.join(publicDir, "sw.js"),
94
+ content: `/* ${generatedNotice} */\n/* global importScripts */\nimportScripts('https://static.cdn.vezham.com/workers/sw.js?vx=${core.version}')\n`
95
+ },
96
+ {
97
+ path: path.join(publicDir, "offline.html"),
98
+ content: offlinePage
99
+ },
100
+ {
101
+ path: path.join(publicDir, "404.html"),
102
+ content: notFoundPage
103
+ }
104
+ ];
105
+ };
106
+ //#endregion
107
+ export { getPublicMetadataFiles };
@@ -0,0 +1,7 @@
1
+ import { type VxConfig } from './types';
2
+ export declare const generatedNotice = "Generated by Vx metadata. DO NOT EDIT.";
3
+ export declare const stringifyManifest: (manifest: Record<string, unknown>) => string;
4
+ export declare const escapeHtml: (value: string) => string;
5
+ export declare const renderMetadataTemplate: (name: string, values: Record<string, string>) => string;
6
+ export declare const getGeneratedMetadataModule: (config: VxConfig, projectRoot?: string) => string;
7
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata/render.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,eAAe,2CAA2C,CAAA;AAEvE,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAIhE,CAAA;AAIH,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,WAKZ,CAAA;AAO5B,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,EACZ,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAY1B,CAAA;AAEN,eAAO,MAAM,0BAA0B,GACrC,QAAQ,QAAQ,EAChB,oBAA2B,WAsB3B,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { resolveI18n } from "../i18n.js";
2
+ import { resolveDocsConfig } from "../presets/docs/config.js";
3
+ import { getRuntimeMetadata } from "./runtime.js";
4
+ import { getNextMetadata, getNextViewport } from "./next.js";
5
+ import { getTanStackHead } from "./tanstack.js";
6
+ import { readFileSync } from "node:fs";
7
+ import path from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ //#region src/lib/metadata/render.ts
10
+ var generatedNotice = "Generated by Vx metadata. DO NOT EDIT.";
11
+ var stringifyManifest = (manifest) => JSON.stringify(manifest, null, 2).replace("\"categories\": [\n \"productivity\",\n \"personalization\",\n \"utilities\"\n ]", "\"categories\": [\"productivity\", \"personalization\", \"utilities\"]");
12
+ var stringifyTs = (value) => JSON.stringify(value, null, 2);
13
+ var escapeHtml = (value) => value.replaceAll("&", "&amp;").replaceAll("\"", "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
14
+ var metadataTemplatesDir = path.join(path.dirname(fileURLToPath(import.meta.url)), "templates");
15
+ var renderMetadataTemplate = (name, values) => readFileSync(path.join(metadataTemplatesDir, name), "utf8").replace(/^[ \t]*<!-- prettier-ignore -->\r?\n/gm, "").replaceAll(/\{\{(\w+)\}\}/g, (_, key) => {
16
+ const value = values[key];
17
+ if (value === void 0) throw new Error(`Missing metadata template value: ${key}`);
18
+ return escapeHtml(value);
19
+ });
20
+ var getGeneratedMetadataModule = (config, projectRoot = process.cwd()) => `// ${generatedNotice}
21
+
22
+ export const vxMetadata = ${stringifyTs(getRuntimeMetadata(config, projectRoot))} as const
23
+
24
+ export const vxCore = ${stringifyTs(config.core)} as const
25
+
26
+ ${config.framework === "tanstack-docs" ? `export const vxDocs = ${stringifyTs(resolveDocsConfig(config.docs))} as const` : ""}
27
+
28
+ export const vxI18n = ${stringifyTs(resolveI18n(config.i18n))} as const
29
+
30
+ export type Locale = (typeof vxI18n.languages)[number]
31
+ ${config.framework === "next" ? `
32
+ export const nextMetadata = ${stringifyTs(getNextMetadata(config, projectRoot))}
33
+
34
+ export const nextViewport = ${stringifyTs(getNextViewport(config, projectRoot))}` : config.framework === "tanstack" || config.framework === "tanstack-docs" ? `
35
+ export const tanstackHead = ${stringifyTs(getTanStackHead(config, projectRoot))}` : ""}`;
36
+ //#endregion
37
+ export { escapeHtml, generatedNotice, getGeneratedMetadataModule, renderMetadataTemplate, stringifyManifest };
@@ -0,0 +1,68 @@
1
+ import { type VxConfig, type VxIcon, type VxIconSource } from './types';
2
+ export declare const lowerFirst: (value: string) => string;
3
+ export declare const getProjectAssetBaseUrl: (projectRoot: string) => string;
4
+ export declare const createVersionedAssetUrl: (baseUrl: string, version: string) => (assetPath: string) => string;
5
+ export declare const getStaticAssetUrl: (assetPath: string, version: string) => string;
6
+ export declare const toAssetUrl: (assetPath: string, versionedAssetUrl: (assetPath: string) => string) => string;
7
+ type SocialImageSource = 'default' | 'path' | 'url';
8
+ export declare const normalizeIcons: (icons: VxIconSource) => VxIcon[];
9
+ export declare const getRuntimeMetadata: (config: VxConfig, projectRoot?: string) => {
10
+ title: string;
11
+ description: string;
12
+ url: string;
13
+ manifest: string;
14
+ browserConfig: string;
15
+ startUrl: string;
16
+ author: {
17
+ name: string;
18
+ url: string;
19
+ };
20
+ keywords: string[];
21
+ theme: {
22
+ lightColor: string;
23
+ darkColor: string;
24
+ lightBackgroundColor: string;
25
+ darkBackgroundColor: string;
26
+ };
27
+ mobileWebAppCapable: boolean;
28
+ apple: {
29
+ title: string;
30
+ capable: boolean;
31
+ touchIcon: string;
32
+ startupImages: {
33
+ media: string;
34
+ url: string;
35
+ }[];
36
+ };
37
+ icons: {
38
+ faviconLight: string;
39
+ faviconDark: string;
40
+ maskIcon: string;
41
+ };
42
+ microsoft: {
43
+ applicationName: string;
44
+ config: string;
45
+ startUrl: string;
46
+ };
47
+ openGraph: {
48
+ type: string;
49
+ title: string;
50
+ description: string;
51
+ image: string;
52
+ imageSource: SocialImageSource;
53
+ url: string;
54
+ };
55
+ twitter: {
56
+ creator: string;
57
+ site: string;
58
+ title: string;
59
+ description: string;
60
+ image: string;
61
+ url: string;
62
+ card: string;
63
+ };
64
+ defaultLanguage: string;
65
+ languages: string[];
66
+ };
67
+ export {};
68
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,YAAY,EAGlB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,WAC6B,CAAA;AAIrE,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,WACmC,CAAA;AAE7F,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,EAAE,SAAS,MAAM,MAG9D,WAAW,MAAM,WAE1B,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,EAAE,SAAS,MAAM,WAC+B,CAAA;AAEnG,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,mBAAmB,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,WAIhB,CAAA;AAElC,KAAK,iBAAiB,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAA;AAyEnD,eAAO,MAAM,cAAc,GAAI,OAAO,YAAY,KAAG,MAAM,EAU1D,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,QAAQ,EAChB,oBAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiF5B,CAAA"}