Graphcool / graphcool-framework

Apache License 2.0
1.78k stars 130 forks source link

Could not create serverless function for 'loggedInUser' - ONLY with --dry-run #480

Open marktani opened 6 years ago

marktani commented 6 years ago

@vincenzo commented on Thu Nov 09 2017

For bug reports, please fill in the next sections:

Current behavior

Running gc deploy -t local --dry-run will yield an error on the loggedInUser function (as per template, unchanged).

Debug output

$ gc deploy -t local --dry-run
  config CWD /vagrant/data/IELTSRO +0ms
  config HOME /home/vagrant +3ms
  config definitionDir /vagrant/data/IELTSRO +2ms
  config definitionPath /vagrant/data/IELTSRO/graphcool.yml +0ms
  config homepath /home/vagrant/.graphcoolrc +0ms
  config localRCPath /vagrant/data/IELTSRO/.graphcoolrc +0ms
  config globalRCPath /home/vagrant/.graphcoolrc +0ms
  cli command id deploy +0ms
  cli:plugincache Got plugin from cache +0ms
  cli:plugincache /home/vagrant/.cache/graphcool/plugins.json +0ms
  cli:plugincache Got plugin from cache +1ms
  cli:plugincache /home/vagrant/.cache/graphcool/plugins.json +0ms
  plugins findCommand graphcool-cli-core +0ms
  plugin requiring command +0ms
  cli-engine:plugins:manager requiring /home/vagrant/.nvm/versions/node/v8.2.0/lib/node_modules/graphcool/node_modules/graphcool-cli-core +0ms
  cli-engine:plugins:manager required +327ms
  plugin required command +331ms
  deploy run +0ms
