@osdk/vite-plugin-oac 0.1.0-beta.0 → 0.1.0-beta.1

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 (88) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/build/browser/Logger.js +64 -0
  3. package/build/browser/Logger.js.map +1 -0
  4. package/build/browser/OacConfig.js +22 -0
  5. package/build/browser/OacConfig.js.map +1 -0
  6. package/build/browser/OacContext.js +42 -0
  7. package/build/browser/OacContext.js.map +1 -0
  8. package/build/browser/OacDevServer.js +80 -0
  9. package/build/browser/OacDevServer.js.map +1 -0
  10. package/build/browser/OacServerContext.js +26 -0
  11. package/build/browser/OacServerContext.js.map +1 -0
  12. package/build/browser/applyOntologyAndSeed.js +38 -0
  13. package/build/browser/applyOntologyAndSeed.js.map +1 -0
  14. package/build/browser/generateOntologyAssets.js +81 -87
  15. package/build/browser/generateOntologyAssets.js.map +1 -1
  16. package/build/browser/index.js +2 -52
  17. package/build/browser/index.js.map +1 -1
  18. package/build/browser/ontologyAsCode.js +58 -0
  19. package/build/browser/ontologyAsCode.js.map +1 -0
  20. package/build/browser/registerOntologyFullMetadata.js +90 -57
  21. package/build/browser/registerOntologyFullMetadata.js.map +1 -1
  22. package/build/browser/syncDirectories.js +11 -34
  23. package/build/browser/syncDirectories.js.map +1 -1
  24. package/build/cjs/index.cjs +487 -414
  25. package/build/cjs/index.cjs.map +1 -1
  26. package/build/cjs/index.d.cts +20 -6
  27. package/build/esm/Logger.js +64 -0
  28. package/build/esm/Logger.js.map +1 -0
  29. package/build/esm/OacConfig.js +22 -0
  30. package/build/esm/OacConfig.js.map +1 -0
  31. package/build/esm/OacContext.js +42 -0
  32. package/build/esm/OacContext.js.map +1 -0
  33. package/build/esm/OacDevServer.js +80 -0
  34. package/build/esm/OacDevServer.js.map +1 -0
  35. package/build/esm/OacServerContext.js +26 -0
  36. package/build/esm/OacServerContext.js.map +1 -0
  37. package/build/esm/applyOntologyAndSeed.js +38 -0
  38. package/build/esm/applyOntologyAndSeed.js.map +1 -0
  39. package/build/esm/generateOntologyAssets.js +81 -87
  40. package/build/esm/generateOntologyAssets.js.map +1 -1
  41. package/build/esm/index.js +2 -52
  42. package/build/esm/index.js.map +1 -1
  43. package/build/esm/ontologyAsCode.js +58 -0
  44. package/build/esm/ontologyAsCode.js.map +1 -0
  45. package/build/esm/registerOntologyFullMetadata.js +90 -57
  46. package/build/esm/registerOntologyFullMetadata.js.map +1 -1
  47. package/build/esm/syncDirectories.js +11 -34
  48. package/build/esm/syncDirectories.js.map +1 -1
  49. package/build/types/Logger.d.ts +18 -0
  50. package/build/types/Logger.d.ts.map +1 -0
  51. package/build/types/OacConfig.d.ts +12 -0
  52. package/build/types/OacConfig.d.ts.map +1 -0
  53. package/build/types/OacContext.d.ts +12 -0
  54. package/build/types/OacContext.d.ts.map +1 -0
  55. package/build/types/OacDevServer.d.ts +10 -0
  56. package/build/types/OacDevServer.d.ts.map +1 -0
  57. package/build/types/OacServerContext.d.ts +12 -0
  58. package/build/types/OacServerContext.d.ts.map +1 -0
  59. package/build/types/applyOntologyAndSeed.d.ts +3 -0
  60. package/build/types/applyOntologyAndSeed.d.ts.map +1 -0
  61. package/build/types/generateOntologyAssets.d.ts +4 -7
  62. package/build/types/generateOntologyAssets.d.ts.map +1 -1
  63. package/build/types/index.d.ts +2 -11
  64. package/build/types/index.d.ts.map +1 -1
  65. package/build/types/ontologyAsCode.d.ts +7 -0
  66. package/build/types/ontologyAsCode.d.ts.map +1 -0
  67. package/build/types/registerOntologyFullMetadata.d.ts.map +1 -1
  68. package/build/types/syncDirectories.d.ts +1 -1
  69. package/build/types/syncDirectories.d.ts.map +1 -1
  70. package/package.json +10 -7
  71. package/build/browser/FauxFoundryTypes.js +0 -2
  72. package/build/browser/FauxFoundryTypes.js.map +0 -1
  73. package/build/browser/FoundryMiddlewareController.js +0 -88
  74. package/build/browser/FoundryMiddlewareController.js.map +0 -1
  75. package/build/browser/watchOntologyAsCode.js +0 -69
  76. package/build/browser/watchOntologyAsCode.js.map +0 -1
  77. package/build/esm/FauxFoundryTypes.js +0 -2
  78. package/build/esm/FauxFoundryTypes.js.map +0 -1
  79. package/build/esm/FoundryMiddlewareController.js +0 -88
  80. package/build/esm/FoundryMiddlewareController.js.map +0 -1
  81. package/build/esm/watchOntologyAsCode.js +0 -69
  82. package/build/esm/watchOntologyAsCode.js.map +0 -1
  83. package/build/types/FauxFoundryTypes.d.ts +0 -2
  84. package/build/types/FauxFoundryTypes.d.ts.map +0 -1
  85. package/build/types/FoundryMiddlewareController.d.ts +0 -14
  86. package/build/types/FoundryMiddlewareController.d.ts.map +0 -1
  87. package/build/types/watchOntologyAsCode.d.ts +0 -10
  88. package/build/types/watchOntologyAsCode.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"syncDirectories.js","names":["crypto","fs","path","NOISY","syncDirectories","sourceDir","targetDir","logger","info","timestamp","promises","mkdir","recursive","sourceFiles","targetFiles","Promise","all","getAllFiles","updatedCount","addedCount","removedCount","unchangedCount","errors","relativeFile","sourceFile","join","targetFile","targetExists","includes","isDifferent","areFilesDifferent","dirname","copyFile","error","errorMsg","Error","message","String","push","unlink","removeEmptyDirectories","warn","length","dir","entries","readdir","withFileTypes","entry","isDirectory","subdir","name","remainingEntries","resolve","rmdir","getFileHash","filePath","content","readFile","createHash","update","digest","sourceHash","targetHash","baseDir","files","fullPath","relativePath","relative","subFiles","isFile"],"sources":["syncDirectories.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Logger } from \"vite\";\nimport { NOISY } from \"./generateOntologyAssets.js\";\n\n/**\n * Synchronize directories by copying only changed files and removing obsolete ones\n */\nexport async function syncDirectories(\n sourceDir: string,\n targetDir: string,\n logger: Logger,\n): Promise<void> {\n if (NOISY) {\n logger.info(`Synchronizing ${sourceDir} to ${targetDir}`, {\n timestamp: true,\n });\n }\n\n // Ensure target directory exists\n await fs.promises.mkdir(targetDir, { recursive: true });\n\n // Get all files in both directories\n const [sourceFiles, targetFiles] = await Promise.all([\n getAllFiles(sourceDir),\n getAllFiles(targetDir),\n ]);\n\n let updatedCount = 0;\n let addedCount = 0;\n let removedCount = 0;\n let unchangedCount = 0;\n const errors: string[] = [];\n\n // Process files from source directory\n for (const relativeFile of sourceFiles) {\n const sourceFile = path.join(sourceDir, relativeFile);\n const targetFile = path.join(targetDir, relativeFile);\n\n try {\n const targetExists = targetFiles.includes(relativeFile);\n const isDifferent = await areFilesDifferent(sourceFile, targetFile);\n\n if (!targetExists) {\n // New file - need to create directory structure\n await fs.promises.mkdir(path.dirname(targetFile), { recursive: true });\n await fs.promises.copyFile(sourceFile, targetFile);\n addedCount++;\n logger.info(`Added: ${relativeFile}`, { timestamp: true });\n } else if (isDifferent) {\n // Changed file - update it\n await fs.promises.copyFile(sourceFile, targetFile);\n updatedCount++;\n logger.info(`Updated: ${targetFile}`, { timestamp: true });\n } else {\n // File is unchanged\n unchangedCount++;\n }\n } catch (error) {\n const errorMsg = `Failed to sync ${relativeFile}: ${\n error instanceof Error ? error.message : String(error)\n }`;\n errors.push(errorMsg);\n logger.error(errorMsg, { timestamp: true });\n }\n }\n\n // Remove files that exist in target but not in source\n for (const relativeFile of targetFiles) {\n if (!sourceFiles.includes(relativeFile)) {\n const targetFile = path.join(targetDir, relativeFile);\n try {\n await fs.promises.unlink(targetFile);\n removedCount++;\n logger.info(`Removed: ${relativeFile}`, { timestamp: true });\n } catch (error) {\n const errorMsg = `Failed to remove ${relativeFile}: ${\n error instanceof Error ? error.message : String(error)\n }`;\n errors.push(errorMsg);\n logger.error(errorMsg, { timestamp: true });\n }\n }\n }\n\n // Clean up empty directories in target\n try {\n await removeEmptyDirectories(targetDir);\n } catch (error) {\n logger.warn(\n `Failed to clean up empty directories: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { timestamp: true },\n );\n }\n\n if (NOISY) {\n // Log summary\n logger.info(\n `Sync complete: ${addedCount} added, ${updatedCount} updated, ${removedCount} removed, ${unchangedCount} unchanged`,\n { timestamp: true },\n );\n }\n\n if (errors.length > 0) {\n logger.warn(`Encountered ${errors.length} errors during sync`, {\n timestamp: true,\n });\n }\n}\n\n/**\n * Remove empty directories recursively\n */\nasync function removeEmptyDirectories(dir: string): Promise<void> {\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n // First, recursively clean subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subdir = path.join(dir, entry.name);\n await removeEmptyDirectories(subdir);\n }\n }\n\n // Then check if this directory is now empty\n const remainingEntries = await fs.promises.readdir(dir);\n if (remainingEntries.length === 0) {\n // Don't remove the root target directory itself\n const targetDir = \".osdk/src\";\n if (path.resolve(dir) !== path.resolve(targetDir)) {\n await fs.promises.rmdir(dir);\n }\n }\n } catch (error) {\n // Ignore errors when cleaning up directories\n }\n}\n\n/**\n * Calculate SHA-256 hash of a file's contents\n */\nasync function getFileHash(filePath: string): Promise<string> {\n try {\n const content = await fs.promises.readFile(filePath);\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n } catch (error) {\n // Return empty hash for non-existent files\n return \"\";\n }\n}\n\n/**\n * Check if two files are different by comparing their hashes\n */\nasync function areFilesDifferent(\n sourceFile: string,\n targetFile: string,\n): Promise<boolean> {\n try {\n const [sourceHash, targetHash] = await Promise.all([\n getFileHash(sourceFile),\n getFileHash(targetFile),\n ]);\n return sourceHash !== targetHash || sourceHash === \"\"; // Different if hashes differ or source doesn't exist\n } catch (error) {\n // If we can't compare, assume they're different to be safe\n return true;\n }\n}\n\n/**\n * Recursively get all files in a directory\n */\nasync function getAllFiles(\n dir: string,\n baseDir: string = dir,\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n files.push(relativePath);\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"syncDirectories.js","names":["crypto","fs","path","syncDirectories","sourceDir","targetDir","logger","debug","promises","mkdir","recursive","sourceFiles","targetFiles","Promise","all","getAllFiles","updatedCount","addedCount","removedCount","unchangedCount","errors","relativeFile","sourceFile","join","targetFile","targetExists","includes","isDifferent","areFilesDifferent","dirname","copyFile","error","errorMsg","Error","message","String","push","unlink","removeEmptyDirectories","warn","length","dir","entries","readdir","withFileTypes","entry","isDirectory","subdir","name","remainingEntries","resolve","rmdir","getFileHash","filePath","content","readFile","createHash","update","digest","sourceHash","targetHash","baseDir","files","fullPath","relativePath","relative","subFiles","isFile"],"sources":["syncDirectories.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Logger } from \"./Logger.js\";\n\n/**\n * Synchronize directories by copying only changed files and removing obsolete ones\n */\nexport async function syncDirectories(\n sourceDir: string,\n targetDir: string,\n logger: Logger,\n): Promise<void> {\n logger.debug(`Synchronizing ${sourceDir} to ${targetDir}`);\n\n // Ensure target directory exists\n await fs.promises.mkdir(targetDir, { recursive: true });\n\n // Get all files in both directories\n const [sourceFiles, targetFiles] = await Promise.all([\n getAllFiles(sourceDir),\n getAllFiles(targetDir),\n ]);\n\n let updatedCount = 0;\n let addedCount = 0;\n let removedCount = 0;\n let unchangedCount = 0;\n const errors: string[] = [];\n\n // Process files from source directory\n for (const relativeFile of sourceFiles) {\n const sourceFile = path.join(sourceDir, relativeFile);\n const targetFile = path.join(targetDir, relativeFile);\n\n try {\n const targetExists = targetFiles.includes(relativeFile);\n const isDifferent = await areFilesDifferent(sourceFile, targetFile);\n\n if (!targetExists) {\n // New file - need to create directory structure\n await fs.promises.mkdir(path.dirname(targetFile), { recursive: true });\n await fs.promises.copyFile(sourceFile, targetFile);\n addedCount++;\n logger.debug(`Added: ${relativeFile}`);\n } else if (isDifferent) {\n // Changed file - update it\n await fs.promises.copyFile(sourceFile, targetFile);\n updatedCount++;\n logger.debug(`Updated: ${targetFile}`);\n } else {\n // File is unchanged\n unchangedCount++;\n }\n } catch (error) {\n const errorMsg = `Failed to sync ${relativeFile}: ${\n error instanceof Error ? error.message : String(error)\n }`;\n errors.push(errorMsg);\n logger.error(errorMsg);\n }\n }\n\n // Remove files that exist in target but not in source\n for (const relativeFile of targetFiles) {\n if (!sourceFiles.includes(relativeFile)) {\n const targetFile = path.join(targetDir, relativeFile);\n try {\n await fs.promises.unlink(targetFile);\n removedCount++;\n logger.debug(`Removed: ${relativeFile}`);\n } catch (error) {\n const errorMsg = `Failed to remove ${relativeFile}: ${\n error instanceof Error ? error.message : String(error)\n }`;\n errors.push(errorMsg);\n logger.error(errorMsg);\n }\n }\n }\n\n // Clean up empty directories in target\n try {\n await removeEmptyDirectories(targetDir);\n } catch (error) {\n logger.warn(\n `Failed to clean up empty directories: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n // Log summary\n logger.debug(\n `Sync complete: ${addedCount} added, ${updatedCount} updated, ${removedCount} removed, ${unchangedCount} unchanged`,\n );\n\n if (errors.length > 0) {\n logger.warn(`Encountered ${errors.length} errors during sync`);\n }\n}\n\n/**\n * Remove empty directories recursively\n */\nasync function removeEmptyDirectories(dir: string): Promise<void> {\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n // First, recursively clean subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subdir = path.join(dir, entry.name);\n await removeEmptyDirectories(subdir);\n }\n }\n\n // Then check if this directory is now empty\n const remainingEntries = await fs.promises.readdir(dir);\n if (remainingEntries.length === 0) {\n // Don't remove the root target directory itself\n const targetDir = \".osdk/src\";\n if (path.resolve(dir) !== path.resolve(targetDir)) {\n await fs.promises.rmdir(dir);\n }\n }\n } catch (error) {\n // Ignore errors when cleaning up directories\n }\n}\n\n/**\n * Calculate SHA-256 hash of a file's contents\n */\nasync function getFileHash(filePath: string): Promise<string> {\n try {\n const content = await fs.promises.readFile(filePath);\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n } catch (error) {\n // Return empty hash for non-existent files\n return \"\";\n }\n}\n\n/**\n * Check if two files are different by comparing their hashes\n */\nasync function areFilesDifferent(\n sourceFile: string,\n targetFile: string,\n): Promise<boolean> {\n try {\n const [sourceHash, targetHash] = await Promise.all([\n getFileHash(sourceFile),\n getFileHash(targetFile),\n ]);\n return sourceHash !== targetHash || sourceHash === \"\"; // Different if hashes differ or source doesn't exist\n } catch (error) {\n // If we can't compare, assume they're different to be safe\n return true;\n }\n}\n\n/**\n * Recursively get all files in a directory\n */\nasync function getAllFiles(\n dir: string,\n baseDir: string = dir,\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n files.push(relativePath);\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n"],"mappings":"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","ignoreList":[]}