Skip to content

feat: implement ADD COLUMN operation support #2107

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

MH4GF
Copy link
Member

@MH4GF MH4GF commented Jun 20, 2025

#2094 is merged, remove the WIP.

Issue

  • resolve: N/A (feature implementation as part of convert-add-column-ddl development)

Why is this change needed?

This change implements ADD COLUMN operation support for the database schema operation system. This extends the existing table creation functionality to also support adding individual columns to existing tables, which is essential for complete DDL generation capabilities.

What would you like reviewers to focus on?

  • Domain-based organization of operation schemas (table.ts, column.ts)
  • Implementation of ADD COLUMN DDL generation logic
  • Test coverage for column operations
  • Consistency with existing table operation patterns
  • Type safety and validation approach using valibot

Testing Verification

  • All existing tests continue to pass (230 tests passed)
  • New tests added for ADD COLUMN operations with various constraints
  • Verified DDL generation produces correct PostgreSQL ALTER TABLE statements
  • Linting and formatting checks pass successfully

What was done

🤖 Generated by PR Agent at a8dba58

• Implement ADD COLUMN operation support for DDL generation
• Refactor operation schemas into domain-based structure
• Add comprehensive tests for column operations
• Enhance path validation utilities

Detailed Changes

Relevant files
Tests
1 files
operationDeparser.test.ts
Add comprehensive tests for ADD COLUMN operations               
+53/-1   
Enhancement
6 files
operationDeparser.ts
Implement ADD COLUMN operation deparser logic                       
+42/-6   
utils.ts
Add generateAddColumnStatement utility function                   
+18/-0   
pathValidators.ts
Create reusable path validator utility                                     
+6/-0     
column.ts
Implement column operation schema and type guards               
+28/-0   
index.ts
Refactor to use domain-based operation schemas                     
+4/-25   
table.ts
Extract table operations into separate module                       
+26/-0   
Configuration changes
2 files
type.ts
Update import path for operation schema                                   
+1/-1     
index.ts
Update export path for operations schema                                 
+1/-1     

Additional Notes

This PR builds upon the domain-based refactoring from the previous commit and follows the same patterns established for table operations. The implementation uses v.safeParse for consistent validation and maintains the same error handling approach as existing operations.