Getting diff for cj9r952d8000j014991vnmbew with target local....  client 
  client 
  client Sending service definition: +0ms
  client {
  client   "modules": [
  client     {
  client       "name": "",
  client       "content": "types: ./types.graphql\nfunctions:\n  signup:\n    type: resolver\n    schema: src/email-password/signup.graphql\n    handler:\n      code: src/email-password/signup.ts\n  authenticate:\n    type: resolver\n    schema: src/email-password/authenticate.graphql\n    handler:\n      code: src/email-password/authenticate.ts\n  loggedInUser:\n    type: resolver\n    schema: src/email-password/loggedInUser.graphql\n    handler:\n      code: src/email-password/loggedInUser.ts\npermissions:\n  - operation: File.read\n  - operation: File.create\n  - operation: File.update\n  - operation: File.delete\n  - operation: Ielts.create\n    authenticated: true\n    query: './src/permissions/Ielts.graphql:create'\n  - operation: Ielts.update\n  - operation: Ielts.delete\n  - operation: Ielts.read\n  - operation: User.read\n  - operation: User.create\n  - operation: User.update\n  - operation: User.delete\nrootTokens: []\n",
  client       "files": {
  client         "./types.graphql": "type File @model {\n  contentType: String!\n  createdAt: DateTime!\n  dsadsa: Float!\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  name: String!\n  secret: String! @isUnique\n  size: Int!\n  updatedAt: DateTime!\n  url: String! @isUnique\n}\n\ntype Ielts @model {\n  city: String!\n  country: String!\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  minAcademic: Float\n  minBandScore: Float!\n  minGeneral: Float\n  organisation: String!\n  state: String!\n  website: String!\n}\n\nenum Role {\n  EDITOR,\n  CONTRIBUTOR\n}\n\ntype User @model {\n  createdAt: DateTime! # read-only (managed by Graphcool)\n  email: String @isUnique\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  name: String! @isUnique\n  password: String\n  roles: [Role!]\n  updatedAt: DateTime! # read-only (managed by Graphcool)\n}",
  client         "./src/permissions/Ielts.graphql": "query create {\n  SomeUserExists(filter: {\n    id: $user_id\n    roles_in: [EDITOR, CONTRIBUTOR]\n  })\n}",
  client         "src/email-password/signup.ts": "import { fromEvent, FunctionEvent } from 'graphcool-lib'\nimport { GraphQLClient } from 'graphql-request'\nimport * as bcrypt from 'bcryptjs'\nimport * as validator from 'validator'\n\ninterface User {\n  id: string\n}\n\ninterface EventData {\n  email: string\n  name: string\n  password: string\n}\n\nconst SALT_ROUNDS = 10\n\nexport default async (event: FunctionEvent<EventData>) => {\n  console.log(event)\n\n  try {\n    const graphcool = fromEvent(event)\n    const api = graphcool.api('simple/v1')\n\n    const { email, password, name } = event.data\n\n    if (!validator.isEmail(email)) {\n      return { error: 'Not a valid email' }\n    }\n\n    // check if user exists already\n    const userExists: boolean = await getUser(api, email)\n      .then(r => r.User !== null)\n    if (userExists) {\n      return { error: 'Email already in use' }\n    }\n\n    // create password hash\n    const salt = bcrypt.genSaltSync(SALT_ROUNDS)\n    const hash = await bcrypt.hash(password, SALT_ROUNDS)\n\n    // create new user\n    const userId = await createGraphcoolUser(api, email, name, hash)\n\n    // generate node token for new User node\n    const token = await graphcool.generateNodeToken(userId, 'User')\n\n    return { data: { id: userId, token } }\n  } catch (e) {\n    console.log(e)\n    return { error: 'An unexpected error occured during signup.' }\n  }\n}\n\nasync function getUser(api: GraphQLClient, email: string): Promise<{ User }> {\n  const query = `\n    query getUser($email: String!) {\n      User(email: $email) {\n        id\n      }\n    }\n  `\n\n  const variables = {\n    email,\n  }\n\n  return api.request<{ User }>(query, variables)\n}\n\nasync function createGraphcoolUser(api: GraphQLClient, email: string, name: string, password: string): Promise<string> {\n  const mutation = `\n    mutation createGraphcoolUser($email: String!, $password: String!, $name: String!) {\n      createUser(\n        email: $email\n        name: $name\n        password: $password\n      ) {\n        id\n      }\n    }\n  `\n\n  const variables = {\n    email,\n    name,\n    password: password\n  }\n\n  return api.request<{ createUser: User }>(mutation, variables)\n    .then(r => r.createUser.id)\n}\n",
  client         "src/email-password/signup.graphql": "type SignupUserPayload {\n  id: ID!\n  token: String!\n}\n\nextend type Mutation {\n  signupUser(email: String!, password: String!, name: String!): SignupUserPayload\n}",
  client         "src/email-password/authenticate.ts": "import { fromEvent, FunctionEvent } from 'graphcool-lib'\nimport { GraphQLClient } from 'graphql-request'\nimport * as bcrypt from 'bcryptjs'\n\ninterface User {\n  id: string\n  password: string\n}\n\ninterface EventData {\n  email: string\n  password: string\n}\n\nconst SALT_ROUNDS = 10\n\nexport default async (event: FunctionEvent<EventData>) => {\n  console.log(event)\n\n  try {\n    const graphcool = fromEvent(event)\n    const api = graphcool.api('simple/v1')\n\n    const { email, password } = event.data\n\n    // get user by email\n    const user: User = await getUserByEmail(api, email)\n      .then(r => r.User)\n\n    // no user with this email\n    if (!user) {\n      return { error: 'Invalid credentials!' }\n    }\n\n    // check password\n    const passwordIsCorrect = await bcrypt.compare(password, user.password)\n    if (!passwordIsCorrect) {\n      return { error: 'Invalid credentials!' }\n    }\n\n    // generate node token for existing User node\n    const token = await graphcool.generateNodeToken(user.id, 'User')\n\n    return { data: { id: user.id, token} }\n  } catch (e) {\n    console.log(e)\n    return { error: 'An unexpected error occured during authentication.' }\n  }\n}\n\nasync function getUserByEmail(api: GraphQLClient, email: string): Promise<{ User }> {\n  const query = `\n    query getUserByEmail($email: String!) {\n      User(email: $email) {\n        id\n        password\n      }\n    }\n  `\n\n  const variables = {\n    email,\n  }\n\n  return api.request<{ User }>(query, variables)\n}\n",
  client         "src/email-password/authenticate.graphql": "type AuthenticateUserPayload {\n  id: ID!\n  token: String!\n}\n\nextend type Mutation {\n  authenticateUser(email: String!, password: String!): AuthenticateUserPayload\n}\n",
  client         "src/email-password/loggedInUser.ts": "import { fromEvent, FunctionEvent } from 'graphcool-lib'\nimport { GraphQLClient } from 'graphql-request'\n\ninterface User {\n  id: string\n}\n\nexport default async (event: FunctionEvent<{}>) => {\n  console.log(event)\n\n  try {\n    // no logged in user\n    if (!event.context.auth || !event.context.auth.nodeId) {\n      return { data: null }\n    }\n\n    const userId = event.context.auth.nodeId\n    const graphcool = fromEvent(event)\n    const api = graphcool.api('simple/v1')\n\n    // get user by id\n    const user: User = await getUser(api, userId)\n      .then(r => r.User)\n\n    // no logged in user\n    if (!user || !user.id) {\n      return { data: null }\n    }\n\n    return { data: { id: user.id } }\n  } catch (e) {\n    console.log(e)\n    return { error: 'An unexpected error occured during authentication.' }\n  }\n}\n\nasync function getUser(api: GraphQLClient, id: string): Promise<{ User }> {\n  const query = `\n    query getUser($id: ID!) {\n      User(id: $id) {\n        id\n      }\n    }\n  `\n\n  const variables = {\n    id,\n  }\n\n  return api.request<{ User }>(query, variables)\n}",
  client         "src/email-password/loggedInUser.graphql": "type LoggedInUserPayload {\n  id: ID!\n}\n\nextend type Query {\n  # return user data if request contains valid authentication token\n  loggedInUser: LoggedInUserPayload\n}\n"
  client       }
  client     }
  client   ]
  client } +16ms
  client choosing clusterEndpoint http://localhost:60000/system +4ms
  client Sending query +1ms
  client       mutation($projectId: String!, $force: Boolean, $isDryRun: Boolean!, $config: String!) {
  client         push(input: {
  client           projectId: $projectId
  client           force: $force
  client           isDryRun: $isDryRun
  client           config: $config
  client           version: 1
  client         }) {
  client           migrationMessages {
  client             type
  client             action
  client             name
  client             description
  client             subDescriptions {
  client               type
  client               action
  client               name
  client               description
  client             }
  client           }
  client           errors {
  client             description
  client             type
  client             field
  client           }
  client           project {
  client             id
  client             name
  client             alias
  client             projectDefinitionWithFileContent
  client           }
  client         }
  client       }
  client      +0ms
  client { projectId: 'cj9r952d8000j014991vnmbew',
  client   force: false,
  client   isDryRun: true,
  client   config: '{"modules":[{"name":"","content":"types: ./types.graphql\\nfunctions:\\n  signup:\\n    type: resolver\\n    schema: src/email-password/signup.graphql\\n    handler:\\n      code: src/email-password/signup.ts\\n  authenticate:\\n    type: resolver\\n    schema: src/email-password/authenticate.graphql\\n    handler:\\n      code: src/email-password/authenticate.ts\\n  loggedInUser:\\n    type: resolver\\n    schema: src/email-password/loggedInUser.graphql\\n    handler:\\n      code: src/email-password/loggedInUser.ts\\npermissions:\\n  - operation: File.read\\n  - operation: File.create\\n  - operation: File.update\\n  - operation: File.delete\\n  - operation: Ielts.create\\n    authenticated: true\\n    query: \'./src/permissions/Ielts.graphql:create\'\\n  - operation: Ielts.update\\n  - operation: Ielts.delete\\n  - operation: Ielts.read\\n  - operation: User.read\\n  - operation: User.create\\n  - operation: User.update\\n  - operation: User.delete\\nrootTokens: []\\n","files":{"./types.graphql":"type File @model {\\n  contentType: String!\\n  createdAt: DateTime!\\n  dsadsa: Float!\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  name: String!\\n  secret: String! @isUnique\\n  size: Int!\\n  updatedAt: DateTime!\\n  url: String! @isUnique\\n}\\n\\ntype Ielts @model {\\n  city: String!\\n  country: String!\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  minAcademic: Float\\n  minBandScore: Float!\\n  minGeneral: Float\\n  organisation: String!\\n  state: String!\\n  website: String!\\n}\\n\\nenum Role {\\n  EDITOR,\\n  CONTRIBUTOR\\n}\\n\\ntype User @model {\\n  createdAt: DateTime! # read-only (managed by Graphcool)\\n  email: String @isUnique\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  name: String! @isUnique\\n  password: String\\n  roles: [Role!]\\n  updatedAt: DateTime! # read-only (managed by Graphcool)\\n}","./src/permissions/Ielts.graphql":"query create {\\n  SomeUserExists(filter: {\\n    id: $user_id\\n    roles_in: [EDITOR, CONTRIBUTOR]\\n  })\\n}","src/email-password/signup.ts":"import { fromEvent, FunctionEvent } from \'graphcool-lib\'\\nimport { GraphQLClient } from \'graphql-request\'\\nimport * as bcrypt from \'bcryptjs\'\\nimport * as validator from \'validator\'\\n\\ninterface User {\\n  id: string\\n}\\n\\ninterface EventData {\\n  email: string\\n  name: string\\n  password: string\\n}\\n\\nconst SALT_ROUNDS = 10\\n\\nexport default async (event: FunctionEvent<EventData>) => {\\n  console.log(event)\\n\\n  try {\\n    const graphcool = fromEvent(event)\\n    const api = graphcool.api(\'simple/v1\')\\n\\n    const { email, password, name } = event.data\\n\\n    if (!validator.isEmail(email)) {\\n      return { error: \'Not a valid email\' }\\n    }\\n\\n    // check if user exists already\\n    const userExists: boolean = await getUser(api, email)\\n      .then(r => r.User !== null)\\n    if (userExists) {\\n      return { error: \'Email already in use\' }\\n    }\\n\\n    // create password hash\\n    const salt = bcrypt.genSaltSync(SALT_ROUNDS)\\n    const hash = await bcrypt.hash(password, SALT_ROUNDS)\\n\\n    // create new user\\n    const userId = await createGraphcoolUser(api, email, name, hash)\\n\\n    // generate node token for new User node\\n    const token = await graphcool.generateNodeToken(userId, \'User\')\\n\\n    return { data: { id: userId, token } }\\n  } catch (e) {\\n    console.log(e)\\n    return { error: \'An unexpected error occured during signup.\' }\\n  }\\n}\\n\\nasync function getUser(api: GraphQLClient, email: string): Promise<{ User }> {\\n  const query = `\\n    query getUser($email: String!) {\\n      User(email: $email) {\\n        id\\n      }\\n    }\\n  `\\n\\n  const variables = {\\n    email,\\n  }\\n\\n  return api.request<{ User }>(query, variables)\\n}\\n\\nasync function createGraphcoolUser(api: GraphQLClient, email: string, name: string, password: string): Promise<string> {\\n  const mutation = `\\n    mutation createGraphcoolUser($email: String!, $password: String!, $name: String!) {\\n      createUser(\\n        email: $email\\n        name: $name\\n        password: $password\\n      ) {\\n        id\\n      }\\n    }\\n  `\\n\\n  const variables = {\\n    email,\\n    name,\\n    password: password\\n  }\\n\\n  return api.request<{ createUser: User }>(mutation, variables)\\n    .then(r => r.createUser.id)\\n}\\n","src/email-password/signup.graphql":"type SignupUserPayload {\\n  id: ID!\\n  token: String!\\n}\\n\\nextend type Mutation {\\n  signupUser(email: String!, password: String!, name: String!): SignupUserPayload\\n}","src/email-password/authenticate.ts":"import { fromEvent, FunctionEvent } from \'graphcool-lib\'\\nimport { GraphQLClient } from \'graphql-request\'\\nimport * as bcrypt from \'bcryptjs\'\\n\\ninterface User {\\n  id: string\\n  password: string\\n}\\n\\ninterface EventData {\\n  email: string\\n  password: string\\n}\\n\\nconst SALT_ROUNDS = 10\\n\\nexport default async (event: FunctionEvent<EventData>) => {\\n  console.log(event)\\n\\n  try {\\n    const graphcool = fromEvent(event)\\n    const api = graphcool.api(\'simple/v1\')\\n\\n    const { email, password } = event.data\\n\\n    // get user by email\\n    const user: User = await getUserByEmail(api, email)\\n      .then(r => r.User)\\n\\n    // no user with this email\\n    if (!user) {\\n      return { error: \'Invalid credentials!\' }\\n    }\\n\\n    // check password\\n    const passwordIsCorrect = await bcrypt.compare(password, user.password)\\n    if (!passwordIsCorrect) {\\n      return { error: \'Invalid credentials!\' }\\n    }\\n\\n    // generate node token for existing User node\\n    const token = await graphcool.generateNodeToken(user.id, \'User\')\\n\\n    return { data: { id: user.id, token} }\\n  } catch (e) {\\n    console.log(e)\\n    return { error: \'An unexpected error occured during authentication.\' }\\n  }\\n}\\n\\nasync function getUserByEmail(api: GraphQLClient, email: string): Promise<{ User }> {\\n  const query = `\\n    query getUserByEmail($email: String!) {\\n      User(email: $email) {\\n        id\\n        password\\n      }\\n    }\\n  `\\n\\n  const variables = {\\n    email,\\n  }\\n\\n  return api.request<{ User }>(query, variables)\\n}\\n","src/email-password/authenticate.graphql":"type AuthenticateUserPayload {\\n  id: ID!\\n  token: String!\\n}\\n\\nextend type Mutation {\\n  authenticateUser(email: String!, password: String!): AuthenticateUserPayload\\n}\\n","src/email-password/loggedInUser.ts":"import { fromEvent, FunctionEvent } from \'graphcool-lib\'\\nimport { GraphQLClient } from \'graphql-request\'\\n\\ninterface User {\\n  id: string\\n}\\n\\nexport default async (event: FunctionEvent<{}>) => {\\n  console.log(event)\\n\\n  try {\\n    // no logged in user\\n    if (!event.context.auth || !event.context.auth.nodeId) {\\n      return { data: null }\\n    }\\n\\n    const userId = event.context.auth.nodeId\\n    const graphcool = fromEvent(event)\\n    const api = graphcool.api(\'simple/v1\')\\n\\n    // get user by id\\n    const user: User = await getUser(api, userId)\\n      .then(r => r.User)\\n\\n    // no logged in user\\n    if (!user || !user.id) {\\n      return { data: null }\\n    }\\n\\n    return { data: { id: user.id } }\\n  } catch (e) {\\n    console.log(e)\\n    return { error: \'An unexpected error occured during authentication.\' }\\n  }\\n}\\n\\nasync function getUser(api: GraphQLClient, id: string): Promise<{ User }> {\\n  const query = `\\n    query getUser($id: ID!) {\\n      User(id: $id) {\\n        id\\n      }\\n    }\\n  `\\n\\n  const variables = {\\n    id,\\n  }\\n\\n  return api.request<{ User }>(query, variables)\\n}","src/email-password/loggedInUser.graphql":"type LoggedInUserPayload {\\n  id: ID!\\n}\\n\\nextend type Query {\\n  # return user data if request contains valid authentication token\\n  loggedInUser: LoggedInUserPayload\\n}\\n"}}]}' } +1ms
  client undefined +307ms
 ✔
