{"_id":"@infisical/pg-view-generator","_rev":"4-c82817d6909cb65abae0dd99075d892d","name":"@infisical/pg-view-generator","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@infisical/pg-view-generator","version":"1.0.0","keywords":["postgresql","views","sql","schema","typescript","codegen"],"license":"MIT","_id":"@infisical/pg-view-generator@1.0.0","maintainers":[{"name":"vmatsiiako","email":"vlad@infisical.com"},{"name":"maidul","email":"maidul@infisical.com"},{"name":"danielhougaard","email":"dani250g@hotmail.com"},{"name":"akhilmhdh","email":"akhilmhdh@gmail.com"},{"name":"carlosmonastyrski","email":"carlos@infisical.com"}],"dist":{"shasum":"afdc4a940669c5de93629849e9a572990feb0a51","tarball":"https://registry.npmjs.org/@infisical/pg-view-generator/-/pg-view-generator-1.0.0.tgz","fileCount":22,"integrity":"sha512-PlA5vujGtwx0KFhNqSUB8b9t9bn9ggpWdM2/qkFL85eDx86Mfmr6P76bBdfEHpjbddVO3+n1Ad5QDp/YB+1Nyg==","signatures":[{"sig":"MEUCIEyuLVOqfYXsL+50l16Pj4DeUJf+Jx8jDQZ9srl6wBlHAiEAsBiTj+4NzHydUMoksAGSx33xSkmS2yFYgt+vioepAmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17121},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1c5dcf099780f155c6c335954819f313afd4009b","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"maidul","email":"maidul@infisical.com"},"_npmVersion":"10.8.2","description":"TypeScript SDK to generate PostgreSQL schema + view SQL from YAML definitions","directories":{},"_nodeVersion":"20.18.1","dependencies":{"js-yaml":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","vitest":"^1.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","testcontainers":"^10.0.0","@testcontainers/postgresql":"^11.11.0"},"_npmOperationalInternal":{"tmp":"tmp/pg-view-generator_1.0.0_1769149895713_0.48336746547937315","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@infisical/pg-view-generator","version":"1.1.0","keywords":["postgresql","views","sql","schema","typescript","codegen"],"license":"MIT","_id":"@infisical/pg-view-generator@1.1.0","maintainers":[{"name":"vmatsiiako","email":"vlad@infisical.com"},{"name":"maidul","email":"maidul@infisical.com"},{"name":"danielhougaard","email":"dani250g@hotmail.com"},{"name":"akhilmhdh","email":"akhilmhdh@gmail.com"},{"name":"carlosmonastyrski","email":"carlos@infisical.com"}],"dist":{"shasum":"342b46d66092ebf2f9a27debaa5dc347ff26bc53","tarball":"https://registry.npmjs.org/@infisical/pg-view-generator/-/pg-view-generator-1.1.0.tgz","fileCount":22,"integrity":"sha512-HHcCavCmZrWokGU6BxiXPOqLkUnPUpKP9xUyUz+Khtv3SNsPj5jlqgc5vki0pAU4sj3JbMhecF0K7e83Hp9S4g==","signatures":[{"sig":"MEMCIFk3mVbip+YAP7WpYsSWBWelc3H31G78JV13rjpScat4Ah9ZmUmTAeyDDSGssdqI1KZXdOddFLLEgneJq/Ui1aVe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21247},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8fae04c9c348dab7b90cf4bf3869e378c6957b88","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"maidul","email":"maidul@infisical.com"},"_npmVersion":"10.8.2","description":"TypeScript SDK to generate PostgreSQL schema + view SQL from YAML definitions","directories":{},"_nodeVersion":"20.18.1","dependencies":{"js-yaml":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","vitest":"^1.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","testcontainers":"^10.0.0","@testcontainers/postgresql":"^11.11.0"},"_npmOperationalInternal":{"tmp":"tmp/pg-view-generator_1.1.0_1769487307005_0.5302122880262383","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-23T06:31:35.590Z","modified":"2026-04-23T20:24:07.577Z","1.0.0":"2026-01-23T06:31:35.854Z","1.1.0":"2026-01-27T04:15:07.159Z"},"license":"MIT","keywords":["postgresql","views","sql","schema","typescript","codegen"],"description":"TypeScript SDK to generate PostgreSQL schema + view SQL from YAML definitions","maintainers":[{"email":"dani250g@hotmail.com","name":"danielhougaard"}],"readme":"# pg-view-generator\n\nTypeScript SDK to generate PostgreSQL schema and view SQL from YAML definitions.\n\n## Installation\n\n```bash\nnpm install pg-view-generator\n```\n\n## Usage\n\n```typescript\nimport { loadConfig, generateSQL } from 'pg-view-generator';\n\n// Load table definitions from YAML\nconst config = await loadConfig('./access.yaml');\n\n// Generate SQL\nconst sql = generateSQL(config, { targetSchema: 'hex-analytics' });\n\nconsole.log(sql);\n```\n\n## YAML Format\n\nThe YAML file contains only table definitions:\n\n```yaml\ntables:\n  - name: customers\n    source: public.customers\n    columns:\n      - id\n      - name\n      - city\n\n  - name: orders\n    source: public.orders\n    columns:\n      - id\n      - customer_id\n      - total\n      - created_at\n```\n\n## Generated SQL\n\n```sql\n-- Create schema\nCREATE SCHEMA IF NOT EXISTS \"hex-analytics\";\n\n-- Create views\nCREATE VIEW \"hex-analytics\".customers AS\nSELECT id, name, city\nFROM public.customers;\n\nCREATE VIEW \"hex-analytics\".orders AS\nSELECT id, customer_id, total, created_at\nFROM public.orders;\n```\n\n## Workflow\n\nThe SDK generates schema and view creation SQL. Role and grant management is handled separately:\n\n```sql\n-- 1. Before migrations: drop the schema\nDROP SCHEMA IF EXISTS \"hex-analytics\" CASCADE;\n\n-- 2. Run your migrations...\n\n-- 3. Run SDK-generated SQL (creates schema + views)\n\n-- 4. Grant access to users\nCREATE ROLE my_service_user LOGIN PASSWORD 'secret';\nGRANT USAGE ON SCHEMA \"hex-analytics\" TO my_service_user;\nGRANT SELECT ON ALL TABLES IN SCHEMA \"hex-analytics\" TO my_service_user;\n```\n\n## API\n\n### `loadConfig(path: string): Promise<Config>`\n\nLoad and validate a configuration from a YAML file.\n\n```typescript\nconst config = await loadConfig('./access.yaml');\n```\n\n### `loadConfigFromString(content: string): Config`\n\nLoad and validate a configuration from a YAML string.\n\n```typescript\nconst config = loadConfigFromString(`\ntables:\n  - name: users\n    source: public.users\n    columns: [id, email]\n`);\n```\n\n### `generateSQL(config: Config, options: GenerateOptions): string`\n\nGenerate the SQL script from the configuration.\n\n```typescript\nconst sql = generateSQL(config, { targetSchema: 'api' });\n```\n\n### `quoteIdentifier(name: string): string`\n\nQuote an identifier if it contains uppercase letters, special characters, or starts with a digit.\n\n```typescript\nquoteIdentifier('users');        // 'users'\nquoteIdentifier('Orders');       // '\"Orders\"'\nquoteIdentifier('my-table');     // '\"my-table\"'\n```\n\n### `quoteQualifiedName(qualifiedName: string): string`\n\nQuote a qualified name (e.g., \"schema.table\") by quoting each part separately.\n\n```typescript\nquoteQualifiedName('public.users');   // 'public.users'\nquoteQualifiedName('public.Orders');  // 'public.\"Orders\"'\n```\n\n## Types\n\n```typescript\ninterface TableConfig {\n  name: string;      // View name in target schema\n  source: string;    // Fully qualified source table (e.g., \"public.customers\")\n  columns: string[]; // Columns to expose in the view\n}\n\ninterface Config {\n  tables: TableConfig[];\n}\n\ninterface GenerateOptions {\n  targetSchema: string;\n}\n```\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Run tests (requires Docker for testcontainers)\nnpm test\n\n# Run tests in watch mode\nnpm run test:watch\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}