@innovixx/prisma-typed-json-generator 0.0.2 → 0.0.3

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.
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ export function extractCommentedTypes(schemaContent) {
50
50
  return typeObjects;
51
51
  }
52
52
  export async function writeTypesFile(typeObjects, clientDir) {
53
- let typeFileContent = '// This file is auto-generated by prisma-typed-json-generator\n\n';
53
+ let typeFileContent = '// This file is auto-generated by @innovixx/prisma-typed-json-generator\n\n';
54
54
  for (const [typeName, fields] of Object.entries(typeObjects)) {
55
55
  typeFileContent += `export type ${typeName} = {\n`;
56
56
  for (const [field, type] of Object.entries(fields)) {
@@ -100,7 +100,7 @@ generatorHandler({
100
100
  const jsonTypeAnnotations = extractJsonTypeAnnotations(schemaContent);
101
101
  for (const [modelField, typeName] of Object.entries(jsonTypeAnnotations)) {
102
102
  const [model, field] = modelField.split('.');
103
- const payloadBlockRegex = new RegExp(`export type \\$${model}Payload<[^=]+=[^>]+> = {([\\s\\S]*?)}\\n`, 'g');
103
+ const payloadBlockRegex = new RegExp(`export type \\$${model}Payload<[^=]+=[^>]+> = \\{([\\s\\S]*?)\\n\\}`, 'g');
104
104
  indexDtsContent = indexDtsContent.replace(payloadBlockRegex, (block) => {
105
105
  const lines = block.split('\n');
106
106
  let inScalars = false;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["function extractJsonTypeAnnotations(schemaContent: string): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tconst modelRegex = /model\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/g;\n\tlet modelMatch;\n\twhile ((modelMatch = modelRegex.exec(schemaContent)) !== null) {\n\t\tconst modelName = modelMatch[1];\n\t\tconst body = modelMatch[2];\n\t\tfor (const line of body.split('\\n')) {\n\t\t\tconst fieldMatch = /^\\s*([A-Za-z0-9_]+)\\s+Json.*@type\\(([^)]+)\\)/.exec(line);\n\t\t\tif (fieldMatch) {\n\t\t\t\tconst fieldName = fieldMatch[1];\n\t\t\t\tconst typeName = fieldMatch[2];\n\t\t\t\tresult[`${modelName}.${fieldName}`] = typeName;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\nimport generatorHelper, { GeneratorOptions } from '@prisma/generator-helper';\nimport internals from '@prisma/internals'\nimport path from 'path'\nimport pkg from '../package.json' with { type: \"json\" }\nimport fs from 'fs'\n\n\nexport function extractCommentedTypes(schemaContent: string): Record<string, Record<string, string>> {\n\tconst commentedTypeBlocks: string[] = [];\n\tconst typeBlockRegex = /\\/\\/\\s*type\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/g;\n\tlet match;\n\twhile ((match = typeBlockRegex.exec(schemaContent)) !== null) {\n\t\tcommentedTypeBlocks.push(match[0]);\n\t}\n\tconst typeObjects: Record<string, Record<string, string>> = {};\n\tfor (const block of commentedTypeBlocks) {\n\t\tconst headerMatch = /type\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/.exec(block);\n\t\tif (!headerMatch) continue;\n\t\tconst typeName = headerMatch[1];\n\t\tconst body = headerMatch[2];\n\t\tconst fields: Record<string, string> = {};\n\t\tfor (const line of body.split('\\n')) {\n\t\t\tconst cleaned = line.replace(/^\\s*\\/\\//, '').trim();\n\t\t\tif (!cleaned) continue;\n\t\t\tconst fieldMatch = /^([A-Za-z0-9_]+)\\s+([A-Za-z0-9_\\[\\]?]+)$/.exec(cleaned);\n\t\t\tif (fieldMatch) {\n\t\t\t\tfields[fieldMatch[1]] = fieldMatch[2];\n\t\t\t}\n\t\t}\n\t\ttypeObjects[typeName] = fields;\n\t}\n\treturn typeObjects;\n}\n\nexport async function writeTypesFile(\n\ttypeObjects: Record<string, Record<string, string>>,\n\tclientDir: string\n) {\n\tlet typeFileContent = '// This file is auto-generated by prisma-typed-json-generator\\n\\n';\n\tfor (const [typeName, fields] of Object.entries(typeObjects)) {\n\t\ttypeFileContent += `export type ${typeName} = {\\n`;\n\t\tfor (const [field, type] of Object.entries(fields)) {\n\t\t\tlet tsType = type\n\t\t\t\t.replace(/^string$/i, 'string')\n\t\t\t\t.replace(/^int$/i, 'number')\n\t\t\t\t.replace(/^float$/i, 'number')\n\t\t\t\t.replace(/^boolean$/i, 'boolean')\n\t\t\t\t.replace(/^json$/i, 'any')\n\t\t\t\t.replace(/\\?$/, ' | null')\n\t\t\t\t.replace(/\\[\\]$/, '[]');\n\t\t\ttypeFileContent += ` ${field}: ${tsType};\\n`;\n\t\t}\n\t\ttypeFileContent += '}\\n\\n';\n\t}\n\tconst outputPath = path.join(clientDir, 'prisma-json.types.ts');\n\tawait fs.promises.mkdir(clientDir, { recursive: true });\n\tawait fs.promises.writeFile(outputPath, typeFileContent, 'utf-8');\n\treturn outputPath;\n}\n\nconst { generatorHandler } = generatorHelper;\nconst { logger } = internals;\n\ngeneratorHandler({\n\tonManifest() {\n\t\treturn {\n\t\t\tversion: pkg.version,\n\t\t\tdefaultOutput: '../generated',\n\t\t\tprettyName: \"prisma-typed-json-generator\",\n\t\t}\n\t},\n\tonGenerate: async (options: GeneratorOptions) => {\n\t\tlogger.info(`prisma-typed-json-generator:Generating...`)\n\n\t\tconst schemaFileLocation = options.generator.sourceFilePath\n\n\t\tconst clientGenerator = options.otherGenerators.find((g) => g.name === 'client')\n\t\tif (!clientGenerator) throw new Error('Prisma Client generator not found. Please ensure that generator Client is specified in your schema.');\n\n\t\tconst clientOutput = clientGenerator.output?.value\n\n\t\tconst schemaContent = await fs.promises.readFile(schemaFileLocation, 'utf-8');\n\t\tconst typeObjects = extractCommentedTypes(schemaContent);\n\n\t\tif (clientOutput) {\n\t\t\tawait writeTypesFile(typeObjects, clientOutput);\n\t\t}\n\n\t\tif (clientOutput) {\n\t\t\tconst indexDtsPath = path.join(clientOutput, 'index.d.ts');\n\t\t\tlet indexDtsContent = await fs.promises.readFile(indexDtsPath, 'utf-8');\n\t\t\tlet updated = false;\n\n\t\t\tconst jsonTypeAnnotations = extractJsonTypeAnnotations(schemaContent);\n\t\t\tfor (const [modelField, typeName] of Object.entries(jsonTypeAnnotations)) {\n\t\t\t\tconst [model, field] = modelField.split('.');\n\t\t\t\tconst payloadBlockRegex = new RegExp(`export type \\\\$${model}Payload<[^=]+=[^>]+> = {([\\\\s\\\\S]*?)}\\\\n`, 'g');\n\t\t\t\tindexDtsContent = indexDtsContent.replace(payloadBlockRegex, (block) => {\n\t\t\t\t\tconst lines = block.split('\\n');\n\t\t\t\t\tlet inScalars = false;\n\t\t\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\t\t\tif (lines[i].includes('scalars: $Extensions.GetPayloadResult<{')) inScalars = true;\n\t\t\t\t\t\tif (inScalars && lines[i].includes(`${field}: Prisma.JsonValue`)) {\n\t\t\t\t\t\t\tlines[i] = lines[i].replace('Prisma.JsonValue', `PrismaJsonTypes.${typeName}`);\n\t\t\t\t\t\t\tupdated = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inScalars && lines[i].includes('}, ExtArgs[\"result\"]')) inScalars = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn lines.join('\\n');\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (updated) {\n\t\t\t\tconst importLine = `import * as PrismaJsonTypes from './prisma-json.types';`;\n\t\t\t\tif (!indexDtsContent.includes(importLine)) {\n\t\t\t\t\tindexDtsContent = indexDtsContent.replace(/(import .*?;\\n)/, `$1${importLine}\\n`);\n\t\t\t\t}\n\t\t\t\tawait fs.promises.writeFile(indexDtsPath, indexDtsContent, 'utf-8');\n\t\t\t}\n\t\t}\n\n\t\tlogger.info(`prisma-typed-json-generator:Generating...Done`)\n\t},\n})\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["function extractJsonTypeAnnotations(schemaContent: string): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tconst modelRegex = /model\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/g;\n\tlet modelMatch;\n\twhile ((modelMatch = modelRegex.exec(schemaContent)) !== null) {\n\t\tconst modelName = modelMatch[1];\n\t\tconst body = modelMatch[2];\n\t\tfor (const line of body.split('\\n')) {\n\t\t\tconst fieldMatch = /^\\s*([A-Za-z0-9_]+)\\s+Json.*@type\\(([^)]+)\\)/.exec(line);\n\t\t\tif (fieldMatch) {\n\t\t\t\tconst fieldName = fieldMatch[1];\n\t\t\t\tconst typeName = fieldMatch[2];\n\t\t\t\tresult[`${modelName}.${fieldName}`] = typeName;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\nimport generatorHelper, { GeneratorOptions } from '@prisma/generator-helper';\nimport internals from '@prisma/internals'\nimport path from 'path'\nimport pkg from '../package.json' with { type: \"json\" }\nimport fs from 'fs'\n\n\nexport function extractCommentedTypes(schemaContent: string): Record<string, Record<string, string>> {\n\tconst commentedTypeBlocks: string[] = [];\n\tconst typeBlockRegex = /\\/\\/\\s*type\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/g;\n\tlet match;\n\twhile ((match = typeBlockRegex.exec(schemaContent)) !== null) {\n\t\tcommentedTypeBlocks.push(match[0]);\n\t}\n\tconst typeObjects: Record<string, Record<string, string>> = {};\n\tfor (const block of commentedTypeBlocks) {\n\t\tconst headerMatch = /type\\s+([A-Za-z0-9_]+)\\s*\\{([\\s\\S]*?)\\}/.exec(block);\n\t\tif (!headerMatch) continue;\n\t\tconst typeName = headerMatch[1];\n\t\tconst body = headerMatch[2];\n\t\tconst fields: Record<string, string> = {};\n\t\tfor (const line of body.split('\\n')) {\n\t\t\tconst cleaned = line.replace(/^\\s*\\/\\//, '').trim();\n\t\t\tif (!cleaned) continue;\n\t\t\tconst fieldMatch = /^([A-Za-z0-9_]+)\\s+([A-Za-z0-9_\\[\\]?]+)$/.exec(cleaned);\n\t\t\tif (fieldMatch) {\n\t\t\t\tfields[fieldMatch[1]] = fieldMatch[2];\n\t\t\t}\n\t\t}\n\t\ttypeObjects[typeName] = fields;\n\t}\n\treturn typeObjects;\n}\n\nexport async function writeTypesFile(\n\ttypeObjects: Record<string, Record<string, string>>,\n\tclientDir: string\n) {\n\tlet typeFileContent = '// This file is auto-generated by @innovixx/prisma-typed-json-generator\\n\\n';\n\tfor (const [typeName, fields] of Object.entries(typeObjects)) {\n\t\ttypeFileContent += `export type ${typeName} = {\\n`;\n\t\tfor (const [field, type] of Object.entries(fields)) {\n\t\t\tlet tsType = type\n\t\t\t\t.replace(/^string$/i, 'string')\n\t\t\t\t.replace(/^int$/i, 'number')\n\t\t\t\t.replace(/^float$/i, 'number')\n\t\t\t\t.replace(/^boolean$/i, 'boolean')\n\t\t\t\t.replace(/^json$/i, 'any')\n\t\t\t\t.replace(/\\?$/, ' | null')\n\t\t\t\t.replace(/\\[\\]$/, '[]');\n\t\t\ttypeFileContent += ` ${field}: ${tsType};\\n`;\n\t\t}\n\t\ttypeFileContent += '}\\n\\n';\n\t}\n\tconst outputPath = path.join(clientDir, 'prisma-json.types.ts');\n\tawait fs.promises.mkdir(clientDir, { recursive: true });\n\tawait fs.promises.writeFile(outputPath, typeFileContent, 'utf-8');\n\treturn outputPath;\n}\n\nconst { generatorHandler } = generatorHelper;\nconst { logger } = internals;\n\ngeneratorHandler({\n\tonManifest() {\n\t\treturn {\n\t\t\tversion: pkg.version,\n\t\t\tdefaultOutput: '../generated',\n\t\t\tprettyName: \"prisma-typed-json-generator\",\n\t\t}\n\t},\n\tonGenerate: async (options: GeneratorOptions) => {\n\t\tlogger.info(`prisma-typed-json-generator:Generating...`)\n\n\t\tconst schemaFileLocation = options.generator.sourceFilePath\n\n\t\tconst clientGenerator = options.otherGenerators.find((g) => g.name === 'client')\n\t\tif (!clientGenerator) throw new Error('Prisma Client generator not found. Please ensure that generator Client is specified in your schema.');\n\n\t\tconst clientOutput = clientGenerator.output?.value\n\n\t\tconst schemaContent = await fs.promises.readFile(schemaFileLocation, 'utf-8');\n\t\tconst typeObjects = extractCommentedTypes(schemaContent);\n\n\t\tif (clientOutput) {\n\t\t\tawait writeTypesFile(typeObjects, clientOutput);\n\t\t}\n\n\t\tif (clientOutput) {\n\t\t\tconst indexDtsPath = path.join(clientOutput, 'index.d.ts');\n\t\t\tlet indexDtsContent = await fs.promises.readFile(indexDtsPath, 'utf-8');\n\t\t\tlet updated = false;\n\n\t\t\tconst jsonTypeAnnotations = extractJsonTypeAnnotations(schemaContent);\n\t\t\tfor (const [modelField, typeName] of Object.entries(jsonTypeAnnotations)) {\n\t\t\t\tconst [model, field] = modelField.split('.');\n\t\t\t\tconst payloadBlockRegex = new RegExp(`export type \\\\$${model}Payload<[^=]+=[^>]+> = \\\\{([\\\\s\\\\S]*?)\\\\n\\\\}`, 'g');\n\t\t\t\tindexDtsContent = indexDtsContent.replace(payloadBlockRegex, (block) => {\n\t\t\t\t\tconst lines = block.split('\\n');\n\t\t\t\t\tlet inScalars = false;\n\t\t\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\t\t\tif (lines[i].includes('scalars: $Extensions.GetPayloadResult<{')) inScalars = true;\n\t\t\t\t\t\tif (inScalars && lines[i].includes(`${field}: Prisma.JsonValue`)) {\n\t\t\t\t\t\t\tlines[i] = lines[i].replace('Prisma.JsonValue', `PrismaJsonTypes.${typeName}`);\n\t\t\t\t\t\t\tupdated = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inScalars && lines[i].includes('}, ExtArgs[\"result\"]')) inScalars = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn lines.join('\\n');\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (updated) {\n\t\t\t\tconst importLine = `import * as PrismaJsonTypes from './prisma-json.types';`;\n\t\t\t\tif (!indexDtsContent.includes(importLine)) {\n\t\t\t\t\tindexDtsContent = indexDtsContent.replace(/(import .*?;\\n)/, `$1${importLine}\\n`);\n\t\t\t\t}\n\t\t\t\tawait fs.promises.writeFile(indexDtsPath, indexDtsContent, 'utf-8');\n\t\t\t}\n\t\t}\n\n\t\tlogger.info(`prisma-typed-json-generator:Generating...Done`)\n\t},\n})\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@innovixx/prisma-typed-json-generator",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "author": "Innovixx <info@innovixx.co.uk>",