There are issues with the new service definition:

  Global
    ✖ Could not create serverless function for 'loggedInUser'. Ensure that the code is valid

Not the same when running a normal deployment gc deploy -t local

$ gc deploy -t local
  config CWD /vagrant/data/IELTSRO +0ms
  config HOME /home/vagrant +2ms
  config definitionDir /vagrant/data/IELTSRO +2ms
  config definitionPath /vagrant/data/IELTSRO/graphcool.yml +0ms
  config homepath /home/vagrant/.graphcoolrc +1ms
  config localRCPath /vagrant/data/IELTSRO/.graphcoolrc +0ms
  config globalRCPath /home/vagrant/.graphcoolrc +0ms
  cli command id deploy +0ms
  cli:plugincache Got plugin from cache +0ms
  cli:plugincache /home/vagrant/.cache/graphcool/plugins.json +0ms
  cli:plugincache Got plugin from cache +2ms
  cli:plugincache /home/vagrant/.cache/graphcool/plugins.json +0ms
  plugins findCommand graphcool-cli-core +0ms
  plugin requiring command +0ms
  cli-engine:plugins:manager requiring /home/vagrant/.nvm/versions/node/v8.2.0/lib/node_modules/graphcool/node_modules/graphcool-cli-core +0ms
  cli-engine:plugins:manager required +349ms
  plugin required command +352ms
  deploy run +0ms
  client choosing clusterEndpoint http://localhost:60000/system +0ms
  client Sending query +1ms
  client 
  client       query ($projectId: ID!){
  client         viewer {
  client           project(id: $projectId) {
  client             ...RemoteProject
  client           }
  client         }
  client       }
  client       
  client   fragment RemoteProject on Project {
  client     id
  client     name
  client     schema
  client     alias
  client     region
  client     isEjected
  client     projectDefinitionWithFileContent
  client   }
  client 
  client        +0ms
  client { projectId: 'cj9r952d8000j014991vnmbew' } +0ms
  deploy bundling +119ms
  bundler /vagrant/data/IELTSRO/.build/build.zip +1ms
