{"version":3,"sources":["../../../../src/postgres/predefinedMigrations/v2-v3/groupUpSQLStatements.ts"],"sourcesContent":["export type Groups =\n | 'addColumn'\n | 'addConstraint'\n | 'alterType'\n | 'createIndex'\n | 'createTable'\n | 'createType'\n | 'disableRowSecurity'\n | 'dropColumn'\n | 'dropConstraint'\n | 'dropIndex'\n | 'dropTable'\n | 'dropType'\n | 'notNull'\n | 'renameColumn'\n | 'setDefault'\n\n/**\n * Convert an \"ADD COLUMN\" statement to an \"ALTER COLUMN\" statement.\n * Works with or without a schema name.\n *\n * Examples:\n * 'ALTER TABLE \"pages_blocks_my_block\" ADD COLUMN \"person_id\" integer NOT NULL;'\n * => 'ALTER TABLE \"pages_blocks_my_block\" ALTER COLUMN \"person_id\" SET NOT NULL;'\n *\n * 'ALTER TABLE \"public\".\"pages_blocks_my_block\" ADD COLUMN \"person_id\" integer NOT NULL;'\n * => 'ALTER TABLE \"public\".\"pages_blocks_my_block\" ALTER COLUMN \"person_id\" SET NOT NULL;'\n */\nfunction convertAddColumnToAlterColumn(sql) {\n // Regular expression to match the ADD COLUMN statement with its constraints\n const regex = /ALTER TABLE ((?:\"[^\"]+\"\\.)?\"[^\"]+\") ADD COLUMN (\"[^\"]+\") [^;]*?NOT NULL;/i\n\n // Replace the matched part with \"ALTER COLUMN ... SET NOT NULL;\"\n return sql.replace(regex, 'ALTER TABLE $1 ALTER COLUMN $2 SET NOT NULL;')\n}\n\nexport const groupUpSQLStatements = (list: string[]): Record => {\n const groups = {\n /**\n * example: ALTER TABLE \"posts\" ADD COLUMN \"category_id\" integer\n */\n addColumn: 'ADD COLUMN',\n\n /**\n * example:\n * DO $$ BEGIN\n * ALTER TABLE \"pages_blocks_my_block\" ADD CONSTRAINT \"pages_blocks_my_block_person_id_users_id_fk\" FOREIGN KEY (\"person_id\") REFERENCES \"users\"(\"id\") ON DELETE cascade ON UPDATE no action;\n * EXCEPTION\n * WHEN duplicate_object THEN null;\n * END $$;\n */\n addConstraint: 'ADD CONSTRAINT',\n\n /**\n * example: CREATE TABLE IF NOT EXISTS \"payload_locked_documents\" (\n * \"id\" serial PRIMARY KEY NOT NULL,\n * \"global_slug\" varchar,\n * \"updated_at\" timestamp(3) with time zone DEFAULT now() NOT NULL,\n * \"created_at\" timestamp(3) with time zone DEFAULT now() NOT NULL\n * );\n */\n createTable: 'CREATE TABLE',\n\n /**\n * example: ALTER TABLE \"_posts_v_rels\" DROP COLUMN IF EXISTS \"posts_id\";\n */\n dropColumn: 'DROP COLUMN',\n\n /**\n * example: ALTER TABLE \"_posts_v_rels\" DROP CONSTRAINT \"_posts_v_rels_posts_fk\";\n */\n dropConstraint: 'DROP CONSTRAINT',\n\n /**\n * example: DROP TABLE \"pages_rels\";\n */\n dropTable: 'DROP TABLE',\n\n /**\n * example: ALTER TABLE \"pages_blocks_my_block\" ALTER COLUMN \"person_id\" SET NOT NULL;\n */\n notNull: 'NOT NULL',\n\n /**\n * example: CREATE TYPE \"public\".\"enum__pages_v_published_locale\" AS ENUM('en', 'es');\n */\n createType: 'CREATE TYPE',\n\n /**\n * example: ALTER TYPE \"public\".\"enum_pages_blocks_cta\" ADD VALUE 'copy';\n */\n alterType: 'ALTER TYPE',\n\n /**\n * example: ALTER TABLE \"categories_rels\" DISABLE ROW LEVEL SECURITY;\n */\n disableRowSecurity: 'DISABLE ROW LEVEL SECURITY;',\n\n /**\n * example: DROP INDEX IF EXISTS \"pages_title_idx\";\n */\n dropIndex: 'DROP INDEX IF EXISTS',\n\n /**\n * example: ALTER TABLE \"pages\" ALTER COLUMN \"_status\" SET DEFAULT 'draft';\n */\n setDefault: 'SET DEFAULT',\n\n /**\n * example: CREATE INDEX IF NOT EXISTS \"payload_locked_documents_global_slug_idx\" ON \"payload_locked_documents\" USING btree (\"global_slug\");\n */\n createIndex: 'INDEX IF NOT EXISTS',\n\n /**\n * example: DROP TYPE \"public\".\"enum__pages_v_published_locale\";\n */\n dropType: 'DROP TYPE',\n\n /**\n * columns were renamed from camelCase to snake_case\n * example: ALTER TABLE \"forms\" RENAME COLUMN \"confirmationType\" TO \"confirmation_type\";\n */\n renameColumn: 'RENAME COLUMN',\n }\n\n const result = Object.keys(groups).reduce((result, group: Groups) => {\n result[group] = []\n return result\n }, {}) as Record\n\n // push multi-line changes to a single grouping\n let isCreateTable = false\n\n for (const line of list) {\n if (isCreateTable) {\n result.createTable.push(line)\n if (line.includes(');')) {\n isCreateTable = false\n }\n continue\n }\n Object.entries(groups).some(([key, value]) => {\n if (line.endsWith('NOT NULL;')) {\n // split up the ADD COLUMN and ALTER COLUMN NOT NULL statements\n // example: ALTER TABLE \"pages_blocks_my_block\" ADD COLUMN \"person_id\" integer NOT NULL;\n // becomes two separate statements:\n // 1. ALTER TABLE \"pages_blocks_my_block\" ADD COLUMN \"person_id\" integer;\n // 2. ALTER TABLE \"pages_blocks_my_block\" ALTER COLUMN \"person_id\" SET NOT NULL;\n result.addColumn.push(line.replace(' NOT NULL;', ';'))\n result.notNull.push(convertAddColumnToAlterColumn(line))\n return true\n }\n if (line.includes(value)) {\n let statement = line\n if (key === 'dropConstraint') {\n statement = line.replace('\" DROP CONSTRAINT \"', '\" DROP CONSTRAINT IF EXISTS \"')\n }\n result[key].push(statement)\n return true\n }\n })\n }\n\n return result\n}\n"],"names":["convertAddColumnToAlterColumn","sql","regex","replace","groupUpSQLStatements","list","groups","addColumn","addConstraint","createTable","dropColumn","dropConstraint","dropTable","notNull","createType","alterType","disableRowSecurity","dropIndex","setDefault","createIndex","dropType","renameColumn","result","Object","keys","reduce","group","isCreateTable","line","push","includes","entries","some","key","value","endsWith","statement"],"mappings":"AAiBA;;;;;;;;;;CAUC,GACD,SAASA,8BAA8BC,GAAG;IACxC,4EAA4E;IAC5E,MAAMC,QAAQ;IAEd,iEAAiE;IACjE,OAAOD,IAAIE,OAAO,CAACD,OAAO;AAC5B;AAEA,OAAO,MAAME,uBAAuB,CAACC;IACnC,MAAMC,SAAS;QACb;;KAEC,GACDC,WAAW;QAEX;;;;;;;KAOC,GACDC,eAAe;QAEf;;;;;;;KAOC,GACDC,aAAa;QAEb;;KAEC,GACDC,YAAY;QAEZ;;KAEC,GACDC,gBAAgB;QAEhB;;KAEC,GACDC,WAAW;QAEX;;KAEC,GACDC,SAAS;QAET;;KAEC,GACDC,YAAY;QAEZ;;KAEC,GACDC,WAAW;QAEX;;KAEC,GACDC,oBAAoB;QAEpB;;KAEC,GACDC,WAAW;QAEX;;KAEC,GACDC,YAAY;QAEZ;;KAEC,GACDC,aAAa;QAEb;;KAEC,GACDC,UAAU;QAEV;;;KAGC,GACDC,cAAc;IAChB;IAEA,MAAMC,SAASC,OAAOC,IAAI,CAAClB,QAAQmB,MAAM,CAAC,CAACH,QAAQI;QACjDJ,MAAM,CAACI,MAAM,GAAG,EAAE;QAClB,OAAOJ;IACT,GAAG,CAAC;IAEJ,+CAA+C;IAC/C,IAAIK,gBAAgB;IAEpB,KAAK,MAAMC,QAAQvB,KAAM;QACvB,IAAIsB,eAAe;YACjBL,OAAOb,WAAW,CAACoB,IAAI,CAACD;YACxB,IAAIA,KAAKE,QAAQ,CAAC,OAAO;gBACvBH,gBAAgB;YAClB;YACA;QACF;QACAJ,OAAOQ,OAAO,CAACzB,QAAQ0B,IAAI,CAAC,CAAC,CAACC,KAAKC,MAAM;YACvC,IAAIN,KAAKO,QAAQ,CAAC,cAAc;gBAC9B,+DAA+D;gBAC/D,wFAAwF;gBACxF,mCAAmC;gBACnC,0EAA0E;gBAC1E,kFAAkF;gBAClFb,OAAOf,SAAS,CAACsB,IAAI,CAACD,KAAKzB,OAAO,CAAC,cAAc;gBACjDmB,OAAOT,OAAO,CAACgB,IAAI,CAAC7B,8BAA8B4B;gBAClD,OAAO;YACT;YACA,IAAIA,KAAKE,QAAQ,CAACI,QAAQ;gBACxB,IAAIE,YAAYR;gBAChB,IAAIK,QAAQ,kBAAkB;oBAC5BG,YAAYR,KAAKzB,OAAO,CAAC,uBAAuB;gBAClD;gBACAmB,MAAM,CAACW,IAAI,CAACJ,IAAI,CAACO;gBACjB,OAAO;YACT;QACF;IACF;IAEA,OAAOd;AACT,EAAC"}