From 30ab02ed90dabb5dee4b3458e4b930d1ff8792ea Mon Sep 17 00:00:00 2001 From: Akshaya Acharya Date: Thu, 24 Oct 2024 03:09:12 +0530 Subject: [PATCH] npm run build --- .../ndc-nodejs-lambda-connector.yaml | 147 ++++++++++++++++++ .gitignore | 1 + .nvmrc | 1 + generate-config.ts | 118 -------------- .../package-lock.json | 0 package.json => ndc-duckduckapi/package.json | 2 + {src => ndc-duckduckapi/src}/constants.ts | 0 {src => ndc-duckduckapi/src}/duckduckapi.ts | 108 ++++++++----- {src => ndc-duckduckapi/src}/functions.ts | 0 ndc-duckduckapi/src/generate-config.ts | 123 +++++++++++++++ .../src}/google-calendar-sync.ts | 0 .../src}/handlers/explain.ts | 0 .../src}/handlers/mutation.ts | 0 .../src}/handlers/query.ts | 0 .../src}/handlers/schema.ts | 0 {src => ndc-duckduckapi/src}/index.ts | 0 .../src}/lambda-sdk/cmdline.ts | 26 ++-- .../src}/lambda-sdk/connector.ts | 0 .../src}/lambda-sdk/execution.ts | 0 .../src}/lambda-sdk/host.ts | 0 .../src}/lambda-sdk/inference.ts | 0 .../src}/lambda-sdk/result.ts | 0 .../src}/lambda-sdk/schema.ts | 0 .../src}/lambda-sdk/sdk.ts | 0 .../src}/lambda-sdk/util.ts | 0 .../src}/stub.getstarted.ts | 0 .../tsconfig.json | 0 27 files changed, 354 insertions(+), 172 deletions(-) create mode 100644 .github/workflows/ndc-nodejs-lambda-connector.yaml create mode 100644 .nvmrc delete mode 100644 generate-config.ts rename package-lock.json => ndc-duckduckapi/package-lock.json (100%) rename package.json => ndc-duckduckapi/package.json (96%) rename {src => ndc-duckduckapi/src}/constants.ts (100%) rename {src => ndc-duckduckapi/src}/duckduckapi.ts (81%) rename {src => ndc-duckduckapi/src}/functions.ts (100%) create mode 100644 ndc-duckduckapi/src/generate-config.ts rename {src => ndc-duckduckapi/src}/google-calendar-sync.ts (100%) rename {src => ndc-duckduckapi/src}/handlers/explain.ts (100%) rename {src => ndc-duckduckapi/src}/handlers/mutation.ts (100%) rename {src => ndc-duckduckapi/src}/handlers/query.ts (100%) rename {src => ndc-duckduckapi/src}/handlers/schema.ts (100%) rename {src => ndc-duckduckapi/src}/index.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/cmdline.ts (61%) rename {src => ndc-duckduckapi/src}/lambda-sdk/connector.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/execution.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/host.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/inference.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/result.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/schema.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/sdk.ts (100%) rename {src => ndc-duckduckapi/src}/lambda-sdk/util.ts (100%) rename {src => ndc-duckduckapi/src}/stub.getstarted.ts (100%) rename tsconfig.json => ndc-duckduckapi/tsconfig.json (100%) diff --git a/.github/workflows/ndc-nodejs-lambda-connector.yaml b/.github/workflows/ndc-nodejs-lambda-connector.yaml new file mode 100644 index 0000000..22d49cc --- /dev/null +++ b/.github/workflows/ndc-nodejs-lambda-connector.yaml @@ -0,0 +1,147 @@ +name: "ndc-nodejs-lambda connector" +on: + pull_request: + branches: + - main + - test-ci/** + push: + branches: + - 'main' + - test-ci/** + tags: + - v** + +env: + DOCKER_REGISTRY: ghcr.io + DOCKER_IMAGE_NAME: hasura/ndc-nodejs-lambda + +jobs: + build-npm: + name: Build ndc-lambda-sdk npm package + defaults: + run: + working-directory: ./src + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + registry-url: https://registry.npmjs.org + cache: npm + cache-dependency-path: ./src/package-lock.json + - run: npm ci + - run: npm run build + - run: npm test + + publish-npm: + name: Publish ndc-lambda-sdk to npm + defaults: + run: + working-directory: ./ndc-lambda-sdk + needs: build-npm + runs-on: ubuntu-latest + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + registry-url: https://registry.npmjs.org + cache: npm + cache-dependency-path: ./ndc-lambda-sdk/package-lock.json + - run: | + PACKAGE_VERSION=`npm version | sed -rn "2 s/.*: '([^']*)'.*/\1/g; 2 p"` + TAG=`echo "$GITHUB_REF"| sed -r "s#.*/##g"` + echo '$TAG' = "$TAG" + echo '$GITHUB_REF' = "$GITHUB_REF" + echo '$PACKAGE_VERSION' = "$PACKAGE_VERSION" + if [ "$TAG" = "v$PACKAGE_VERSION" ] + then + echo "Success! Versions match." + else + echo "Package version (v$PACKAGE_VERSION) must match tag (GITHUB_REF: $GITHUB_REF) in order to publish" 1>&2 + exit 1 + fi + - run: npm ci + - run: npm run build + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + docker: + name: Build base docker image + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.DOCKER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: docker-metadata + uses: docker/metadata-action@v5 + with: + images: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }} + + - uses: docker/build-push-action@v6 + with: + context: . + push: ${{ startsWith(github.ref, 'refs/tags/v') }} + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.docker-metadata.outputs.tags }} + labels: ${{ steps.docker-metadata.outputs.labels }} + + release-connector: + name: Release connector + defaults: + run: + working-directory: ./connector-definition + runs-on: ubuntu-latest + needs: + - publish-npm + - docker + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + registry-url: https://registry.npmjs.org + cache: npm + cache-dependency-path: ./ndc-lambda-sdk/package-lock.json + - name: Build connector definition + run: make build + - uses: actions/upload-artifact@v4 + with: + name: connector-definition.tgz + path: ./connector-definition/dist/connector-definition.tgz + compression-level: 0 # Already compressed + - name: Get version from tag + id: get-version + run: | + echo "tagged_version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + shell: bash + - uses: mindsers/changelog-reader-action@v2 + id: changelog-reader + with: + version: ${{ steps.get-version.outputs.tagged_version }} + path: ./CHANGELOG.md + - uses: softprops/action-gh-release@v1 + with: + draft: false + tag_name: v${{ steps.get-version.outputs.tagged_version }} + body: ${{ steps.changelog-reader.outputs.changes }} + files: | + ./connector-definition/dist/connector-definition.tgz + fail_on_unmatched_files: true diff --git a/.gitignore b/.gitignore index 2369b07..53b16bd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ chinook.db.wal duck.db duck.db.wal +ndc-duckduckapi/dist \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..9de2256 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/iron diff --git a/generate-config.ts b/generate-config.ts deleted file mode 100644 index 870530e..0000000 --- a/generate-config.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { NotSupported, ObjectType } from '@hasura/ndc-sdk-typescript'; -import * as duckdb from 'duckdb'; -import * as fs from 'fs'; -import { promisify } from "util"; -import { DuckDBConfigurationSchema } from './src/duckduckapi'; -const writeFile = promisify(fs.writeFile); -const readFile = promisify(fs.readFile); -let HASURA_CONFIGURATION_DIRECTORY = process.env["HASURA_CONFIGURATION_DIRECTORY"] as string | undefined; -if (HASURA_CONFIGURATION_DIRECTORY === undefined || HASURA_CONFIGURATION_DIRECTORY.length === 0) { - HASURA_CONFIGURATION_DIRECTORY = "."; -} - -const determineType = (t: string): string => { - switch (t) { - case "BIGINT": - return "Int"; - case "BIT": - return "String"; - case "BOOLEAN": - return "Boolean"; - case "BLOB": - return "String"; - case "DATE": - return "String"; - case "DOUBLE": - return "Float"; - case "HUGEINT": - return "String"; - case "INTEGER": - return "Int"; - case "INTERVAL": - return "String"; - case "REAL": - return "Float"; - case "FLOAT": - return "Float"; - case "SMALLINT": - return "Int"; - case "TIME": - return "String"; - case "TIMESTAMP": - return "String"; - case "TIMESTAMP WITH TIME ZONE": - return "String"; - case "TINYINT": - return "Int"; - case "UBIGINT": - return "String"; - case "UINTEGER": - return "Int"; - case "USMALLINT": - return "Int"; - case "UTINYINT": - return "Int"; - case "UUID": - return "String"; - case "VARCHAR": - return "String"; - case "HUGEINT": - return "String"; - case "JSON": - return "JSON"; - default: - if (t.startsWith("DECIMAL")) { - return "Float"; - } - console.log(t); - throw new NotSupported("Unsupported type", {}); - } -}; - -async function queryAll(con: any, query: any): Promise { - return new Promise((resolve, reject) => { - con.all(query, function (err: any, res: any) { - if (err) { - reject(err); - } else { - resolve(res); - } - }) - - }) -}; - - -export async function generateConfig(db: duckdb.Database): Promise { - const tableNames: string[] = []; - const tableAliases: { [k: string]: string } = {}; - const objectTypes: { [k: string]: ObjectType } = {}; - const tables = await queryAll(db.connect(), "SHOW ALL TABLES"); - for (let table of tables) { - const tableName = table.name; // `${table.database}_${table.schema}_${table.name}`; - const aliasName = `${table.database}.${table.schema}.${table.name}`; - tableNames.push(tableName); - tableAliases[tableName] = aliasName; - if (!objectTypes[tableName]) { - objectTypes[tableName] = { - fields: {} - }; - } - for (let i = 0; i < table.column_names.length; i++) { - objectTypes[tableName]['fields'][table.column_names[i]] = { - type: { - type: "named", - name: determineType(table.column_types[i]) - } - } - } - } - const res: DuckDBConfigurationSchema = { - collection_names: tableNames, - collection_aliases: tableAliases, - object_types: objectTypes, - functions: [], - procedures: [] - }; - return Promise.resolve(res); -} \ No newline at end of file diff --git a/package-lock.json b/ndc-duckduckapi/package-lock.json similarity index 100% rename from package-lock.json rename to ndc-duckduckapi/package-lock.json diff --git a/package.json b/ndc-duckduckapi/package.json similarity index 96% rename from package.json rename to ndc-duckduckapi/package.json index 0de976a..bbaa27a 100644 --- a/package.json +++ b/ndc-duckduckapi/package.json @@ -4,6 +4,8 @@ "description": "", "main": "index.js", "scripts": { + "build": "tsc", + "test": "true", "start": "ts-node ./src/index.ts serve --configuration=.", "generate-config": "ts-node generate-config", "watch": "nodemon --watch \"src/**\" --ext \"ts,json\" --ignore \"src/**/*.spec.ts\" --exec \"ts-node src/index.ts serve --configuration=." diff --git a/src/constants.ts b/ndc-duckduckapi/src/constants.ts similarity index 100% rename from src/constants.ts rename to ndc-duckduckapi/src/constants.ts diff --git a/src/duckduckapi.ts b/ndc-duckduckapi/src/duckduckapi.ts similarity index 81% rename from src/duckduckapi.ts rename to ndc-duckduckapi/src/duckduckapi.ts index 78aa269..f2ce3bf 100644 --- a/src/duckduckapi.ts +++ b/ndc-duckduckapi/src/duckduckapi.ts @@ -1,25 +1,37 @@ import { - SchemaResponse, - ObjectType, - FunctionInfo, - ProcedureInfo, - QueryRequest, - QueryResponse, - MutationRequest, - MutationResponse, - Capabilities, - ExplainResponse, - Connector, - Forbidden, + SchemaResponse, + ObjectType, + FunctionInfo, + ProcedureInfo, + QueryRequest, + QueryResponse, + MutationRequest, + MutationResponse, + Capabilities, + ExplainResponse, + Connector, + Forbidden, } from "@hasura/ndc-sdk-typescript"; -import { JSONValue } from '@hasura/ndc-lambda-sdk'; +import { JSONValue } from "@hasura/ndc-lambda-sdk"; -import path from "node:path" -import { FunctionsSchema, getNdcSchema, printRelaxedTypesWarning } from "./lambda-sdk/schema"; +import path from "node:path"; +import { + FunctionsSchema, + getNdcSchema, + printRelaxedTypesWarning, +} from "./lambda-sdk/schema"; // import { FunctionsSchema, getNdcSchema, printRelaxedTypesWarning } from '@hasura/ndc-lambda-sdk/schema'; -import { deriveSchema, printCompilerDiagnostics, printFunctionIssues } from "./lambda-sdk/inference"; +import { + deriveSchema, + printCompilerDiagnostics, + printFunctionIssues, +} from "./lambda-sdk/inference"; // import { deriveSchema, printCompilerDiagnostics, printFunctionIssues } from '@hasura/ndc-lambda-sdk/inference'; -import { RuntimeFunctions, executeMutation, executeQuery } from "./lambda-sdk/execution"; +import { + RuntimeFunctions, + executeMutation, + executeQuery, +} from "./lambda-sdk/execution"; // import { RuntimeFunctions, executeMutation, executeQuery } from '@hasura/ndc-lambda-sdk/execution'; import { CAPABILITIES_RESPONSE, DUCKDB_CONFIG } from "./constants"; @@ -29,9 +41,9 @@ import { do_query } from "./handlers/query"; import { do_mutation } from "./handlers/mutation"; import { readFileSync } from "fs"; import * as duckdb from "duckdb"; -import { generateConfig } from "../generate-config"; +import { generateConfig } from "./generate-config"; -const DUCKDB_URL = 'duck.db'; // process.env["DUCKDB_URL"] as string || "duck.db"; +const DUCKDB_URL = "duck.db"; // process.env["DUCKDB_URL"] as string || "duck.db"; export const db = new duckdb.Database(DUCKDB_URL); export type DuckDBConfigurationSchema = { @@ -47,9 +59,9 @@ type CredentialSchema = { }; export type Configuration = { - duckdbConfig: DuckDBConfigurationSchema - functionsSchema: FunctionsSchema - runtimeFunctions: RuntimeFunctions + duckdbConfig: DuckDBConfigurationSchema; + functionsSchema: FunctionsSchema; + runtimeFunctions: RuntimeFunctions; }; export interface State { @@ -58,30 +70,29 @@ export interface State { async function createDuckDBFile(schema: string): Promise { return new Promise((resolve, reject) => { - db.run(schema, (err) => { if (err) { - console.error('Error creating schema:', err); + console.error("Error creating schema:", err); reject(err); } else { - console.log('Schema created successfully'); + console.log("Schema created successfully"); resolve(); } }); - }); } export interface duckduckapi { - dbSchema: string - functionsFilePath: string + dbSchema: string; + functionsFilePath: string; } -export async function makeConnector(dda: duckduckapi): Promise> { - +export async function makeConnector( + dda: duckduckapi +): Promise> { /** * Create the db and load the DB path as a global variable - */ + */ await createDuckDBFile(dda.dbSchema); const connector: Connector = { @@ -91,8 +102,9 @@ export async function makeConnector(dda: duckduckapi): Promise { - + parseConfiguration: async function ( + configurationDir: string + ): Promise { // Load DuckDB configuration by instrospecting DuckDB const duckdbConfig = await generateConfig(db); @@ -113,16 +125,18 @@ export async function makeConnector(dda: duckduckapi): Promise { + getSchema: async function ( + configuration: Configuration + ): Promise { return Promise.resolve(do_get_schema(configuration)); }, @@ -279,11 +295,17 @@ export async function makeConnector(dda: duckduckapi): Promise { + switch (t) { + case "BIGINT": + return "Int"; + case "BIT": + return "String"; + case "BOOLEAN": + return "Boolean"; + case "BLOB": + return "String"; + case "DATE": + return "String"; + case "DOUBLE": + return "Float"; + case "HUGEINT": + return "String"; + case "INTEGER": + return "Int"; + case "INTERVAL": + return "String"; + case "REAL": + return "Float"; + case "FLOAT": + return "Float"; + case "SMALLINT": + return "Int"; + case "TIME": + return "String"; + case "TIMESTAMP": + return "String"; + case "TIMESTAMP WITH TIME ZONE": + return "String"; + case "TINYINT": + return "Int"; + case "UBIGINT": + return "String"; + case "UINTEGER": + return "Int"; + case "USMALLINT": + return "Int"; + case "UTINYINT": + return "Int"; + case "UUID": + return "String"; + case "VARCHAR": + return "String"; + case "HUGEINT": + return "String"; + case "JSON": + return "JSON"; + default: + if (t.startsWith("DECIMAL")) { + return "Float"; + } + console.log(t); + throw new NotSupported("Unsupported type", {}); + } +}; + +async function queryAll(con: any, query: any): Promise { + return new Promise((resolve, reject) => { + con.all(query, function (err: any, res: any) { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); +} + +export async function generateConfig( + db: duckdb.Database +): Promise { + const tableNames: string[] = []; + const tableAliases: { [k: string]: string } = {}; + const objectTypes: { [k: string]: ObjectType } = {}; + const tables = await queryAll(db.connect(), "SHOW ALL TABLES"); + for (let table of tables) { + const tableName = table.name; // `${table.database}_${table.schema}_${table.name}`; + const aliasName = `${table.database}.${table.schema}.${table.name}`; + tableNames.push(tableName); + tableAliases[tableName] = aliasName; + if (!objectTypes[tableName]) { + objectTypes[tableName] = { + fields: {}, + }; + } + for (let i = 0; i < table.column_names.length; i++) { + objectTypes[tableName]["fields"][table.column_names[i]] = { + type: { + type: "named", + name: determineType(table.column_types[i]), + }, + }; + } + } + const res: DuckDBConfigurationSchema = { + collection_names: tableNames, + collection_aliases: tableAliases, + object_types: objectTypes, + functions: [], + procedures: [], + }; + return Promise.resolve(res); +} diff --git a/src/google-calendar-sync.ts b/ndc-duckduckapi/src/google-calendar-sync.ts similarity index 100% rename from src/google-calendar-sync.ts rename to ndc-duckduckapi/src/google-calendar-sync.ts diff --git a/src/handlers/explain.ts b/ndc-duckduckapi/src/handlers/explain.ts similarity index 100% rename from src/handlers/explain.ts rename to ndc-duckduckapi/src/handlers/explain.ts diff --git a/src/handlers/mutation.ts b/ndc-duckduckapi/src/handlers/mutation.ts similarity index 100% rename from src/handlers/mutation.ts rename to ndc-duckduckapi/src/handlers/mutation.ts diff --git a/src/handlers/query.ts b/ndc-duckduckapi/src/handlers/query.ts similarity index 100% rename from src/handlers/query.ts rename to ndc-duckduckapi/src/handlers/query.ts diff --git a/src/handlers/schema.ts b/ndc-duckduckapi/src/handlers/schema.ts similarity index 100% rename from src/handlers/schema.ts rename to ndc-duckduckapi/src/handlers/schema.ts diff --git a/src/index.ts b/ndc-duckduckapi/src/index.ts similarity index 100% rename from src/index.ts rename to ndc-duckduckapi/src/index.ts diff --git a/src/lambda-sdk/cmdline.ts b/ndc-duckduckapi/src/lambda-sdk/cmdline.ts similarity index 61% rename from src/lambda-sdk/cmdline.ts rename to ndc-duckduckapi/src/lambda-sdk/cmdline.ts index 0f274f6..a1fe4a5 100644 --- a/src/lambda-sdk/cmdline.ts +++ b/ndc-duckduckapi/src/lambda-sdk/cmdline.ts @@ -1,26 +1,27 @@ -import { Command, Option } from "commander" -import { version } from "../package.json" +import { Command, Option } from "commander"; +import { version } from "../../package.json"; import * as sdk from "@hasura/ndc-sdk-typescript"; export type HostOptions = { - functions: string - watch: boolean -} + functions: string; + watch: boolean; +}; export interface CommandActions { - serveAction(hostOpts: HostOptions, serverOpts: sdk.ServerOptions): Promise | void + serveAction( + hostOpts: HostOptions, + serverOpts: sdk.ServerOptions + ): Promise | void; } export function makeCommand(commandActions: CommandActions): Command { - const program = new Command() - .name("ndc-lambda-sdk") - .version(version); + const program = new Command().name("ndc-lambda-sdk").version(version); const serveCommand = sdk.getServeCommand(); serveCommand.action((serverOptions: sdk.ServerOptions, command: Command) => { const hostOpts: HostOptions = hostCommand.opts(); return commandActions.serveAction(hostOpts, serverOptions); - }) + }); const hostCommand = program .command("host") @@ -29,7 +30,10 @@ export function makeCommand(commandActions: CommandActions): Command { .default(false) .env("WATCH") ) - .requiredOption("-f, --functions ", "path to your TypeScript functions file") + .requiredOption( + "-f, --functions ", + "path to your TypeScript functions file" + ) .addCommand(serveCommand); return program; diff --git a/src/lambda-sdk/connector.ts b/ndc-duckduckapi/src/lambda-sdk/connector.ts similarity index 100% rename from src/lambda-sdk/connector.ts rename to ndc-duckduckapi/src/lambda-sdk/connector.ts diff --git a/src/lambda-sdk/execution.ts b/ndc-duckduckapi/src/lambda-sdk/execution.ts similarity index 100% rename from src/lambda-sdk/execution.ts rename to ndc-duckduckapi/src/lambda-sdk/execution.ts diff --git a/src/lambda-sdk/host.ts b/ndc-duckduckapi/src/lambda-sdk/host.ts similarity index 100% rename from src/lambda-sdk/host.ts rename to ndc-duckduckapi/src/lambda-sdk/host.ts diff --git a/src/lambda-sdk/inference.ts b/ndc-duckduckapi/src/lambda-sdk/inference.ts similarity index 100% rename from src/lambda-sdk/inference.ts rename to ndc-duckduckapi/src/lambda-sdk/inference.ts diff --git a/src/lambda-sdk/result.ts b/ndc-duckduckapi/src/lambda-sdk/result.ts similarity index 100% rename from src/lambda-sdk/result.ts rename to ndc-duckduckapi/src/lambda-sdk/result.ts diff --git a/src/lambda-sdk/schema.ts b/ndc-duckduckapi/src/lambda-sdk/schema.ts similarity index 100% rename from src/lambda-sdk/schema.ts rename to ndc-duckduckapi/src/lambda-sdk/schema.ts diff --git a/src/lambda-sdk/sdk.ts b/ndc-duckduckapi/src/lambda-sdk/sdk.ts similarity index 100% rename from src/lambda-sdk/sdk.ts rename to ndc-duckduckapi/src/lambda-sdk/sdk.ts diff --git a/src/lambda-sdk/util.ts b/ndc-duckduckapi/src/lambda-sdk/util.ts similarity index 100% rename from src/lambda-sdk/util.ts rename to ndc-duckduckapi/src/lambda-sdk/util.ts diff --git a/src/stub.getstarted.ts b/ndc-duckduckapi/src/stub.getstarted.ts similarity index 100% rename from src/stub.getstarted.ts rename to ndc-duckduckapi/src/stub.getstarted.ts diff --git a/tsconfig.json b/ndc-duckduckapi/tsconfig.json similarity index 100% rename from tsconfig.json rename to ndc-duckduckapi/tsconfig.json