typhex 0.1.0-alpha.0
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/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +417 -0
- package/SECURITY.md +32 -0
- package/dist/arrow/aggregates.d.ts +12 -0
- package/dist/arrow/aggregates.d.ts.map +1 -0
- package/dist/arrow/aggregates.js +32 -0
- package/dist/arrow/aggregates.js.map +1 -0
- package/dist/arrow/constants.d.ts +15 -0
- package/dist/arrow/constants.d.ts.map +1 -0
- package/dist/arrow/constants.js +42 -0
- package/dist/arrow/constants.js.map +1 -0
- package/dist/arrow/index.d.ts +7 -0
- package/dist/arrow/index.d.ts.map +1 -0
- package/dist/arrow/index.js +7 -0
- package/dist/arrow/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load-config.d.ts +19 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +84 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/load-env.d.ts +7 -0
- package/dist/config/load-env.d.ts.map +1 -0
- package/dist/config/load-env.js +62 -0
- package/dist/config/load-env.js.map +1 -0
- package/dist/config/types.d.ts +20 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +10 -0
- package/dist/config/types.js.map +1 -0
- package/dist/dbs/base-migrator.d.ts +20 -0
- package/dist/dbs/base-migrator.d.ts.map +1 -0
- package/dist/dbs/base-migrator.js +112 -0
- package/dist/dbs/base-migrator.js.map +1 -0
- package/dist/dbs/index.d.ts +9 -0
- package/dist/dbs/index.d.ts.map +1 -0
- package/dist/dbs/index.js +17 -0
- package/dist/dbs/index.js.map +1 -0
- package/dist/dbs/postgres/dialect.d.ts +8 -0
- package/dist/dbs/postgres/dialect.d.ts.map +1 -0
- package/dist/dbs/postgres/dialect.js +17 -0
- package/dist/dbs/postgres/dialect.js.map +1 -0
- package/dist/dbs/postgres/driver.d.ts +42 -0
- package/dist/dbs/postgres/driver.d.ts.map +1 -0
- package/dist/dbs/postgres/driver.js +111 -0
- package/dist/dbs/postgres/driver.js.map +1 -0
- package/dist/dbs/postgres/index.d.ts +6 -0
- package/dist/dbs/postgres/index.d.ts.map +1 -0
- package/dist/dbs/postgres/index.js +5 -0
- package/dist/dbs/postgres/index.js.map +1 -0
- package/dist/dbs/postgres/migrator.d.ts +13 -0
- package/dist/dbs/postgres/migrator.d.ts.map +1 -0
- package/dist/dbs/postgres/migrator.js +22 -0
- package/dist/dbs/postgres/migrator.js.map +1 -0
- package/dist/dbs/postgres/query-compiler.d.ts +22 -0
- package/dist/dbs/postgres/query-compiler.d.ts.map +1 -0
- package/dist/dbs/postgres/query-compiler.js +140 -0
- package/dist/dbs/postgres/query-compiler.js.map +1 -0
- package/dist/dbs/postgres/trx.d.ts +16 -0
- package/dist/dbs/postgres/trx.d.ts.map +1 -0
- package/dist/dbs/postgres/trx.js +68 -0
- package/dist/dbs/postgres/trx.js.map +1 -0
- package/dist/dbs/query-compiler.d.ts +135 -0
- package/dist/dbs/query-compiler.d.ts.map +1 -0
- package/dist/dbs/query-compiler.js +775 -0
- package/dist/dbs/query-compiler.js.map +1 -0
- package/dist/dbs/sqlite/dialect.d.ts +8 -0
- package/dist/dbs/sqlite/dialect.d.ts.map +1 -0
- package/dist/dbs/sqlite/dialect.js +17 -0
- package/dist/dbs/sqlite/dialect.js.map +1 -0
- package/dist/dbs/sqlite/driver.d.ts +9 -0
- package/dist/dbs/sqlite/driver.d.ts.map +1 -0
- package/dist/dbs/sqlite/driver.js +66 -0
- package/dist/dbs/sqlite/driver.js.map +1 -0
- package/dist/dbs/sqlite/index.d.ts +6 -0
- package/dist/dbs/sqlite/index.d.ts.map +1 -0
- package/dist/dbs/sqlite/index.js +5 -0
- package/dist/dbs/sqlite/index.js.map +1 -0
- package/dist/dbs/sqlite/migrator.d.ts +13 -0
- package/dist/dbs/sqlite/migrator.d.ts.map +1 -0
- package/dist/dbs/sqlite/migrator.js +22 -0
- package/dist/dbs/sqlite/migrator.js.map +1 -0
- package/dist/dbs/sqlite/query-compiler.d.ts +26 -0
- package/dist/dbs/sqlite/query-compiler.d.ts.map +1 -0
- package/dist/dbs/sqlite/query-compiler.js +80 -0
- package/dist/dbs/sqlite/query-compiler.js.map +1 -0
- package/dist/dbs/sqlite/trx.d.ts +13 -0
- package/dist/dbs/sqlite/trx.d.ts.map +1 -0
- package/dist/dbs/sqlite/trx.js +69 -0
- package/dist/dbs/sqlite/trx.js.map +1 -0
- package/dist/dbs/types.d.ts +92 -0
- package/dist/dbs/types.d.ts.map +1 -0
- package/dist/dbs/types.js +26 -0
- package/dist/dbs/types.js.map +1 -0
- package/dist/dialect.d.ts +3 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +2 -0
- package/dist/dialect.js.map +1 -0
- package/dist/driver/factory.d.ts +19 -0
- package/dist/driver/factory.d.ts.map +1 -0
- package/dist/driver/factory.js +24 -0
- package/dist/driver/factory.js.map +1 -0
- package/dist/driver/index.d.ts +6 -0
- package/dist/driver/index.d.ts.map +1 -0
- package/dist/driver/index.js +3 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/driver/sqlite.d.ts +15 -0
- package/dist/driver/sqlite.d.ts.map +1 -0
- package/dist/driver/sqlite.js +74 -0
- package/dist/driver/sqlite.js.map +1 -0
- package/dist/driver/types.d.ts +75 -0
- package/dist/driver/types.d.ts.map +1 -0
- package/dist/driver/types.js +2 -0
- package/dist/driver/types.js.map +1 -0
- package/dist/entity/entity.d.ts +67 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +139 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/global-driver.d.ts +38 -0
- package/dist/entity/global-driver.d.ts.map +1 -0
- package/dist/entity/global-driver.js +109 -0
- package/dist/entity/global-driver.js.map +1 -0
- package/dist/entity/index.d.ts +8 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/pk-columns.d.ts +5 -0
- package/dist/entity/pk-columns.d.ts.map +1 -0
- package/dist/entity/pk-columns.js +14 -0
- package/dist/entity/pk-columns.js.map +1 -0
- package/dist/entity/relations.d.ts +134 -0
- package/dist/entity/relations.d.ts.map +1 -0
- package/dist/entity/relations.js +23 -0
- package/dist/entity/relations.js.map +1 -0
- package/dist/entity/schema-inference.d.ts +77 -0
- package/dist/entity/schema-inference.d.ts.map +1 -0
- package/dist/entity/schema-inference.js +6 -0
- package/dist/entity/schema-inference.js.map +1 -0
- package/dist/entity/types.d.ts +30 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +5 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +2 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +2 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +148 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +97 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/migration/cli.d.ts +18 -0
- package/dist/migration/cli.d.ts.map +1 -0
- package/dist/migration/cli.js +236 -0
- package/dist/migration/cli.js.map +1 -0
- package/dist/migration/diff.d.ts +10 -0
- package/dist/migration/diff.d.ts.map +1 -0
- package/dist/migration/diff.js +10 -0
- package/dist/migration/diff.js.map +1 -0
- package/dist/migration/generator.d.ts +12 -0
- package/dist/migration/generator.d.ts.map +1 -0
- package/dist/migration/generator.js +98 -0
- package/dist/migration/generator.js.map +1 -0
- package/dist/migration/index.d.ts +7 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +5 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/runner.d.ts +32 -0
- package/dist/migration/runner.d.ts.map +1 -0
- package/dist/migration/runner.js +279 -0
- package/dist/migration/runner.js.map +1 -0
- package/dist/migration/topo-sort.d.ts +12 -0
- package/dist/migration/topo-sort.d.ts.map +1 -0
- package/dist/migration/topo-sort.js +42 -0
- package/dist/migration/topo-sort.js.map +1 -0
- package/dist/migration/types.d.ts +45 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +2 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/orm/aggregates.d.ts +19 -0
- package/dist/orm/aggregates.d.ts.map +1 -0
- package/dist/orm/aggregates.js +32 -0
- package/dist/orm/aggregates.js.map +1 -0
- package/dist/orm/db.d.ts +105 -0
- package/dist/orm/db.d.ts.map +1 -0
- package/dist/orm/db.js +172 -0
- package/dist/orm/db.js.map +1 -0
- package/dist/orm/expr.d.ts +125 -0
- package/dist/orm/expr.d.ts.map +1 -0
- package/dist/orm/expr.js +10 -0
- package/dist/orm/expr.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts +9 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js +44 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts +13 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.js +42 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts +46 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.js +258 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts +7 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js +8 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts +15 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.js +48 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.js.map +1 -0
- package/dist/orm/helpers/query-plan/expr-builder.d.ts +155 -0
- package/dist/orm/helpers/query-plan/expr-builder.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/expr-builder.js +297 -0
- package/dist/orm/helpers/query-plan/expr-builder.js.map +1 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts +48 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.js +262 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.js.map +1 -0
- package/dist/orm/helpers/query-plan/query-plan.d.ts +164 -0
- package/dist/orm/helpers/query-plan/query-plan.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/query-plan.js +549 -0
- package/dist/orm/helpers/query-plan/query-plan.js.map +1 -0
- package/dist/orm/helpers/query-plan/select-classifier.d.ts +161 -0
- package/dist/orm/helpers/query-plan/select-classifier.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/select-classifier.js +359 -0
- package/dist/orm/helpers/query-plan/select-classifier.js.map +1 -0
- package/dist/orm/helpers/relations/relation-assembler.d.ts +21 -0
- package/dist/orm/helpers/relations/relation-assembler.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-assembler.js +60 -0
- package/dist/orm/helpers/relations/relation-assembler.js.map +1 -0
- package/dist/orm/helpers/relations/relation-fetcher.d.ts +30 -0
- package/dist/orm/helpers/relations/relation-fetcher.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-fetcher.js +128 -0
- package/dist/orm/helpers/relations/relation-fetcher.js.map +1 -0
- package/dist/orm/helpers/relations/relation-joins.d.ts +74 -0
- package/dist/orm/helpers/relations/relation-joins.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-joins.js +138 -0
- package/dist/orm/helpers/relations/relation-joins.js.map +1 -0
- package/dist/orm/helpers/relations/relation-resolver.d.ts +14 -0
- package/dist/orm/helpers/relations/relation-resolver.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-resolver.js +25 -0
- package/dist/orm/helpers/relations/relation-resolver.js.map +1 -0
- package/dist/orm/index.d.ts +7 -0
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/orm/index.js +5 -0
- package/dist/orm/index.js.map +1 -0
- package/dist/orm/query-builder.d.ts +136 -0
- package/dist/orm/query-builder.d.ts.map +1 -0
- package/dist/orm/query-builder.js +433 -0
- package/dist/orm/query-builder.js.map +1 -0
- package/dist/orm/query-helpers.d.ts +35 -0
- package/dist/orm/query-helpers.d.ts.map +1 -0
- package/dist/orm/query-helpers.js +83 -0
- package/dist/orm/query-helpers.js.map +1 -0
- package/dist/orm/query-state.d.ts +56 -0
- package/dist/orm/query-state.d.ts.map +1 -0
- package/dist/orm/query-state.js +112 -0
- package/dist/orm/query-state.js.map +1 -0
- package/dist/orm/single-row-query-builder.d.ts +18 -0
- package/dist/orm/single-row-query-builder.d.ts.map +1 -0
- package/dist/orm/single-row-query-builder.js +90 -0
- package/dist/orm/single-row-query-builder.js.map +1 -0
- package/dist/orm/trx.d.ts +40 -0
- package/dist/orm/trx.d.ts.map +1 -0
- package/dist/orm/trx.js +118 -0
- package/dist/orm/trx.js.map +1 -0
- package/dist/parser/acorn-helpers.d.ts +43 -0
- package/dist/parser/acorn-helpers.d.ts.map +1 -0
- package/dist/parser/acorn-helpers.js +104 -0
- package/dist/parser/acorn-helpers.js.map +1 -0
- package/dist/parser/acorn-member.d.ts +16 -0
- package/dist/parser/acorn-member.d.ts.map +1 -0
- package/dist/parser/acorn-member.js +31 -0
- package/dist/parser/acorn-member.js.map +1 -0
- package/dist/parser/acorn-types.d.ts +14 -0
- package/dist/parser/acorn-types.d.ts.map +1 -0
- package/dist/parser/acorn-types.js +6 -0
- package/dist/parser/acorn-types.js.map +1 -0
- package/dist/parser/arrow-source.d.ts +23 -0
- package/dist/parser/arrow-source.d.ts.map +1 -0
- package/dist/parser/arrow-source.js +70 -0
- package/dist/parser/arrow-source.js.map +1 -0
- package/dist/parser/group-by.d.ts +17 -0
- package/dist/parser/group-by.d.ts.map +1 -0
- package/dist/parser/group-by.js +62 -0
- package/dist/parser/group-by.js.map +1 -0
- package/dist/parser/index.d.ts +5 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parse-arrow.d.ts +10 -0
- package/dist/parser/parse-arrow.d.ts.map +1 -0
- package/dist/parser/parse-arrow.js +9 -0
- package/dist/parser/parse-arrow.js.map +1 -0
- package/dist/parser/predicate-walk.d.ts +24 -0
- package/dist/parser/predicate-walk.d.ts.map +1 -0
- package/dist/parser/predicate-walk.js +247 -0
- package/dist/parser/predicate-walk.js.map +1 -0
- package/dist/parser/resolve.d.ts +25 -0
- package/dist/parser/resolve.d.ts.map +1 -0
- package/dist/parser/resolve.js +134 -0
- package/dist/parser/resolve.js.map +1 -0
- package/dist/parser/select.d.ts +7 -0
- package/dist/parser/select.d.ts.map +1 -0
- package/dist/parser/select.js +333 -0
- package/dist/parser/select.js.map +1 -0
- package/dist/parser/update.d.ts +7 -0
- package/dist/parser/update.d.ts.map +1 -0
- package/dist/parser/update.js +51 -0
- package/dist/parser/update.js.map +1 -0
- package/dist/postgres/aggregates.d.ts +12 -0
- package/dist/postgres/aggregates.d.ts.map +1 -0
- package/dist/postgres/aggregates.js +19 -0
- package/dist/postgres/aggregates.js.map +1 -0
- package/dist/postgres.d.ts +6 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +6 -0
- package/dist/postgres.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +16 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +40 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/sqlite/aggregates.d.ts +8 -0
- package/dist/sqlite/aggregates.d.ts.map +1 -0
- package/dist/sqlite/aggregates.js +11 -0
- package/dist/sqlite/aggregates.js.map +1 -0
- package/dist/sqlite.d.ts +6 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +6 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/transformer/bindings.d.ts +18 -0
- package/dist/transformer/bindings.d.ts.map +1 -0
- package/dist/transformer/bindings.js +52 -0
- package/dist/transformer/bindings.js.map +1 -0
- package/dist/transformer/index.d.ts +17 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +75 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/ir-emit.d.ts +12 -0
- package/dist/transformer/ir-emit.d.ts.map +1 -0
- package/dist/transformer/ir-emit.js +144 -0
- package/dist/transformer/ir-emit.js.map +1 -0
- package/dist/transformer/join-transformer.d.ts +12 -0
- package/dist/transformer/join-transformer.d.ts.map +1 -0
- package/dist/transformer/join-transformer.js +102 -0
- package/dist/transformer/join-transformer.js.map +1 -0
- package/dist/transformer/orderby-transformer.d.ts +13 -0
- package/dist/transformer/orderby-transformer.d.ts.map +1 -0
- package/dist/transformer/orderby-transformer.js +84 -0
- package/dist/transformer/orderby-transformer.js.map +1 -0
- package/dist/transformer/select-transformer.d.ts +9 -0
- package/dist/transformer/select-transformer.d.ts.map +1 -0
- package/dist/transformer/select-transformer.js +222 -0
- package/dist/transformer/select-transformer.js.map +1 -0
- package/dist/transformer/shared.d.ts +12 -0
- package/dist/transformer/shared.d.ts.map +1 -0
- package/dist/transformer/shared.js +12 -0
- package/dist/transformer/shared.js.map +1 -0
- package/dist/transformer/subquery-transformer.d.ts +15 -0
- package/dist/transformer/subquery-transformer.d.ts.map +1 -0
- package/dist/transformer/subquery-transformer.js +43 -0
- package/dist/transformer/subquery-transformer.js.map +1 -0
- package/dist/transformer/ts-aggregates.d.ts +13 -0
- package/dist/transformer/ts-aggregates.d.ts.map +1 -0
- package/dist/transformer/ts-aggregates.js +83 -0
- package/dist/transformer/ts-aggregates.js.map +1 -0
- package/dist/transformer/ts-binary.d.ts +8 -0
- package/dist/transformer/ts-binary.d.ts.map +1 -0
- package/dist/transformer/ts-binary.js +32 -0
- package/dist/transformer/ts-binary.js.map +1 -0
- package/dist/transformer/ts-member.d.ts +12 -0
- package/dist/transformer/ts-member.d.ts.map +1 -0
- package/dist/transformer/ts-member.js +22 -0
- package/dist/transformer/ts-member.js.map +1 -0
- package/dist/transformer/ts-utils.d.ts +10 -0
- package/dist/transformer/ts-utils.d.ts.map +1 -0
- package/dist/transformer/ts-utils.js +38 -0
- package/dist/transformer/ts-utils.js.map +1 -0
- package/dist/transformer/typhex-type.d.ts +8 -0
- package/dist/transformer/typhex-type.d.ts.map +1 -0
- package/dist/transformer/typhex-type.js +52 -0
- package/dist/transformer/typhex-type.js.map +1 -0
- package/dist/transformer/where-transformer.d.ts +33 -0
- package/dist/transformer/where-transformer.d.ts.map +1 -0
- package/dist/transformer/where-transformer.js +400 -0
- package/dist/transformer/where-transformer.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +30 -0
- package/dist/utils.js.map +1 -0
- package/docs/drivers/postgres.md +54 -0
- package/docs/drivers/sqlite.md +33 -0
- package/docs/guide/aggregations.md +272 -0
- package/docs/guide/bulk-operations.md +204 -0
- package/docs/guide/cte-and-unions.md +270 -0
- package/docs/guide/entities-relations.md +208 -0
- package/docs/guide/expressions.md +98 -0
- package/docs/guide/filtering-by-relations.md +166 -0
- package/docs/guide/getting-started.md +277 -0
- package/docs/guide/querying-relations.md +133 -0
- package/docs/guide/subqueries.md +152 -0
- package/docs/guide/transactions.md +146 -0
- package/docs/guide/typescript-transformer.md +138 -0
- package/docs/index.md +33 -0
- package/docs/migrations/overview.md +143 -0
- package/docs/public-api.md +133 -0
- package/docs/reference/api.md +665 -0
- package/docs/reference/architecture.md +83 -0
- package/docs/release-checklist.md +55 -0
- package/etc/typhex.api.md +774 -0
- package/package.json +137 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Typhex will be documented in this file.
|
|
4
|
+
|
|
5
|
+
Typhex follows semantic versioning for the documented public API. During the
|
|
6
|
+
0.x series, APIs may still change while the package is being hardened.
|
|
7
|
+
|
|
8
|
+
## Unreleased
|
|
9
|
+
|
|
10
|
+
## 0.1.0-alpha.0 - 2026-06-15
|
|
11
|
+
|
|
12
|
+
- Initial public alpha preview.
|
|
13
|
+
- Added release hardening metadata and package verification scripts.
|
|
14
|
+
- Added CI quality gates for linting, formatting, API compatibility, coverage,
|
|
15
|
+
and package dry-runs.
|
|
16
|
+
- Added an explicit MIT license file.
|
|
17
|
+
- Added a production dependency audit gate for release checks.
|
|
18
|
+
- Added deterministic parser/compiler fuzz coverage across SQLite and PostgreSQL
|
|
19
|
+
SQL compilation.
|
|
20
|
+
- Upgraded Vitest and coverage tooling to remove critical dev audit findings.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ioannis Kalyvas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# Typhex
|
|
2
|
+
|
|
3
|
+
[](https://github.com/kalyvasio/typhex/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/kalyvasio/typhex/actions/workflows/docs.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
A TypeScript/JavaScript ORM that lets you write SQL queries with arrow-function predicates:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
const adults = await User.query()
|
|
11
|
+
.where((u) => u.age > 18)
|
|
12
|
+
.toArray();
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Typhex compiles those predicates to safe, parameterized SQL through either a TypeScript transformer or a runtime parser.
|
|
16
|
+
|
|
17
|
+
## Why Typhex?
|
|
18
|
+
|
|
19
|
+
- **Type-safe queries**: TypeScript understands your entity shape.
|
|
20
|
+
- **No SQL injection**: Generated SQL is parameterized.
|
|
21
|
+
- **Familiar syntax**: Write predicates like normal JavaScript/TypeScript expressions.
|
|
22
|
+
- **Compile-time mode**: The transformer auto-captures closure variables and avoids runtime parsing.
|
|
23
|
+
- **Runtime fallback**: Plain JavaScript and direct `tsx` scripts work with explicit closure variables.
|
|
24
|
+
- **ORM features**: Relations, aggregations, transactions, bulk inserts, upserts, and graph inserts.
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
For SQLite:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install typhex better-sqlite3
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For PostgreSQL:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install typhex pg
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
For TypeScript projects, install the transformer tooling too:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install --save-dev ts-patch
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`better-sqlite3` includes a native addon. If installation fails, install local build tools first: `xcode-select --install` on macOS, or `build-essential` or equivalent on Linux.
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
### Define a Schema
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { Db, Entity, createSqliteDriver } from "typhex";
|
|
54
|
+
|
|
55
|
+
const User = Entity("users", {
|
|
56
|
+
id: "integer primary key autoincrement",
|
|
57
|
+
name: "text not null",
|
|
58
|
+
age: "integer not null",
|
|
59
|
+
country: "text not null",
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Connect and Migrate
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const db = new Db(createSqliteDriver({ path: "./app.db" }));
|
|
67
|
+
|
|
68
|
+
await db.migrate();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Insert Rows
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
await User.query().insert({ name: "Alice", age: 30, country: "US" });
|
|
75
|
+
await User.query().insert({ name: "Bob", age: 25, country: "UK" });
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Query Rows
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
const adults = await User.query()
|
|
82
|
+
.where((u) => u.age > 18)
|
|
83
|
+
.orderBy((u) => u.name, "asc")
|
|
84
|
+
.toArray();
|
|
85
|
+
|
|
86
|
+
const firstAdult = await User.query()
|
|
87
|
+
.where((u) => u.age > 18)
|
|
88
|
+
.first();
|
|
89
|
+
|
|
90
|
+
const alice = await User.query().findById(1);
|
|
91
|
+
const usCount = await User.query()
|
|
92
|
+
.where((u) => u.country === "US")
|
|
93
|
+
.count();
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Update, Patch, and Delete
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
await User.query()
|
|
100
|
+
.where((u) => u.name === "Bob")
|
|
101
|
+
.update({ age: 26 });
|
|
102
|
+
|
|
103
|
+
const updated = await User.query()
|
|
104
|
+
.where((u) => u.name === "Alice")
|
|
105
|
+
.patch({ country: "CA" });
|
|
106
|
+
|
|
107
|
+
await User.query()
|
|
108
|
+
.where((u) => u.country === "UK")
|
|
109
|
+
.delete();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`update()` returns the number of rows changed. `patch()` performs the update and returns the updated row.
|
|
113
|
+
|
|
114
|
+
## Runtime vs Transformer Mode
|
|
115
|
+
|
|
116
|
+
Typhex has two ways to turn arrow functions into query IR.
|
|
117
|
+
|
|
118
|
+
### Runtime Mode
|
|
119
|
+
|
|
120
|
+
Runtime mode works in JavaScript, direct `tsx` scripts, and projects without a TypeScript compiler plugin. Closure variables must be passed explicitly:
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
const country = "US";
|
|
124
|
+
|
|
125
|
+
const users = await User.query()
|
|
126
|
+
.where((u) => u.country === country, { country })
|
|
127
|
+
.toArray();
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Transformer Mode
|
|
131
|
+
|
|
132
|
+
Transformer mode is recommended for TypeScript projects. It compiles predicates at build time and auto-captures closure variables.
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"compilerOptions": {
|
|
137
|
+
"plugins": [{ "transform": "typhex/transformer" }]
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npx ts-patch install
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
After setup, no second argument is needed:
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
const country = "US";
|
|
150
|
+
const minAge = 25;
|
|
151
|
+
|
|
152
|
+
const users = await User.query()
|
|
153
|
+
.where((u) => u.country === country && u.age >= minAge)
|
|
154
|
+
.toArray();
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
See the [TypeScript transformer guide](docs/guide/typescript-transformer.md) for setup details and dev-time notes.
|
|
158
|
+
|
|
159
|
+
## Querying
|
|
160
|
+
|
|
161
|
+
### Filtering, Ordering, and Paging
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
const users = await User.query()
|
|
165
|
+
.where((u) => u.age >= 18 && u.country === "US")
|
|
166
|
+
.orderBy((u) => u.age, "desc")
|
|
167
|
+
.limit(10)
|
|
168
|
+
.offset(20)
|
|
169
|
+
.toArray();
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Selecting Columns
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
const names = await User.query().select(["name", "country"]).toArray();
|
|
176
|
+
|
|
177
|
+
const projected = await User.query()
|
|
178
|
+
.select((u) => ({ userId: u.id, displayName: u.name }))
|
|
179
|
+
.toArray();
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### String Predicates and IN
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
const matching = await User.query()
|
|
186
|
+
.where((u) => u.name.startsWith("A") || u.name.includes("son"))
|
|
187
|
+
.toArray();
|
|
188
|
+
|
|
189
|
+
const ids = [1, 2, 3];
|
|
190
|
+
const selected = await User.query()
|
|
191
|
+
.where((u) => u.id in ids, { ids })
|
|
192
|
+
.toArray();
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
With the transformer enabled, captured arrays do not need the second argument.
|
|
196
|
+
|
|
197
|
+
### Subqueries
|
|
198
|
+
|
|
199
|
+
`IN` and `NOT IN` subqueries work in runtime and transformer mode. Runtime mode passes the inner query through the params object:
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
const activePostIds = Post.query()
|
|
203
|
+
.where((p) => p.active === 1)
|
|
204
|
+
.select((p) => p.id);
|
|
205
|
+
|
|
206
|
+
const authors = await Author.query()
|
|
207
|
+
.where((a, posts) => a.postId in posts, { posts: activePostIds })
|
|
208
|
+
.toArray();
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Transformer mode can inline the inner query:
|
|
212
|
+
|
|
213
|
+
```ts
|
|
214
|
+
const authors = await Author.query()
|
|
215
|
+
.where(
|
|
216
|
+
(a) =>
|
|
217
|
+
a.postId in
|
|
218
|
+
Post.query()
|
|
219
|
+
.where((p) => p.active === 1)
|
|
220
|
+
.select((p) => p.id),
|
|
221
|
+
)
|
|
222
|
+
.toArray();
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Scalar subqueries in `.select()`, `.where()` comparisons, and `.orderBy()` are transformer-only. See the [Subqueries guide](docs/guide/subqueries.md) for the supported shapes.
|
|
226
|
+
|
|
227
|
+
### CTEs and Unions
|
|
228
|
+
|
|
229
|
+
Use common table expressions when an inner query should be named and reused by an outer query:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
const adults = User.query().where((u) => u.age >= 18);
|
|
233
|
+
|
|
234
|
+
const workingAge = await User.query()
|
|
235
|
+
.withCte("adults", adults)
|
|
236
|
+
.from("adults")
|
|
237
|
+
.where((u) => u.age < 65)
|
|
238
|
+
.toArray();
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Typhex also supports `unionAll()`, recursive CTEs, entity-table joins for recursive branches, and CTE-correlated `update()` / `delete()`. See the [CTEs and Unions guide](docs/guide/cte-and-unions.md).
|
|
242
|
+
|
|
243
|
+
## Supported Predicate Syntax
|
|
244
|
+
|
|
245
|
+
Runtime mode supports a practical safe subset:
|
|
246
|
+
|
|
247
|
+
- Comparisons: `===`, `!==`, `==`, `!=`, `>`, `>=`, `<`, `<=`
|
|
248
|
+
- Logical operators: `&&`, `||`, `!`
|
|
249
|
+
- Member access, literals, array literals, and the `in` operator
|
|
250
|
+
- String methods: `.startsWith()`, `.endsWith()`, `.includes()`
|
|
251
|
+
- Aggregates in `.select()` and `.having()`: `count()`, `sum()`, `avg()`, `min()`, `max()`, `distinct(...)`
|
|
252
|
+
- Relation predicates such as `department.employees.some((e) => e.name === "Alice")`
|
|
253
|
+
- Universal relation predicates such as `department.employees.every((e) => e.active === true)`
|
|
254
|
+
- Relation query chains in `.select()`
|
|
255
|
+
|
|
256
|
+
Computed expressions (ternaries, arithmetic, bitwise operators, null checks) are also supported — see the [Expressions guide](docs/guide/expressions.md).
|
|
257
|
+
|
|
258
|
+
Runtime mode does not support unsigned right shift (`>>>`), optional chaining, nullish coalescing, arbitrary function calls, loops, assignments, `await`, `new`, or `instanceof`.
|
|
259
|
+
|
|
260
|
+
## Relations
|
|
261
|
+
|
|
262
|
+
Declare relations as the third argument to `Entity()`:
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
import { Entity, rel } from "typhex";
|
|
266
|
+
|
|
267
|
+
const Post = Entity(
|
|
268
|
+
"posts",
|
|
269
|
+
{
|
|
270
|
+
id: "integer primary key autoincrement",
|
|
271
|
+
title: "text not null",
|
|
272
|
+
authorId: "integer not null",
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
author: rel.manyToOne(() => User, { foreignKey: "authorId" }),
|
|
276
|
+
},
|
|
277
|
+
);
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Then use relation properties in `select()` and `where()`:
|
|
281
|
+
|
|
282
|
+
```ts
|
|
283
|
+
const posts = await Post.query()
|
|
284
|
+
.where((p) => p.author.country === "US")
|
|
285
|
+
.select((p) => ({ id: p.id, title: p.title, author: p.author }))
|
|
286
|
+
.toArray();
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Typhex supports `manyToOne`, `oneToMany`, `oneToOne`, and `manyToMany` relations. Relation selects avoid N+1 queries by batching related rows.
|
|
290
|
+
|
|
291
|
+
See [Entities & Relations](docs/guide/entities-relations.md), [Querying Relations](docs/guide/querying-relations.md), and [Filtering by Relations](docs/guide/filtering-by-relations.md).
|
|
292
|
+
|
|
293
|
+
## Aggregations
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
import { count, sum } from "typhex";
|
|
297
|
+
|
|
298
|
+
const statsByCountry = await User.query()
|
|
299
|
+
.select((u) => ({ country: u.country, users: count(u.id), totalAge: sum(u.age) }))
|
|
300
|
+
.groupBy((u) => u.country)
|
|
301
|
+
.having((u) => count(u.id) > 1)
|
|
302
|
+
.toArray();
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Typhex supports `GROUP BY`, `HAVING`, `distinct()`, and database-specific aggregates such as SQLite `groupConcat()` and PostgreSQL `stringAgg()`, `arrayAgg()`, and `jsonAgg()`.
|
|
306
|
+
|
|
307
|
+
See the [Aggregations guide](docs/guide/aggregations.md).
|
|
308
|
+
|
|
309
|
+
## Bulk and Graph Operations
|
|
310
|
+
|
|
311
|
+
### Bulk Inserts
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
await Product.query().insertMany([
|
|
315
|
+
{ sku: "W-001", name: "Widget", price: 999 },
|
|
316
|
+
{ sku: "G-001", name: "Gadget", price: 1499 },
|
|
317
|
+
]);
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Upserts
|
|
321
|
+
|
|
322
|
+
```ts
|
|
323
|
+
await Product.query()
|
|
324
|
+
.insert({ sku: "W-001", name: "Widget v2", price: 1099 })
|
|
325
|
+
.onConflict(["sku"])
|
|
326
|
+
.doUpdate(["name", "price"]);
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Graph Inserts
|
|
330
|
+
|
|
331
|
+
```ts
|
|
332
|
+
const post = await Post.query().insertGraph({
|
|
333
|
+
title: "Hello",
|
|
334
|
+
author: { name: "Alice" },
|
|
335
|
+
tags: [{ name: "typescript" }, { name: "orm" }],
|
|
336
|
+
});
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
See the [Bulk Operations guide](docs/guide/bulk-operations.md).
|
|
340
|
+
|
|
341
|
+
## Transactions
|
|
342
|
+
|
|
343
|
+
Use `db.transaction()` for callback-style transactions with implicit propagation:
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
await db.transaction(async () => {
|
|
347
|
+
const user = await User.query().insert({ name: "Alice", age: 30, country: "US" });
|
|
348
|
+
await Post.query().insert({ title: "Hello", authorId: user.id });
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Use `db.beginTrx()` when you need to pass a transaction handle through service layers:
|
|
353
|
+
|
|
354
|
+
```ts
|
|
355
|
+
const trx = await db.beginTrx();
|
|
356
|
+
|
|
357
|
+
try {
|
|
358
|
+
await User.query(trx).insert({ name: "Bob", age: 26, country: "UK" });
|
|
359
|
+
await trx.commit();
|
|
360
|
+
} catch {
|
|
361
|
+
await trx.rollback();
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
Nested transactions use savepoints. Transaction options include isolation level, PostgreSQL read-only/deferrable flags, and SQLite transaction mode.
|
|
366
|
+
|
|
367
|
+
See the [Transactions guide](docs/guide/transactions.md).
|
|
368
|
+
|
|
369
|
+
## Debugging
|
|
370
|
+
|
|
371
|
+
Set `TYPHEX_DEBUG=1` to log SQL and parameters:
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
TYPHEX_DEBUG=1 npx tsx your-script.ts
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
`true` and `yes` are also accepted.
|
|
378
|
+
|
|
379
|
+
## Architecture
|
|
380
|
+
|
|
381
|
+
Typhex uses a query IR (Intermediate Representation) that bridges arrow-function predicates and SQL:
|
|
382
|
+
|
|
383
|
+
1. Arrow functions are converted to IR through the runtime parser or TypeScript transformer.
|
|
384
|
+
2. The SQL compiler turns IR into dialect-specific, parameterized SQL.
|
|
385
|
+
3. The driver executes SQL through SQLite, PostgreSQL, or a custom backend.
|
|
386
|
+
|
|
387
|
+
See the [Architecture reference](docs/reference/architecture.md).
|
|
388
|
+
|
|
389
|
+
## Documentation
|
|
390
|
+
|
|
391
|
+
- [Getting Started](docs/guide/getting-started.md)
|
|
392
|
+
- [TypeScript Transformer](docs/guide/typescript-transformer.md)
|
|
393
|
+
- [Entities & Relations](docs/guide/entities-relations.md)
|
|
394
|
+
- [Querying Relations](docs/guide/querying-relations.md)
|
|
395
|
+
- [Filtering by Relations](docs/guide/filtering-by-relations.md)
|
|
396
|
+
- [Expressions](docs/guide/expressions.md)
|
|
397
|
+
- [Aggregations](docs/guide/aggregations.md)
|
|
398
|
+
- [Subqueries](docs/guide/subqueries.md)
|
|
399
|
+
- [CTEs and Unions](docs/guide/cte-and-unions.md)
|
|
400
|
+
- [Bulk Operations](docs/guide/bulk-operations.md)
|
|
401
|
+
- [Transactions](docs/guide/transactions.md)
|
|
402
|
+
- [Migrations](docs/migrations/overview.md)
|
|
403
|
+
- [SQLite Driver](docs/drivers/sqlite.md)
|
|
404
|
+
- [PostgreSQL Driver](docs/drivers/postgres.md)
|
|
405
|
+
- [API Reference](docs/reference/api.md)
|
|
406
|
+
|
|
407
|
+
## Contributing
|
|
408
|
+
|
|
409
|
+
Contributions welcome. Open areas include:
|
|
410
|
+
|
|
411
|
+
- Additional database drivers
|
|
412
|
+
- Broader runtime predicate syntax
|
|
413
|
+
- Runtime support for transformer-only scalar subquery shapes
|
|
414
|
+
|
|
415
|
+
## License
|
|
416
|
+
|
|
417
|
+
MIT
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
Security fixes are applied to the latest release on the default branch (`main`). Older versions may not receive patches.
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
| ---------------- | ----------- |
|
|
9
|
+
| latest on `main` | yes |
|
|
10
|
+
| older tags | best effort |
|
|
11
|
+
|
|
12
|
+
## Reporting a vulnerability
|
|
13
|
+
|
|
14
|
+
**Do not open a public GitHub issue for security vulnerabilities.**
|
|
15
|
+
|
|
16
|
+
Instead, report them privately using one of these options:
|
|
17
|
+
|
|
18
|
+
1. **GitHub private vulnerability reporting** (preferred): open the [Security tab](https://github.com/kalyvasio/typhex/security) on the repository and choose **Report a vulnerability**.
|
|
19
|
+
2. If private reporting is unavailable, contact the repository owner through GitHub and ask for a secure channel.
|
|
20
|
+
|
|
21
|
+
Please include:
|
|
22
|
+
|
|
23
|
+
- A description of the issue and its impact
|
|
24
|
+
- Steps to reproduce, or a minimal proof of concept if you have one
|
|
25
|
+
- Affected versions or commits
|
|
26
|
+
- Any suggested fix, if you have one
|
|
27
|
+
|
|
28
|
+
We will acknowledge your report as soon as possible and keep you updated on remediation progress. Please allow reasonable time for a fix before public disclosure.
|
|
29
|
+
|
|
30
|
+
## Safe harbor
|
|
31
|
+
|
|
32
|
+
We appreciate responsible disclosure. We will not pursue legal action against researchers who report vulnerabilities in good faith and follow this policy.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical aggregate function names and normalization from JS stub
|
|
3
|
+
* identifiers (e.g. `groupConcat`) to IR func names (`GROUP_CONCAT`).
|
|
4
|
+
* Shared by runtime parser and compile-time transformer.
|
|
5
|
+
*/
|
|
6
|
+
/** Recognized aggregate function names in IR. */
|
|
7
|
+
export declare const AGGREGATE_FUNCS: Set<string>;
|
|
8
|
+
/** Map a JS identifier (e.g. `count`, `groupConcat`) to the canonical IR func name. */
|
|
9
|
+
export declare function toIrFuncName(rawName: string): string;
|
|
10
|
+
/** True if `name` is a known aggregate after normalization. */
|
|
11
|
+
export declare function isAggregateFunc(name: string): boolean;
|
|
12
|
+
//# sourceMappingURL=aggregates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregates.d.ts","sourceRoot":"","sources":["../../src/arrow/aggregates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iDAAiD;AACjD,eAAO,MAAM,eAAe,aAU1B,CAAC;AASH,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical aggregate function names and normalization from JS stub
|
|
3
|
+
* identifiers (e.g. `groupConcat`) to IR func names (`GROUP_CONCAT`).
|
|
4
|
+
* Shared by runtime parser and compile-time transformer.
|
|
5
|
+
*/
|
|
6
|
+
/** Recognized aggregate function names in IR. */
|
|
7
|
+
export const AGGREGATE_FUNCS = new Set([
|
|
8
|
+
"SUM",
|
|
9
|
+
"AVG",
|
|
10
|
+
"MIN",
|
|
11
|
+
"MAX",
|
|
12
|
+
"COUNT",
|
|
13
|
+
"GROUP_CONCAT",
|
|
14
|
+
"STRING_AGG",
|
|
15
|
+
"ARRAY_AGG",
|
|
16
|
+
"JSON_AGG",
|
|
17
|
+
]);
|
|
18
|
+
const AGGREGATE_FUNC_MAP = {
|
|
19
|
+
groupconcat: "GROUP_CONCAT",
|
|
20
|
+
stringagg: "STRING_AGG",
|
|
21
|
+
arrayagg: "ARRAY_AGG",
|
|
22
|
+
jsonagg: "JSON_AGG",
|
|
23
|
+
};
|
|
24
|
+
/** Map a JS identifier (e.g. `count`, `groupConcat`) to the canonical IR func name. */
|
|
25
|
+
export function toIrFuncName(rawName) {
|
|
26
|
+
return AGGREGATE_FUNC_MAP[rawName.toLowerCase()] ?? rawName.toUpperCase();
|
|
27
|
+
}
|
|
28
|
+
/** True if `name` is a known aggregate after normalization. */
|
|
29
|
+
export function isAggregateFunc(name) {
|
|
30
|
+
return AGGREGATE_FUNCS.has(toIrFuncName(name));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=aggregates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregates.js","sourceRoot":"","sources":["../../src/arrow/aggregates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,cAAc;IACd,YAAY;IACZ,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAA2B;IACjD,WAAW,EAAE,cAAc;IAC3B,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,UAAU;CACpB,CAAC;AAEF,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5E,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared arrow-expression rules used by both the runtime parser (acorn) and
|
|
3
|
+
* the compile-time TypeScript transformer. Keeps allowed methods, default
|
|
4
|
+
* param names, and relation-chain method names in one place.
|
|
5
|
+
*/
|
|
6
|
+
import type { IrBinary } from "../ir/types.js";
|
|
7
|
+
/** Default row parameter when inference fails (e.g. `u => …`). */
|
|
8
|
+
export declare const DEFAULT_ROW_PARAM = "u";
|
|
9
|
+
/** String methods permitted in WHERE predicates (receiver must be a member path). */
|
|
10
|
+
export declare const ALLOWED_METHODS: Set<string>;
|
|
11
|
+
/** Methods allowed on relation query chains inside select lambdas. */
|
|
12
|
+
export declare const RELATION_QUERY_METHODS: Set<string>;
|
|
13
|
+
/** Acorn binary/logical operator strings → IR binary ops (runtime parser only). */
|
|
14
|
+
export declare const ACORN_BINARY_OPS: Record<string, IrBinary["op"] | undefined>;
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/arrow/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,qFAAqF;AACrF,eAAO,MAAM,eAAe,aAAkD,CAAC;AAE/E,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,aAOjC,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAqBvE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared arrow-expression rules used by both the runtime parser (acorn) and
|
|
3
|
+
* the compile-time TypeScript transformer. Keeps allowed methods, default
|
|
4
|
+
* param names, and relation-chain method names in one place.
|
|
5
|
+
*/
|
|
6
|
+
/** Default row parameter when inference fails (e.g. `u => …`). */
|
|
7
|
+
export const DEFAULT_ROW_PARAM = "u";
|
|
8
|
+
/** String methods permitted in WHERE predicates (receiver must be a member path). */
|
|
9
|
+
export const ALLOWED_METHODS = new Set(["startsWith", "endsWith", "includes"]);
|
|
10
|
+
/** Methods allowed on relation query chains inside select lambdas. */
|
|
11
|
+
export const RELATION_QUERY_METHODS = new Set([
|
|
12
|
+
"query",
|
|
13
|
+
"where",
|
|
14
|
+
"orderBy",
|
|
15
|
+
"limit",
|
|
16
|
+
"offset",
|
|
17
|
+
"select",
|
|
18
|
+
]);
|
|
19
|
+
/** Acorn binary/logical operator strings → IR binary ops (runtime parser only). */
|
|
20
|
+
export const ACORN_BINARY_OPS = {
|
|
21
|
+
"&&": "&&",
|
|
22
|
+
"||": "||",
|
|
23
|
+
"==": "==",
|
|
24
|
+
"===": "===",
|
|
25
|
+
"!=": "!=",
|
|
26
|
+
"!==": "!==",
|
|
27
|
+
">": ">",
|
|
28
|
+
">=": ">=",
|
|
29
|
+
"<": "<",
|
|
30
|
+
"<=": "<=",
|
|
31
|
+
"+": "+",
|
|
32
|
+
"-": "-",
|
|
33
|
+
"*": "*",
|
|
34
|
+
"/": "/",
|
|
35
|
+
"%": "%",
|
|
36
|
+
"&": "&",
|
|
37
|
+
"|": "|",
|
|
38
|
+
"^": "^",
|
|
39
|
+
"<<": "<<",
|
|
40
|
+
">>": ">>",
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/arrow/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/E,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAA+C;IAC1E,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACX,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel re-export for shared arrow-expression language rules (constants,
|
|
3
|
+
* aggregate naming). Imported by `src/parser/*` and `src/transformer/*`.
|
|
4
|
+
*/
|
|
5
|
+
export { DEFAULT_ROW_PARAM, ALLOWED_METHODS, RELATION_QUERY_METHODS, ACORN_BINARY_OPS, } from "./constants.js";
|
|
6
|
+
export { AGGREGATE_FUNCS, toIrFuncName, isAggregateFunc } from "./aggregates.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/arrow/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel re-export for shared arrow-expression language rules (constants,
|
|
3
|
+
* aggregate naming). Imported by `src/parser/*` and `src/transformer/*`.
|
|
4
|
+
*/
|
|
5
|
+
export { DEFAULT_ROW_PARAM, ALLOWED_METHODS, RELATION_QUERY_METHODS, ACORN_BINARY_OPS, } from "./constants.js";
|
|
6
|
+
export { AGGREGATE_FUNCS, toIrFuncName, isAggregateFunc } from "./aggregates.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/arrow/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { TyphexConfig } from "./types.js";
|
|
2
|
+
export { DEFAULT_CONFIG } from "./types.js";
|
|
3
|
+
export { loadConfig } from "./load-config.js";
|
|
4
|
+
export type { LoadConfigOptions } from "./load-config.js";
|
|
5
|
+
export { loadTyphexEnv, envToConfig } from "./load-env.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load typhex config from file or discover in cwd.
|
|
3
|
+
* Resolution: explicit path > typhex.config.js > typhex.config.mjs > typhex.config.json
|
|
4
|
+
*/
|
|
5
|
+
import type { TyphexConfig } from "./types.js";
|
|
6
|
+
/** Options for `loadConfig`. All fields are optional; omit to use auto-discovery. */
|
|
7
|
+
export interface LoadConfigOptions {
|
|
8
|
+
/** Explicit config file path */
|
|
9
|
+
configPath?: string;
|
|
10
|
+
/** Working directory for discovery */
|
|
11
|
+
cwd?: string;
|
|
12
|
+
/** Overrides (e.g. from CLI args) */
|
|
13
|
+
overrides?: Partial<TyphexConfig>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load and merge config. Order: overrides > config file > .env > defaults.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<TyphexConfig>;
|
|
19
|
+
//# sourceMappingURL=load-config.d.ts.map
|