Need help?
  • Type /help how to ... in the comments thread for any questions about Qodo Merge usage.
  • Check out the documentation for more information.
  • MH4GF and others added 3 commits June 20, 2025 15:42
    …alidators
    
    - Moved the isTablePath function to a new pathValidators.ts file for better organization.
    - Updated operationsSchema.ts to utilize the new isTablePath validator.
    - Enhanced the addTableOperation validation by using valibot for schema parsing.
    - Added a createPathValidator utility to facilitate the creation of path validation functions.
    
    This refactor improves code readability and maintainability by separating concerns and leveraging runtime type validation.
    - Delete operationsSchema.ts and split into domain-based files
    - Create schema/table.ts for table-related operations
    - Move path validators to separate reusable utilities
    - Update imports to use new schema structure
    - Maintain existing functionality while improving organization
    
    🤖 Generated with [Claude Code](https://claude.ai/code)
    
    Co-Authored-By: Claude <[email protected]>
    - Add column.ts for column-related operations
    - Implement AddColumnOperation schema and type guard
    - Add generateAddColumnStatement utility function
    - Support ADD COLUMN DDL generation in operationDeparser
    - Add comprehensive tests for column operations
    - Use v.safeParse for consistent validation approach
    
    🤖 Generated with [Claude Code](https://claude.ai/code)
    
    Co-Authored-By: Claude <[email protected]>
    @MH4GF MH4GF requested a review from a team as a code owner June 20, 2025 07:12
    @MH4GF MH4GF requested review from hoshinotsuyoshi, FunamaYukina, junkisai and NoritakaIkeda and removed request for a team June 20, 2025 07:12
    Copy link

    changeset-bot bot commented Jun 20, 2025

    ⚠️ No Changeset found

    Latest commit: a8dba58

    Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

    This PR includes no changesets

    When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

    Click here to learn what changesets are, and how to add one.

    Click here if you're a maintainer who wants to add a changeset to this PR

    Copy link

    vercel bot commented Jun 20, 2025

    The latest updates on your projects. Learn more about Vercel for Git ↗︎

    Name Status Preview Comments Updated (UTC)
    liam-app ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 20, 2025 7:18am
    liam-erd-sample ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 20, 2025 7:18am
    liam-storybook ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 20, 2025 7:18am
    1 Skipped Deployment
    Name Status Preview Comments Updated (UTC)
    liam-docs ⬜️ Ignored (Inspect) Jun 20, 2025 7:18am

    @MH4GF MH4GF marked this pull request as draft June 20, 2025 07:12
    @MH4GF MH4GF changed the title feat: implement ADD COLUMN operation support DO NOT MERGE: feat: implement ADD COLUMN operation support Jun 20, 2025
    Copy link
    Contributor

    qodo-merge-for-open-source bot commented Jun 20, 2025

    PR Reviewer Guide 🔍

    (Review updated until commit a8dba58)

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Type Safety

    The isAddColumnOperation function uses v.safeParse for validation but the type guard implementation may not be consistent with the existing isAddTableOperation pattern. Consider ensuring consistent validation approach across all operation types.

    export const isAddColumnOperation = (
      operation: Operation,
    ): operation is AddColumnOperation => {
      return v.safeParse(addColumnOperationSchema, operation).success
    }
    Error Handling

    The extractTableAndColumnNameFromPath function throws an error for invalid paths, but the error handling in the main deparser function may not properly catch and format these errors into the expected error structure.

    function generateAddColumnFromOperation(operation: AddColumnOperation): string {
      const pathInfo = extractTableAndColumnNameFromPath(operation.path)
      if (!pathInfo) {
        throw new Error(`Invalid column path: ${operation.path}`)
      }
    
      return generateAddColumnStatement(pathInfo.tableName, operation.value)
    }
    Input Validation

    The createPathValidator function performs basic type checking but doesn't validate if the input string is non-empty or properly formatted before regex testing, which could lead to unexpected behavior with edge cases.

    export const createPathValidator = (pattern: RegExp) => {
      return (input: unknown): boolean => {
        if (typeof input !== 'string') return false
        return pattern.test(input)
      }
    }

    Copy link
    Contributor

    qodo-merge-for-open-source bot commented Jun 20, 2025

    PR Code Suggestions ✨

    Latest suggestions up to a8dba58
    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Impact
    Security
    Add table name validation

    The function doesn't validate or sanitize the tableName parameter, which could
    lead to SQL injection vulnerabilities. Add proper validation and escaping for
    the table name to ensure safe SQL generation.

    frontend/packages/db-structure/src/deparser/postgresql/utils.ts [58-71]

     export function generateAddColumnStatement(
       tableName: string,
       column: Column,
     ): string {
    +  const escapedTableName = tableName.replace(/[^a-zA-Z0-9_]/g, '')
       const columnDefinition = generateColumnDefinition(column)
    -  let ddl = `ALTER TABLE ${tableName} ADD COLUMN ${columnDefinition};`
    +  let ddl = `ALTER TABLE ${escapedTableName} ADD COLUMN ${columnDefinition};`
     
       // Add column comment if exists
       if (column.comment) {
    -    ddl += `\n\nCOMMENT ON COLUMN ${tableName}.${column.name} IS '${escapeString(column.comment)}';`
    +    ddl += `\n\nCOMMENT ON COLUMN ${escapedTableName}.${column.name} IS '${escapeString(column.comment)}';`
       }
     
       return ddl
     }
    • Apply / Chat
    Suggestion importance[1-10]: 9

    __

    Why: The suggestion correctly identifies a critical SQL injection vulnerability. The tableName parameter is directly interpolated into the SQL query without sanitization. While there is path validation elsewhere, defense-in-depth is crucial, and this function should not trust its inputs. This is a high-impact security suggestion.

    High
    • More

    Previous suggestions

    Suggestions up to commit a8dba58
    CategorySuggestion                                                                                                                                    Impact
    Security
    Add input parameter validation

    The function doesn't validate input parameters which could lead to SQL injection
    or malformed DDL statements. Add validation to ensure tableName and column.name
    are safe identifiers before using them in SQL statements.

    frontend/packages/db-structure/src/deparser/postgresql/utils.ts [58-71]

     export function generateAddColumnStatement(
       tableName: string,
       column: Column,
     ): string {
    +  if (!tableName || typeof tableName !== 'string') {
    +    throw new Error('Invalid table name')
    +  }
    +  if (!column.name || typeof column.name !== 'string') {
    +    throw new Error('Invalid column name')
    +  }
    +  
       const columnDefinition = generateColumnDefinition(column)
       let ddl = `ALTER TABLE ${tableName} ADD COLUMN ${columnDefinition};`
     
       // Add column comment if exists
       if (column.comment) {
         ddl += `\n\nCOMMENT ON COLUMN ${tableName}.${column.name} IS '${escapeString(column.comment)}';`
       }
     
       return ddl
     }
    Suggestion importance[1-10]: 8

    __

    Why: The suggestion correctly identifies a potential SQL injection vulnerability by directly embedding tableName and column.name into a SQL query. While there is upstream validation on the path, applying defense-in-depth by validating or escaping identifiers at the point of SQL generation is a critical security practice.

    Medium

    Copy link
    Contributor

    CI Feedback 🧐

    A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

    Action: frontend-ci

    Failed stage: Run pnpm test:turbo [❌]

    Failed test name: should generate unique ID with prefix

    Failure summary:

    The action failed because a test in the @liam-hq/app package failed. Specifically, the test should
    generate unique ID with prefix in the timelineItemHelpers test suite failed because it expected two
    generated IDs to be different, but they were identical (test-1750403787194). The test is located in
    components/Chat/services/tests/timelineItemHelpers.test.ts at line 18.

    Relevant error logs:
    1:  ##[group]Runner Image Provisioner
    2:  Hosted Compute Agent
    ...
    
    163:  �[36;1mpnpm install --frozen-lockfile --prefer-offline�[0m
    164:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
    165:  env:
    166:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
    167:  ##[endgroup]
    168:  Scope: all 18 workspace projects
    169:  Lockfile is up to date, resolution step is skipped
    170:  Progress: resolved 1, reused 0, downloaded 0, added 0
    171:  Packages: +2082
    172:  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    173:  Progress: resolved 2082, reused 899, downloaded 0, added 0
    174:  Progress: resolved 2082, reused 2062, downloaded 0, added 290
    175:  Progress: resolved 2082, reused 2062, downloaded 0, added 907
    176:  Progress: resolved 2082, reused 2062, downloaded 0, added 1557
    177:  Progress: resolved 2082, reused 2062, downloaded 0, added 2082, done
    178:  WARN  Failed to create bin at /home/runner/work/liam/liam/frontend/apps/erd-sample/node_modules/.bin/liam. ENOENT: no such file or directory, open '/home/runner/work/liam/liam/frontend/packages/cli/dist-cli/bin/cli.js'
    179:  devDependencies:
    ...
    
    190:  + vercel 41.7.8
    191:  ╭ Warning ─────────────────────────────────────────────────────────────────────╮
    192:  │                                                                              │
    193:  │   Ignored build scripts: @bundled-es-modules/glob, @depot/cli,               │
    194:  │   @prisma/engines, @sentry/cli, @tailwindcss/oxide, core-js-pure, esbuild,   │
    195:  │   protobufjs, sharp, style-dictionary.                                       │
    196:  │   Run "pnpm approve-builds" to pick which dependencies should be allowed     │
    197:  │   to run scripts.                                                            │
    198:  │                                                                              │
    199:  ╰──────────────────────────────────────────────────────────────────────────────╯
    200:  frontend/apps/docs postinstall$ fumadocs-mdx
    201:  frontend/apps/docs postinstall: [MDX] types generated
    202:  frontend/apps/docs postinstall: Done
    203:  frontend/internal-packages/jobs postinstall$ cp ../../packages/db-structure/node_modules/@ruby/prism/src/prism.wasm prism.wasm
    204:  frontend/internal-packages/jobs postinstall: Done
    205:  WARN  Failed to create bin at /home/runner/work/liam/liam/frontend/apps/erd-sample/node_modules/.bin/liam. ENOENT: no such file or directory, open '/home/runner/work/liam/liam/frontend/apps/erd-sample/node_modules/@liam-hq/cli/dist-cli/bin/cli.js'
    206:  frontend/apps/app postinstall$ cp ../../packages/db-structure/node_modules/@ruby/prism/src/prism.wasm prism.wasm
    ...
    
    620:  Applying migration 20250519182900_add_organization_id_and_rls_to_documents.sql...
    621:  Applying migration 20250520100200_add_schemas_tables.sql...
    622:  Applying migration 20250521190001_add_unique_constraint_to_building_schemas.sql...
    623:  Applying migration 20250521190230_add_update_building_schema.sql...
    624:  Applying migration 20250523152300_move_columns_to_building_schemas.sql...
    625:  Applying migration 20250529210000_add_indexes_to_messages.sql...
    626:  Applying migration 20250603071000_allow_nullable_project_id_in_design_sessions.sql...
    627:  Applying migration 20250603220001_supabase_realtime_to_messages.sql...
    628:  Applying migration 20250605051800_add_building_schemas_to_realtime.sql...
    629:  Applying migration 20250606081813_modify_github_repository_unique_constraint.sql...
    630:  Applying migration 20250609120000_add_project_rpc_function.sql...
    631:  Applying migration 20250610055241_add_message_role_enum.sql...
    632:  Applying migration 20250613162759_extend_messages_for_schema_versions.sql...
    633:  Applying migration 20250613164943_revert_to_message_content_param.sql...
    634:  Applying migration 20250616032711_drop_old_update_building_schema.sql...
    635:  Applying migration 20250617052941_add_error_role_to_message_enum.sql...
    636:  Applying migration 20250617150551_rename_messages_to_timeline_items.sql...
    ...
    
    779:  8a05c7f45a2f: Download complete
    780:  e474be2ddfca: Verifying Checksum
    781:  e474be2ddfca: Download complete
    782:  126586508cfc: Verifying Checksum
    783:  126586508cfc: Download complete
    784:  146f98566145: Verifying Checksum
    785:  146f98566145: Download complete
    786:  6e909acdb790: Pull complete
    787:  8a05c7f45a2f: Pull complete
    788:  3956f985b675: Pull complete
    789:  e474be2ddfca: Pull complete
    790:  146f98566145: Pull complete
    791:  126586508cfc: Pull complete
    792:  Digest: sha256:358930e39ff36e0130c3afe3808a5c8f8322f7ff9c42624406dacce859ed0e24
    793:  Status: Downloaded newer image for public.ecr.aws/supabase/edge-runtime:v1.67.4
    794:  failed to pull docker image: Error response from daemon: toomanyrequests: Rate exceeded
    795:  Retrying after 4s: public.ecr.aws/supabase/postgres-meta:v0.89.3
    ...
    
    981:  ##[endgroup]
    982:  ##[group]@liam-hq/jobs:test
    983:  cache miss, executing 4b83babc8adfdb12
    984:  > @liam-hq/[email protected] test /home/runner/work/liam/liam/frontend/internal-packages/jobs
    985:  > vitest --watch=false --passWithNoTests
    986:  �[1m�[46m RUN �[49m�[22m �[36mv3.1.4 �[39m�[90m/home/runner/work/liam/liam/frontend/internal-packages/jobs�[39m
    987:  No test files found, exiting with code 0
    988:  �[2minclude: �[22m�[33m**/*.{test,spec}.?(c|m)[jt]s?(x)�[39m
    989:  �[2mexclude:  �[22m�[33m**/node_modules/**�[2m, �[22m**/dist/**�[2m, �[22m**/cypress/**�[2m, �[22m**/.{idea,git,cache,output,temp}/**�[2m, �[22m**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*�[39m
    990:  ##[endgroup]
    991:  �[;31m@liam-hq/app:test�[;0m
    992:  cache miss, executing a72a11669d5ae376
    993:  > @liam-hq/[email protected] test /home/runner/work/liam/liam/frontend/apps/app
    994:  > vitest --watch=false
    995:  �[1m�[46m RUN �[49m�[22m �[36mv3.1.4 �[39m�[90m/home/runner/work/liam/liam/frontend/apps/app�[39m
    996:  �[31m❯�[39m components/Chat/services/__tests__/timelineItemHelpers.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[32m 69�[2mms�[22m�[39m
    997:  �[31m   �[31m�[31m timelineItemHelpers�[2m > �[22mgenerateTimelineItemId�[2m > �[22mshould generate unique ID with prefix�[39m�[32m 38�[2mms�[22m�[39m
    ...
    
    1003:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould not detect content duplicate for user messages outside timestamp tolerance�[32m 4�[2mms�[22m�[39m
    1004:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould detect content duplicate for user messages when either has no timestamp�[32m 7�[2mms�[22m�[39m
    1005:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould not detect content duplicate for different user message content�[32m 0�[2mms�[22m�[39m
    1006:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould not detect content duplicate for non-user messages�[32m 0�[2mms�[22m�[39m
    1007:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould handle empty timeline items array�[32m 0�[2mms�[22m�[39m
    1008:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould handle schema_version role�[32m 8�[2mms�[22m�[39m
    1009:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould handle exact timestamp boundary (5 seconds)�[32m 0�[2mms�[22m�[39m
    1010:  �[32m✓�[39m timelineItemHelpers�[2m > �[22misDuplicateTimelineItem�[2m > �[22mshould handle timestamp just within tolerance (4.999 seconds)�[32m 0�[2mms�[22m�[39m
    1011:  �[90mstderr�[2m | app/api/webhook/github/utils/__tests__/checkSchemaChanges.test.ts�[2m > �[22m�[2mcheckSchemaChanges�[2m > �[22m�[2mshould return false if project has no schema file paths
    1012:  �[22m�[39mNo schema path found for project 100: {"code":"22P02","details":null,"hint":null,"message":"invalid input syntax for type uuid: \"100\""}
    1013:  �[90mstderr�[2m | app/api/webhook/github/utils/__tests__/checkSchemaChanges.test.ts�[2m > �[22m�[2mcheckSchemaChanges�[2m > �[22m�[2mshould return false if no files match the schema paths
    1014:  �[22m�[39mNo schema path found for project 100: {"code":"22P02","details":null,"hint":null,"message":"invalid input syntax for type uuid: \"100\""}
    1015:  �[32m✓�[39m app/api/webhook/github/utils/__tests__/checkSchemaChanges.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[32m 260�[2mms�[22m�[39m
    1016:  �[32m✓�[39m features/projects/services/getProjectRepository.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[32m 198�[2mms�[22m�[39m
    1017:  �[2m�[90m↓�[39m�[22m components/ProjectsPage/services/getProjects.test.ts �[2m(�[22m�[2m1 test�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m
    1018:  �[31m⎯⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Tests 1 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m
    1019:  �[41m�[1m FAIL �[22m�[49m components/Chat/services/__tests__/timelineItemHelpers.test.ts�[2m > �[22mtimelineItemHelpers�[2m > �[22mgenerateTimelineItemId�[2m > �[22mshould generate unique ID with prefix
    1020:  �[31m�[1mAssertionError�[22m: expected 'test-1750403787194' not to be 'test-1750403787194' // Object.is equality�[39m
    1021:  �[36m �[2m❯�[22m components/Chat/services/__tests__/timelineItemHelpers.test.ts:�[2m18:23�[22m�[39m
    1022:  �[90m 16| �[39m      �[34mexpect�[39m(id1)�[33m.�[39m�[34mtoMatch�[39m(�[36m/^test-\d+$/�[39m)
    1023:  �[90m 17| �[39m      �[34mexpect�[39m(id2)�[33m.�[39m�[34mtoMatch�[39m(�[36m/^test-\d+$/�[39m)
    1024:  �[90m 18| �[39m      �[34mexpect�[39m(id1)�[33m.�[39mnot�[33m.�[39m�[34mtoBe�[39m(id2)
    1025:  �[90m   | �[39m                      �[31m^�[39m
    1026:  �[90m 19| �[39m    })
    1027:  �[90m 20| �[39m  })
    1028:  �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯�[22m�[39m
    1029:  �[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m2 passed�[39m�[22m�[2m | �[22m�[33m1 skipped�[39m�[90m (4)�[39m
    1030:  �[2m      Tests �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m15 passed�[39m�[22m�[2m | �[22m�[33m3 skipped�[39m�[90m (19)�[39m
    1031:  �[2m   Start at �[22m 07:16:25
    1032:  �[2m   Duration �[22m 2.93s�[2m (transform 609ms, setup 282ms, collect 1.61s, tests 528ms, environment 10ms, prepare 1.79s)�[22m
    1033:  ELIFECYCLE  Test failed. See above for more details.
    1034:  [ERROR] command finished with error: command (/home/runner/work/liam/liam/frontend/apps/app) /home/runner/setup-pnpm/node_modules/.bin/pnpm run test exited (1)
    1035:  ##[group]@liam-hq/agent:test
    ...
    
    1073:  �[32m✓�[39m src/diff/tables/__tests__/buildTableDiffItem.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
    1074:  �[32m✓�[39m src/diff/utils/__tests__/getChangeStatus.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
    1075:  �[32m✓�[39m src/parser/tbls/schema.generated.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 20�[2mms�[22m�[39m
    1076:  �[32m✓�[39m src/parser/schemarb/singularize.test.ts �[2m(�[22m�[2m18 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
    1077:  �[32m✓�[39m src/parser/supportedFormat/detectFormat.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
    1078:  (node:8647) ExperimentalWarning: WASI is an experimental feature and might change at any time
    1079:  (Use `node --trace-warnings ...` to show where the warning was created)
    1080:  �[32m✓�[39m src/parser/index.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 317�[2mms�[22m�[39m
    1081:  ##[endgroup]
    1082:  ##[group]@liam-hq/cli:build
    1083:  ##[endgroup]
    1084:  ##[group]@liam-hq/cli:test
    1085:  cache miss, executing 9275c2ebc1a44ea4
    1086:  > @liam-hq/[email protected] test /home/runner/work/liam/liam/frontend/packages/cli
    1087:  > vitest run
    1088:  Failed during git operations: Error: Command failed: git fetch --tags
    1089:  at genericNodeError (node:internal/errors:983:15)
    1090:  at wrappedFn (node:internal/errors:537:14)
    1091:  at checkExecSyncError (node:child_process:882:11)
    1092:  at execSync (node:child_process:954:15)
    1093:  at isReleasedGitHash (file:///home/runner/work/liam/liam/frontend/packages/cli/node_modules/.vite-temp/vite.config.ts.timestamp-1750403785473-7029adcda43bf.mjs:65:7)
    1094:  at config (file:///home/runner/work/liam/liam/frontend/packages/cli/node_modules/.vite-temp/vite.config.ts.timestamp-1750403785473-7029adcda43bf.mjs:88:9)
    1095:  at runConfigHook (file:///home/runner/work/liam/liam/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected][email protected][email protected][email protected]/node_modules/vite/dist/node/chunks/dep-DBxKXgDP.js:49444:23)
    1096:  at async resolveConfig (file:///home/runner/work/liam/liam/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected][email protected][email protected][email protected]/node_modules/vite/dist/node/chunks/dep-DBxKXgDP.js:48751:12)
    1097:  at async _createServer (file:///home/runner/work/liam/liam/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected][email protected][email protected][email protected]/node_modules/vite/dist/node/chunks/dep-DBxKXgDP.js:38329:18)
    1098:  at async createViteServer (file:///home/runner/work/liam/liam/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_happy-dom@_148c4fcaaa198bebb0defb0dbbdb76bd/node_modules/vitest/dist/chunks/cli-api.BzebkJv7.js:6873:17) {
    1099:  status: null,
    1100:  signal: 'SIGINT',
    1101:  output: [ null, <Buffer >, <Buffer > ],
    1102:  pid: 9227,
    1103:  stdout: <Buffer >,
    1104:  stderr: <Buffer >
    1105:  }
    1106:  ##[endgroup]
    1107:  ##[error]@liam-hq/app#test: command (/home/runner/work/liam/liam/frontend/apps/app) /home/runner/setup-pnpm/node_modules/.bin/pnpm run test exited (1)
    1108:  Tasks:    11 successful, 17 total
    1109:  Cached:    0 cached, 17 total
    1110:  Time:    24.33s 
    1111:  Failed:    @liam-hq/app#test
    1112:  ERROR  run failed: command  exited (1)
    1113:  ELIFECYCLE  Command failed with exit code 1.
    1114:  ##[error]Process completed with exit code 1.
    1115:  Post job cleanup.
    

    @MH4GF MH4GF changed the title DO NOT MERGE: feat: implement ADD COLUMN operation support WIP: feat: implement ADD COLUMN operation support Jun 20, 2025
    @MH4GF MH4GF marked this pull request as ready for review June 20, 2025 07:36
    Base automatically changed from convert-create-table-ddl-2 to main June 20, 2025 09:23
    @MH4GF MH4GF changed the title WIP: feat: implement ADD COLUMN operation support feat: implement ADD COLUMN operation support Jun 20, 2025
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    1 participant