Bundling functions...  bundler added files [ '.envrc',
  '.git/',
  '.graphcoolrc',
  'README.md',
  'node_modules/',
  'graphcool.yml',
  'package-lock.json',
  'package.json',
  'src/',
  'types.graphql',
  '.git/COMMIT_EDITMSG',
  '.git/FETCH_HEAD',
  '.git/ORIG_HEAD',
  '.git/HEAD',
  '.git/branches/',
  '.git/description',
  '.git/config',
  '.git/hooks/',
  '.git/index',
  '.git/logs/',
  '.git/info/',
  '.git/refs/',
  '.git/objects/',
  '.build/build.zip',
  '.build/dist/',
  'node_modules/.bin/',
  'node_modules/apollo-fetch/',
  'node_modules/@types/',
  'node_modules/apollo-link/',
  'node_modules/apollo-utilities/',
  'node_modules/apollo-link-http/',
  'node_modules/deprecated-decorator/',
  'node_modules/cross-fetch/',
  'node_modules/encoding/',
  'node_modules/graphcool-lib/',
  'node_modules/graphql/',
  'node_modules/graphql-tools/',
  'node_modules/graphql-request/',
  'node_modules/bcryptjs/',
  'node_modules/iconv-lite/',
  'node_modules/iterall/',
  'node_modules/is-stream/',
  'node_modules/package-lock.json',
  'node_modules/isomorphic-fetch/',
  'node_modules/node-fetch/',
  'node_modules/uuid/',
  'node_modules/source-map/',
  'node_modules/zen-observable-ts/',
  'node_modules/validator/',
  'node_modules/whatwg-fetch/',
  'node_modules/source-map-support/',
  'src/permissions/',
  'src/email-password/',
  '.git/hooks/commit-msg.sample',
  '.git/hooks/applypatch-msg.sample',
  '.git/hooks/post-update.sample',
  '.git/hooks/pre-applypatch.sample',
  '.git/hooks/pre-push.sample',
  '.git/hooks/pre-rebase.sample',
  '.git/hooks/prepare-commit-msg.sample',
  '.git/hooks/pre-commit.sample',
  '.git/hooks/update.sample',
  '.git/info/exclude',
  '.git/objects/00/',
  '.git/objects/01/',
  '.git/objects/02/',
  '.git/objects/03/',
  '.git/objects/06/',
  '.git/objects/04/',
  '.git/objects/05/',
  '.git/objects/08/',
  '.git/objects/07/',
  '.git/objects/0a/',
  '.git/objects/0b/',
  '.git/objects/09/',
  '.git/objects/0e/',
  '.git/objects/0f/',
  '.git/objects/0d/',
  '.git/objects/10/',
  '.git/objects/13/',
  '.git/objects/11/',
  '.git/objects/12/',
  '.git/objects/0c/',
  '.git/objects/14/',
  '.git/objects/16/',
  '.git/objects/19/',
  '.git/objects/17/',
  '.git/objects/1a/',
  '.git/objects/1b/',
  '.git/objects/15/',
  '.git/objects/1e/',
  '.git/objects/1d/',
  '.git/objects/1c/',
  '.git/objects/1f/',
  '.git/objects/20/',
  '.git/objects/21/',
  '.git/objects/24/',
  '.git/objects/22/',
  '.git/objects/25/',
  '.git/objects/26/',
  ... 1932 more items ] +2s
  ts-builder starting compile [ '/vagrant/data/IELTSRO/src/email-password/signup.ts',
  '/vagrant/data/IELTSRO/src/email-password/authenticate.ts',
  '/vagrant/data/IELTSRO/src/email-password/loggedInUser.ts' ] +3ms
  ts-builder created program +501ms
  ts-builder emitted +500ms
  bundler converted files [ '/vagrant/data/IELTSRO/src/email-password/signup.ts',
  '/vagrant/data/IELTSRO/src/email-password/authenticate.ts',
  '/vagrant/data/IELTSRO/src/email-password/loggedInUser.ts' ] +1ms
  bundler createdFiles [ '/vagrant/data/IELTSRO/.build/dist/src/email-password/signup.js',
  '/vagrant/data/IELTSRO/.build/dist/src/email-password/authenticate.js',
  '/vagrant/data/IELTSRO/.build/dist/src/email-password/loggedInUser.js' ] +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/ src/ +84ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/ src/email-password/ +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/authenticate-lambda.js src/email-password/authenticate-lambda.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/authenticate-dev.js src/email-password/authenticate-dev.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/authenticate.js src/email-password/authenticate.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/byline.js src/email-password/byline.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/loggedInUser-lambda.js src/email-password/loggedInUser-lambda.js +1ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/loggedInUser-dev.js src/email-password/loggedInUser-dev.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/loggedInUser.js src/email-password/loggedInUser.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/signup-dev.js src/email-password/signup-dev.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/signup-lambda.js src/email-password/signup-lambda.js +0ms
  bundler adding /vagrant/data/IELTSRO/.build/dist/src/email-password/signup.js src/email-password/signup.js +0ms
  bundler added build files [ 'src/',
  'src/email-password/',
  'src/email-password/authenticate-lambda.js',
  'src/email-password/authenticate-dev.js',
  'src/email-password/authenticate.js',
  'src/email-password/byline.js',
  'src/email-password/loggedInUser-lambda.js',
  'src/email-password/loggedInUser-dev.js',
  'src/email-password/loggedInUser.js',
  'src/email-password/signup-dev.js',
  'src/email-password/signup-lambda.js',
  'src/email-password/signup.js' ] +0ms
  client choosing clusterEndpoint http://localhost:60000/system +8s
  client Sending query +0ms
  client 
  client       mutation getUrl($projectId: String!) {
  client         getTemporaryDeployUrl(
  client           input: {
  client           projectId: $projectId
  client         }
  client       ) {
  client           url
  client         }
  client       }
  client      +0ms
  client { projectId: 'cj9r952d8000j014991vnmbew' } +0ms
  bundler uploading to http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0 +5s
  bundler {
  bundler   "success" : true
  bundler } +478ms
  bundler bundled 8181 +0ms
 8.2s
  deploy bundled +1ms
