@imjp/writenex-astro 0.1.0

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 (141) hide show
  1. package/README.md +539 -0
  2. package/dist/chunk-5PM6EQE5.js +151 -0
  3. package/dist/chunk-5PM6EQE5.js.map +1 -0
  4. package/dist/chunk-7XU5X6CW.js +1331 -0
  5. package/dist/chunk-7XU5X6CW.js.map +1 -0
  6. package/dist/chunk-AAOQHQPU.js +574 -0
  7. package/dist/chunk-AAOQHQPU.js.map +1 -0
  8. package/dist/chunk-CF2XXJFF.js +1410 -0
  9. package/dist/chunk-CF2XXJFF.js.map +1 -0
  10. package/dist/chunk-CRPZUUDU.js +52 -0
  11. package/dist/chunk-CRPZUUDU.js.map +1 -0
  12. package/dist/chunk-CYLDJ3HZ.js +310 -0
  13. package/dist/chunk-CYLDJ3HZ.js.map +1 -0
  14. package/dist/chunk-KIKIPIFA.js +1 -0
  15. package/dist/chunk-KIKIPIFA.js.map +1 -0
  16. package/dist/chunk-XNTQTTJU.js +145 -0
  17. package/dist/chunk-XNTQTTJU.js.map +1 -0
  18. package/dist/client/index.css +2 -0
  19. package/dist/client/index.css.map +1 -0
  20. package/dist/client/index.js +375 -0
  21. package/dist/client/index.js.map +1 -0
  22. package/dist/client/styles.css +584 -0
  23. package/dist/client/variables.css +304 -0
  24. package/dist/config/index.d.ts +54 -0
  25. package/dist/config/index.js +38 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config-BmEdBDo_.d.ts +220 -0
  28. package/dist/content-BWR52vD-.d.ts +64 -0
  29. package/dist/discovery/index.d.ts +310 -0
  30. package/dist/discovery/index.js +38 -0
  31. package/dist/discovery/index.js.map +1 -0
  32. package/dist/errors-C0iYiDTv.d.ts +107 -0
  33. package/dist/filesystem/index.d.ts +1292 -0
  34. package/dist/filesystem/index.js +203 -0
  35. package/dist/filesystem/index.js.map +1 -0
  36. package/dist/image-FP7w5ZIs.d.ts +47 -0
  37. package/dist/index.d.ts +64 -0
  38. package/dist/index.js +151 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/loader-55LWCXHA.js +12 -0
  41. package/dist/loader-55LWCXHA.js.map +1 -0
  42. package/dist/loader-CrdnaAWR.d.ts +327 -0
  43. package/dist/server/index.d.ts +357 -0
  44. package/dist/server/index.js +37 -0
  45. package/dist/server/index.js.map +1 -0
  46. package/package.json +94 -0
  47. package/src/client/App.tsx +900 -0
  48. package/src/client/components/ConfigPanel/ConfigPanel.css +553 -0
  49. package/src/client/components/ConfigPanel/ConfigPanel.tsx +396 -0
  50. package/src/client/components/ConfigPanel/index.ts +6 -0
  51. package/src/client/components/CreateContentModal/CreateContentModal.css +327 -0
  52. package/src/client/components/CreateContentModal/CreateContentModal.tsx +216 -0
  53. package/src/client/components/CreateContentModal/index.ts +7 -0
  54. package/src/client/components/Editor/Editor.css +885 -0
  55. package/src/client/components/Editor/Editor.tsx +484 -0
  56. package/src/client/components/Editor/ImageDialog.css +344 -0
  57. package/src/client/components/Editor/ImageDialog.tsx +367 -0
  58. package/src/client/components/Editor/LinkDialog.css +326 -0
  59. package/src/client/components/Editor/LinkDialog.tsx +332 -0
  60. package/src/client/components/Editor/index.ts +6 -0
  61. package/src/client/components/FrontmatterForm/FrontmatterForm.css +468 -0
  62. package/src/client/components/FrontmatterForm/FrontmatterForm.tsx +914 -0
  63. package/src/client/components/FrontmatterForm/index.ts +7 -0
  64. package/src/client/components/Header/Header.css +300 -0
  65. package/src/client/components/Header/Header.tsx +300 -0
  66. package/src/client/components/Header/index.ts +7 -0
  67. package/src/client/components/KeyboardShortcuts/KeyboardShortcuts.css +239 -0
  68. package/src/client/components/KeyboardShortcuts/KeyboardShortcuts.tsx +151 -0
  69. package/src/client/components/KeyboardShortcuts/index.ts +6 -0
  70. package/src/client/components/LazyEditor.tsx +75 -0
  71. package/src/client/components/LiveRegion/LiveRegion.css +19 -0
  72. package/src/client/components/LiveRegion/LiveRegion.tsx +60 -0
  73. package/src/client/components/LiveRegion/index.ts +7 -0
  74. package/src/client/components/SearchReplace/SearchReplacePanel.css +300 -0
  75. package/src/client/components/SearchReplace/SearchReplacePanel.tsx +332 -0
  76. package/src/client/components/SearchReplace/index.ts +7 -0
  77. package/src/client/components/SelectCollectionModal/SelectCollectionModal.css +308 -0
  78. package/src/client/components/SelectCollectionModal/SelectCollectionModal.tsx +223 -0
  79. package/src/client/components/SelectCollectionModal/index.ts +7 -0
  80. package/src/client/components/Sidebar/Sidebar.css +570 -0
  81. package/src/client/components/Sidebar/Sidebar.tsx +617 -0
  82. package/src/client/components/Sidebar/index.ts +7 -0
  83. package/src/client/components/SkipLink/SkipLink.css +51 -0
  84. package/src/client/components/SkipLink/SkipLink.tsx +67 -0
  85. package/src/client/components/SkipLink/index.ts +7 -0
  86. package/src/client/components/UnsavedChangesModal/UnsavedChangesModal.css +233 -0
  87. package/src/client/components/UnsavedChangesModal/UnsavedChangesModal.tsx +160 -0
  88. package/src/client/components/UnsavedChangesModal/index.ts +1 -0
  89. package/src/client/components/VersionHistory/DiffViewer.css +430 -0
  90. package/src/client/components/VersionHistory/DiffViewer.tsx +383 -0
  91. package/src/client/components/VersionHistory/VersionActions.css +318 -0
  92. package/src/client/components/VersionHistory/VersionActions.tsx +277 -0
  93. package/src/client/components/VersionHistory/VersionHistoryPanel.css +369 -0
  94. package/src/client/components/VersionHistory/VersionHistoryPanel.tsx +469 -0
  95. package/src/client/components/VersionHistory/index.ts +9 -0
  96. package/src/client/context/ApiContext.tsx +154 -0
  97. package/src/client/context/ThemeContext.tsx +172 -0
  98. package/src/client/hooks/useAnnounce.ts +201 -0
  99. package/src/client/hooks/useApi.ts +374 -0
  100. package/src/client/hooks/useArrowNavigation.ts +286 -0
  101. package/src/client/hooks/useAutosave.ts +241 -0
  102. package/src/client/hooks/useFocusTrap.ts +178 -0
  103. package/src/client/hooks/useKeyboardShortcuts.ts +203 -0
  104. package/src/client/hooks/useSearch.ts +206 -0
  105. package/src/client/hooks/useVersionHistory.ts +451 -0
  106. package/src/client/index.tsx +70 -0
  107. package/src/client/styles.css +584 -0
  108. package/src/client/utils/focus.ts +57 -0
  109. package/src/client/utils/openInEditor.ts +130 -0
  110. package/src/client/variables.css +304 -0
  111. package/src/config/defaults.ts +109 -0
  112. package/src/config/index.ts +32 -0
  113. package/src/config/loader.ts +174 -0
  114. package/src/config/schema.ts +161 -0
  115. package/src/core/constants.ts +39 -0
  116. package/src/core/errors.ts +739 -0
  117. package/src/core/index.ts +11 -0
  118. package/src/discovery/collections.ts +216 -0
  119. package/src/discovery/index.ts +33 -0
  120. package/src/discovery/patterns.ts +702 -0
  121. package/src/discovery/schema.ts +453 -0
  122. package/src/filesystem/images.ts +798 -0
  123. package/src/filesystem/index.ts +107 -0
  124. package/src/filesystem/reader.ts +452 -0
  125. package/src/filesystem/version-config.ts +390 -0
  126. package/src/filesystem/versions.ts +1339 -0
  127. package/src/filesystem/watcher.ts +226 -0
  128. package/src/filesystem/writer.ts +540 -0
  129. package/src/index.ts +61 -0
  130. package/src/integration.ts +228 -0
  131. package/src/server/assets.ts +254 -0
  132. package/src/server/cache.ts +355 -0
  133. package/src/server/index.ts +33 -0
  134. package/src/server/middleware.ts +209 -0
  135. package/src/server/routes.ts +1428 -0
  136. package/src/types/api.ts +61 -0
  137. package/src/types/config.ts +134 -0
  138. package/src/types/content.ts +64 -0
  139. package/src/types/image.ts +48 -0
  140. package/src/types/index.ts +58 -0
  141. package/src/types/version.ts +117 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/loader.ts","../src/config/schema.ts"],"sourcesContent":["/**\n * @fileoverview Configuration loader for @writenex/astro\n *\n * This module handles loading Writenex configuration from various sources:\n * - writenex.config.ts (TypeScript)\n * - writenex.config.js (JavaScript)\n * - writenex.config.mjs (ES Module)\n *\n * The loader searches for configuration files in the project root and\n * applies default values for any missing options.\n *\n * @module @writenex/astro/config/loader\n */\n\nimport { existsSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { join, resolve } from \"node:path\";\nimport type { WritenexConfig } from \"@/types\";\nimport { validateConfig } from \"./schema\";\nimport { applyConfigDefaults } from \"./defaults\";\n\n/**\n * Supported configuration file names in order of priority\n */\nconst CONFIG_FILE_NAMES = [\n \"writenex.config.ts\",\n \"writenex.config.mts\",\n \"writenex.config.js\",\n \"writenex.config.mjs\",\n];\n\n/**\n * Result of loading configuration\n */\nexport interface LoadConfigResult {\n /** The loaded and validated configuration with defaults applied */\n config: Required<WritenexConfig>;\n /** Path to the configuration file (if found) */\n configPath: string | null;\n /** Whether a configuration file was found */\n hasConfigFile: boolean;\n /** Any warnings generated during loading */\n warnings: string[];\n}\n\n/**\n * Find the configuration file in the project root\n *\n * @param projectRoot - The root directory of the Astro project\n * @returns Path to the configuration file, or null if not found\n */\nexport function findConfigFile(projectRoot: string): string | null {\n for (const fileName of CONFIG_FILE_NAMES) {\n const filePath = join(projectRoot, fileName);\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n}\n\n/**\n * Load configuration from a file\n *\n * @param configPath - Path to the configuration file\n * @returns The loaded configuration object\n * @throws Error if the file cannot be loaded or parsed\n */\nasync function loadConfigFile(configPath: string): Promise<WritenexConfig> {\n try {\n // Convert to file URL for dynamic import (required for Windows compatibility)\n const fileUrl = pathToFileURL(resolve(configPath)).href;\n\n // Dynamic import the configuration file\n const module = await import(fileUrl);\n\n // Support both default export and named export\n const config = module.default ?? module.config ?? module;\n\n return config as WritenexConfig;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load configuration from ${configPath}: ${message}`\n );\n }\n}\n\n/**\n * Load Writenex configuration from the project root\n *\n * This function:\n * 1. Searches for a configuration file in the project root\n * 2. Loads and validates the configuration if found\n * 3. Applies default values for any missing options\n * 4. Returns the resolved configuration\n *\n * If no configuration file is found, default configuration is returned\n * with auto-discovery enabled.\n *\n * @param projectRoot - The root directory of the Astro project\n * @returns LoadConfigResult with the resolved configuration\n *\n * @example\n * ```typescript\n * const { config, hasConfigFile, warnings } = await loadConfig('/path/to/project');\n *\n * if (!hasConfigFile) {\n * console.log('Using auto-discovery mode');\n * }\n *\n * if (warnings.length > 0) {\n * warnings.forEach(w => console.warn(w));\n * }\n * ```\n */\nexport async function loadConfig(\n projectRoot: string\n): Promise<LoadConfigResult> {\n const warnings: string[] = [];\n let userConfig: WritenexConfig = {};\n let configPath: string | null = null;\n let hasConfigFile = false;\n\n // Try to find and load configuration file\n configPath = findConfigFile(projectRoot);\n\n if (configPath) {\n hasConfigFile = true;\n\n try {\n userConfig = await loadConfigFile(configPath);\n\n // Validate the loaded configuration\n const validationResult = validateConfig(userConfig);\n\n if (!validationResult.success) {\n const errors = validationResult.error.errors\n .map((e) => `${e.path.join(\".\")}: ${e.message}`)\n .join(\", \");\n warnings.push(`Configuration validation warnings: ${errors}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`Failed to load config file: ${message}. Using defaults.`);\n userConfig = {};\n }\n }\n\n // Apply defaults to the configuration\n const config = applyConfigDefaults(userConfig);\n\n return {\n config,\n configPath,\n hasConfigFile,\n warnings,\n };\n}\n\n/**\n * Check if a content directory exists in the project\n *\n * @param projectRoot - The root directory of the Astro project\n * @param contentPath - Relative path to the content directory\n * @returns True if the content directory exists\n */\nexport function contentDirectoryExists(\n projectRoot: string,\n contentPath: string = \"src/content\"\n): boolean {\n const fullPath = join(projectRoot, contentPath);\n return existsSync(fullPath);\n}\n","/**\n * @fileoverview Configuration schema and validation for @writenex/astro\n *\n * This module provides Zod schemas for validating Writenex configuration\n * and a helper function for defining type-safe configurations.\n *\n * @module @writenex/astro/config/schema\n */\n\nimport { z } from \"zod\";\nimport type { WritenexConfig } from \"@/types\";\n\n/**\n * Schema for field type definitions\n */\nconst fieldTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"date\",\n \"array\",\n \"image\",\n \"object\",\n]);\n\n/**\n * Schema for individual schema field definition\n */\nconst schemaFieldSchema = z.object({\n type: fieldTypeSchema,\n required: z.boolean().optional(),\n default: z.unknown().optional(),\n items: z.string().optional(),\n description: z.string().optional(),\n});\n\n/**\n * Schema for collection schema (record of field definitions)\n */\nconst collectionSchemaSchema = z.record(z.string(), schemaFieldSchema);\n\n/**\n * Schema for image strategy\n */\nconst imageStrategySchema = z.enum([\"colocated\", \"public\", \"custom\"]);\n\n/**\n * Schema for image configuration\n */\nconst imageConfigSchema = z.object({\n strategy: imageStrategySchema,\n publicPath: z.string().optional(),\n storagePath: z.string().optional(),\n});\n\n/**\n * Schema for collection configuration\n */\nconst collectionConfigSchema = z.object({\n name: z.string().min(1, \"Collection name is required\"),\n path: z.string().min(1, \"Collection path is required\"),\n filePattern: z.string().optional(),\n previewUrl: z.string().optional(),\n schema: collectionSchemaSchema.optional(),\n images: imageConfigSchema.optional(),\n});\n\n/**\n * Schema for discovery configuration\n */\nconst discoveryConfigSchema = z.object({\n enabled: z.boolean(),\n ignore: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for editor configuration\n */\nconst editorConfigSchema = z.object({\n autosave: z.boolean().optional(),\n autosaveInterval: z.number().positive().optional(),\n});\n\n/**\n * Schema for version history configuration\n */\nconst versionHistoryConfigSchema = z.object({\n enabled: z.boolean().optional(),\n maxVersions: z.number().int().positive().optional(),\n storagePath: z.string().optional(),\n});\n\n/**\n * Main Writenex configuration schema\n */\nexport const writenexConfigSchema = z.object({\n collections: z.array(collectionConfigSchema).optional(),\n images: imageConfigSchema.optional(),\n editor: editorConfigSchema.optional(),\n discovery: discoveryConfigSchema.optional(),\n versionHistory: versionHistoryConfigSchema.optional(),\n});\n\n/**\n * Schema for integration options\n */\nexport const writenexOptionsSchema = z.object({\n allowProduction: z.boolean().optional(),\n});\n\n/**\n * Helper function for defining type-safe Writenex configuration.\n *\n * This function provides IDE autocompletion and type checking for\n * the configuration object. It's the recommended way to create\n * a writenex.config.ts file.\n *\n * @param config - The Writenex configuration object\n * @returns The same configuration object (identity function for type safety)\n *\n * @example\n * ```typescript\n * // writenex.config.ts\n * import { defineConfig } from '@writenex/astro';\n *\n * export default defineConfig({\n * collections: [\n * {\n * name: 'blog',\n * path: 'src/content/blog',\n * filePattern: '{slug}.md',\n * },\n * ],\n * });\n * ```\n */\nexport function defineConfig(config: WritenexConfig): WritenexConfig {\n // Validate the configuration\n const result = writenexConfigSchema.safeParse(config);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n console.warn(`[writenex] Invalid configuration:\\n${errors}`);\n }\n\n return config;\n}\n\n/**\n * Validate a Writenex configuration object\n *\n * @param config - The configuration to validate\n * @returns Validation result with success status and parsed data or errors\n */\nexport function validateConfig(\n config: unknown\n): z.SafeParseReturnType<unknown, WritenexConfig> {\n return writenexConfigSchema.safeParse(config);\n}\n"],"mappings":"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","names":[]}