* Use pnpm instead of npm * Setup workspace * Replace scripts / lerna root stuff * Add todo file * Update lock, start updating packages * Update todo * [WIP] Keep going on module resolution in pnpm * Fix final missing deps/types for complete build * [WIP] Replace npm commands with pnpm alternatives * Update jest config for v28 * Fix missing package under schema * Update workflow * Run CI on fork * Use local reference * Remove version from local workflow * Add build to prepare * Add Node's max old space size flag to linter * Idemdito for codeql * Hyphens? Underscores? * Bang * Only build one thing at a time * Underscores after all? * Match 7gb of GH * Set env on prepare * Jest is driving me nuts * Downgrade jest * Add root jest * We'll get there, eventually. * 🥳 * Het houdt niet op, niet vanzelf * attempt to fix e2e * fix unit test & shared import * add `debug: true` to CodeQL action * Fix dev call in shared * Add missing cross-env * Add missing geo-json dependency for app * add flag to prepare action to skip build * remove debug flag from codeql action * fix invalid env syntax * add tslib to app dependencies for tests * another attempt * Added missing rimraf dependency for the api prebuild/cleanup scripts * Added missing ts-node dependency for the api cli script * update E2E tests readme to use pnpm * Undo move of extensions sdk * Fixes nested groups in accordions not rendering fields (#14369) * initial fix for nested groups in accordions * removed debug code * Fix strict relative dates showing "incorrect" (#14390) * Set rounding method of relative formatted date to floor when strict option is selected * Add round fn as an option Co-authored-by: rijkvanzanten <rijkvanzanten@me.com> * Don't use locales in generated camelCased values from env (#14401) Ref https://github.com/directus/directus/discussions/14122 * Fix list panel descending sort (#14396) * fix list panel descending sort * Handle missing or explicit desc value Co-authored-by: rijkvanzanten <rijkvanzanten@me.com> * Fix query primary field for system tables (#14402) * New Crowdin updates (#14403) * Update source file en-US.yaml * New translations en-US.yaml (Spanish, Chile) * New translations en-US.yaml (Spanish, Latin America) * New translations en-US.yaml (Greek) * New translations en-US.yaml (Italian) * New translations en-US.yaml (French, Canada) * Fix/wysiwyg context menu (#14404) * New translations en-US.yaml (Polish) (#14407) * Encoded the url using encodeURIComponent, so that the url gets sanitzed and so, we did not get 404 error. (#14418) * Encoded the url using encodeURIComponent, so that the url gets sanitized and we did not get 404 error. * Added required changes as stated by the reviewer * Used encodeURI instead of encodeURIComponent to encode the params only * Solved linting error * Solved linting errors * checked with npm run lint, no linting errors found * fix generateJoi error due to empty permissions when creating new role (#14416) * fix empty permissions when creating new role * basic test * move logic up * additional test * Update api/tests/utils/filter-items.test.ts Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: ian <licitdev@gmail.com> * Recreate lockfile * Fix build of extensions-sdk * Add missing dependency * Add some more missing deps * Update blackbox to use pnpm * Update workflow to use main * Update pack to work with pnpm * Simplify commands * Remove todo file (completed) * ADd missing types dep * Use local test version * Remove version from local reference * Call super with context * Add missing dep * Simplify workflows Ref https://github.com/directus/organization/issues/135 * Simplify some more * Linter is on root Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> Co-authored-by: brainslug <tim@brainslug.nl> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Gerard Lamusse <gerardlamo@gmail.com> Co-authored-by: José Varela <joselcvarela@gmail.com> Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: Zeel Pathak <60271095+zeel-pathak@users.noreply.github.com>
@directus/schema
Utility for extracting information about the database schema
Usage
The package is initialized by passing it an instance of Knex:
import knex from 'knex';
import schema from '@directus/schema';
const database = knex({
client: 'mysql',
connection: {
host: '127.0.0.1',
user: 'your_database_user',
password: 'your_database_password',
database: 'myapp_test',
charset: 'utf8',
},
});
const inspector = schema(database);
export default inspector;
Examples
import inspector from './inspector';
async function logTables() {
const tables = await inspector.tables();
console.log(tables);
}
API
Note: MySQL doesn't support the schema parameter, as schema and database are ambiguous in MySQL.
Note 2: Some database types might return slightly more information than others. See the type files for a specific overview what to expect from driver to driver.
Note 3: MSSQL doesn't support comment for either tables or columns
Tables
tables(): Promise<string[]>
Retrieve all tables in the current database.
await inspector.tables();
// => ['articles', 'images', 'reviews']
tableInfo(table?: string): Promise<Table | Table[]>
Retrieve the table info for the given table, or all tables if no table is specified
await inspector.tableInfo('articles');
// => {
// name: 'articles',
// schema: 'project',
// comment: 'Informational blog posts'
// }
await inspector.tableInfo();
// => [
// {
// name: 'articles',
// schema: 'project',
// comment: 'Informational blog posts'
// },
// { ... },
// { ... }
// ]
hasTable(table: string): Promise<boolean>
Check if a table exists in the current database.
await inspector.hasTable('articles');
// => true
Columns
columns(table?: string): Promise<{ table: string, column: string }[]>
Retrieve all columns in a given table, or all columns if no table is specified
await inspector.columns();
// => [
// {
// "table": "articles",
// "column": "id"
// },
// {
// "table": "articles",
// "column": "title"
// },
// {
// "table": "images",
// "column": "id"
// }
// ]
await inspector.columns('articles');
// => [
// {
// "table": "articles",
// "column": "id"
// },
// {
// "table": "articles",
// "column": "title"
// }
// ]
columnInfo(table?: string, column?: string): Promise<Column[] | Column>
Retrieve all columns from a given table. Returns all columns if table parameter is undefined.
await inspector.columnInfo('articles');
// => [
// {
// name: "id",
// table: "articles",
// type: "VARCHAR",
// defaultValue: null,
// maxLength: null,
// isNullable: false,
// isPrimaryKey: true,
// hasAutoIncrement: true,
// foreignKeyColumn: null,
// foreignKeyTable: null,
// comment: "Primary key for the articles collection"
// },
// { ... },
// { ... }
// ]
await inspector.columnInfo('articles', 'id');
// => {
// name: "id",
// table: "articles",
// type: "VARCHAR",
// defaultValue: null,
// maxLength: null,
// isNullable: false,
// isPrimaryKey: true,
// hasAutoIncrement: true,
// foreignKeyColumn: null,
// foreignKeyTable: null,
// comment: "Primary key for the articles collection"
// }
primary(table: string): Promise<string>
Retrieve the primary key column for a given table
await inspector.primary('articles');
// => "id"
Misc.
withSchema(schema: string): void
Not supported in MySQL
Set the schema to use. Note: this is set on the inspector instance and only has to be done once:
inspector.withSchema('my-schema');
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
Tests
First start docker containers:
$ docker-compose up -d
Then run tests:
$ npm test
Standard mocha filter (grep) can be used:
$ npm test -- -g '.tableInfo'