Deploying to local with target local locally...  client 
  client 
  client Sending service definition: +603ms
  client {
  client   "modules": [
  client     {
  client       "name": "",
  client       "content": "types: ./types.graphql\nfunctions:\n  signup:\n    type: resolver\n    schema: src/email-password/signup.graphql\n    handler:\n      code: src/email-password/signup.ts\n  authenticate:\n    type: resolver\n    schema: src/email-password/authenticate.graphql\n    handler:\n      code: src/email-password/authenticate.ts\n  loggedInUser:\n    type: resolver\n    schema: src/email-password/loggedInUser.graphql\n    handler:\n      code: src/email-password/loggedInUser.ts\npermissions:\n  - operation: File.read\n  - operation: File.create\n  - operation: File.update\n  - operation: File.delete\n  - operation: Ielts.create\n    authenticated: true\n    query: './src/permissions/Ielts.graphql:create'\n  - operation: Ielts.update\n  - operation: Ielts.delete\n  - operation: Ielts.read\n  - operation: User.read\n  - operation: User.create\n  - operation: User.update\n  - operation: User.delete\nrootTokens: []\n",
  client       "files": {
  client         "./types.graphql": "type File @model {\n  contentType: String!\n  createdAt: DateTime!\n  dsadsa: Float!\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  name: String!\n  secret: String! @isUnique\n  size: Int!\n  updatedAt: DateTime!\n  url: String! @isUnique\n}\n\ntype Ielts @model {\n  city: String!\n  country: String!\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  minAcademic: Float\n  minBandScore: Float!\n  minGeneral: Float\n  organisation: String!\n  state: String!\n  website: String!\n}\n\nenum Role {\n  EDITOR,\n  CONTRIBUTOR\n}\n\ntype User @model {\n  createdAt: DateTime! # read-only (managed by Graphcool)\n  email: String @isUnique\n  id: ID! @isUnique # read-only (managed by Graphcool)\n  name: String! @isUnique\n  password: String\n  roles: [Role!]\n  updatedAt: DateTime! # read-only (managed by Graphcool)\n}",
  client         "./src/permissions/Ielts.graphql": "query create {\n  SomeUserExists(filter: {\n    id: $user_id\n    roles_in: [EDITOR, CONTRIBUTOR]\n  })\n}",
  client         "src/email-password/signup.graphql": "type SignupUserPayload {\n  id: ID!\n  token: String!\n}\n\nextend type Mutation {\n  signupUser(email: String!, password: String!, name: String!): SignupUserPayload\n}",
  client         "src/email-password/authenticate.graphql": "type AuthenticateUserPayload {\n  id: ID!\n  token: String!\n}\n\nextend type Mutation {\n  authenticateUser(email: String!, password: String!): AuthenticateUserPayload\n}\n",
  client         "src/email-password/loggedInUser.graphql": "type LoggedInUserPayload {\n  id: ID!\n}\n\nextend type Query {\n  # return user data if request contains valid authentication token\n  loggedInUser: LoggedInUserPayload\n}\n"
  client       },
  client       "externalFiles": {
  client         "src/email-password/signup.ts": {
  client           "url": "http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0",
  client           "lambdaHandler": "src/email-password/signup-lambda.handle",
  client           "devHandler": "src/email-password/signup-dev.js"
  client         },
  client         "src/email-password/authenticate.ts": {
  client           "url": "http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0",
  client           "lambdaHandler": "src/email-password/authenticate-lambda.handle",
  client           "devHandler": "src/email-password/authenticate-dev.js"
  client         },
  client         "src/email-password/loggedInUser.ts": {
  client           "url": "http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0",
  client           "lambdaHandler": "src/email-password/loggedInUser-lambda.handle",
  client           "devHandler": "src/email-password/loggedInUser-dev.js"
  client         }
  client       }
  client     }
  client   ]
  client } +9ms
  client choosing clusterEndpoint http://localhost:60000/system +1ms
  client Sending query +1ms
  client       mutation($projectId: String!, $force: Boolean, $isDryRun: Boolean!, $config: String!) {
  client         push(input: {
  client           projectId: $projectId
  client           force: $force
  client           isDryRun: $isDryRun
  client           config: $config
  client           version: 1
  client         }) {
  client           migrationMessages {
  client             type
  client             action
  client             name
  client             description
  client             subDescriptions {
  client               type
  client               action
  client               name
  client               description
  client             }
  client           }
  client           errors {
  client             description
  client             type
  client             field
  client           }
  client           project {
  client             id
  client             name
  client             alias
  client             projectDefinitionWithFileContent
  client           }
  client         }
  client       }
  client      +0ms
  client { projectId: 'cj9r952d8000j014991vnmbew',
  client   force: undefined,
  client   isDryRun: false,
  client   config: '{"modules":[{"name":"","content":"types: ./types.graphql\\nfunctions:\\n  signup:\\n    type: resolver\\n    schema: src/email-password/signup.graphql\\n    handler:\\n      code: src/email-password/signup.ts\\n  authenticate:\\n    type: resolver\\n    schema: src/email-password/authenticate.graphql\\n    handler:\\n      code: src/email-password/authenticate.ts\\n  loggedInUser:\\n    type: resolver\\n    schema: src/email-password/loggedInUser.graphql\\n    handler:\\n      code: src/email-password/loggedInUser.ts\\npermissions:\\n  - operation: File.read\\n  - operation: File.create\\n  - operation: File.update\\n  - operation: File.delete\\n  - operation: Ielts.create\\n    authenticated: true\\n    query: \'./src/permissions/Ielts.graphql:create\'\\n  - operation: Ielts.update\\n  - operation: Ielts.delete\\n  - operation: Ielts.read\\n  - operation: User.read\\n  - operation: User.create\\n  - operation: User.update\\n  - operation: User.delete\\nrootTokens: []\\n","files":{"./types.graphql":"type File @model {\\n  contentType: String!\\n  createdAt: DateTime!\\n  dsadsa: Float!\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  name: String!\\n  secret: String! @isUnique\\n  size: Int!\\n  updatedAt: DateTime!\\n  url: String! @isUnique\\n}\\n\\ntype Ielts @model {\\n  city: String!\\n  country: String!\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  minAcademic: Float\\n  minBandScore: Float!\\n  minGeneral: Float\\n  organisation: String!\\n  state: String!\\n  website: String!\\n}\\n\\nenum Role {\\n  EDITOR,\\n  CONTRIBUTOR\\n}\\n\\ntype User @model {\\n  createdAt: DateTime! # read-only (managed by Graphcool)\\n  email: String @isUnique\\n  id: ID! @isUnique # read-only (managed by Graphcool)\\n  name: String! @isUnique\\n  password: String\\n  roles: [Role!]\\n  updatedAt: DateTime! # read-only (managed by Graphcool)\\n}","./src/permissions/Ielts.graphql":"query create {\\n  SomeUserExists(filter: {\\n    id: $user_id\\n    roles_in: [EDITOR, CONTRIBUTOR]\\n  })\\n}","src/email-password/signup.graphql":"type SignupUserPayload {\\n  id: ID!\\n  token: String!\\n}\\n\\nextend type Mutation {\\n  signupUser(email: String!, password: String!, name: String!): SignupUserPayload\\n}","src/email-password/authenticate.graphql":"type AuthenticateUserPayload {\\n  id: ID!\\n  token: String!\\n}\\n\\nextend type Mutation {\\n  authenticateUser(email: String!, password: String!): AuthenticateUserPayload\\n}\\n","src/email-password/loggedInUser.graphql":"type LoggedInUserPayload {\\n  id: ID!\\n}\\n\\nextend type Query {\\n  # return user data if request contains valid authentication token\\n  loggedInUser: LoggedInUserPayload\\n}\\n"},"externalFiles":{"src/email-password/signup.ts":{"url":"http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0","lambdaHandler":"src/email-password/signup-lambda.handle","devHandler":"src/email-password/signup-dev.js"},"src/email-password/authenticate.ts":{"url":"http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0","lambdaHandler":"src/email-password/authenticate-lambda.handle","devHandler":"src/email-password/authenticate-dev.js"},"src/email-password/loggedInUser.ts":{"url":"http://localhost:60050/functions/files/cj9r952d8000j014991vnmbew/cj9siie7p00c80187a5mfpdz0","lambdaHandler":"src/email-password/loggedInUser-lambda.handle","devHandler":"src/email-password/loggedInUser-dev.js"}}}]}' } +0ms
  client undefined +776ms
 792ms
Success! Here is what changed:

Resolver Functions

  loggedInUser
   * A resolver function with the name `loggedInUser` is updated.
  authenticate
   * A resolver function with the name `authenticate` is updated.
  signup
   * A resolver function with the name `signup` is updated.

Here are your GraphQL Endpoints:

  Simple API:        http://localhost:60000/simple/v1/cj9r952d8000j014991vnmbew
  Relay API:         http://localhost:60000/relay/v1/cj9r952d8000j014991vnmbew
  Subscriptions API: ws://localhost:60000/subscriptions/v1/cj9r952d8000j014991vnmbew

Expected behavior?

The --dry-run option should behave the same as the actual deployment.


@freder commented on Fri Mar 02 2018

same here

jesstelford commented 6 years ago

I'm seeing this behaviour on v0.11.6.

It's especially frustrating as I'm told:

Your migration includes potentially destructive changes. Review using graphcool deploy --dry-run and continue using graphcool deploy --force.

But when I use --dry-run, it gives me the 'invalid code' error. So I have no idea what actually changed / what will be the destructive changes?

What's perplexing is; I haven't changed that file/query/function, but have changed others, so I'm not sure why it's complaining about the loggedInUser function (which is direct from the facebook auth template).