Best JavaScript code snippet using redwood
options.test.js
Source:options.test.js
...16 string_only.forEach((k) => {17 test(`${k} - only string`, () => {18 const re = reOptionError(k);19 expect(() => {20 prepareOptions({ [k]: null });21 }).toThrow(re);22 expect(() => {23 prepareOptions({ [k]: false });24 }).toThrow(re);25 expect(() => {26 prepareOptions({ [k]: true });27 }).toThrow(re);28 expect(() => {29 prepareOptions({ [k]: 1 });30 }).toThrow(re);31 expect(() => {32 prepareOptions({ [k]: '' });33 }).not.toThrow(re);34 expect(() => {35 prepareOptions({ [k]: [] });36 }).toThrow(re);37 expect(() => {38 prepareOptions({ [k]: {} });39 }).toThrow(re);40 });41 });42 // Boolean only43 const bool_only = [44 'writeFiles',45 'returnPOT',46 'domainFromPOTPath',47 'domainInPOPath',48 'defaultContextAsFallback',49 'appendNonIncludedFromPO',50 'includePORevisionDate',51 'includeGenerator',52 'logResults',53 ];54 bool_only.forEach((k) => {55 test(`${k} - only boolean`, () => {56 const re = reOptionError(k);57 expect(() => {58 prepareOptions({ [k]: null });59 }).toThrow(re);60 expect(() => {61 prepareOptions({ [k]: false });62 }).not.toThrow(re);63 expect(() => {64 prepareOptions({ [k]: true });65 }).not.toThrow(re);66 expect(() => {67 prepareOptions({ [k]: 1 });68 }).toThrow(re);69 expect(() => {70 prepareOptions({ [k]: '' });71 }).toThrow(re);72 expect(() => {73 prepareOptions({ [k]: [] });74 }).toThrow(re);75 expect(() => {76 prepareOptions({ [k]: {} });77 }).toThrow(re);78 });79 });80 // Number only81 const number_only = ['wrapLength'];82 number_only.forEach((k) => {83 test(`${k} - only number`, () => {84 const re = reOptionError(k);85 expect(() => {86 prepareOptions({ [k]: null });87 }).toThrow(re);88 expect(() => {89 prepareOptions({ [k]: false });90 }).toThrow(re);91 expect(() => {92 prepareOptions({ [k]: true });93 }).toThrow(re);94 expect(() => {95 prepareOptions({ [k]: 1 });96 }).not.toThrow(re);97 expect(() => {98 prepareOptions({ [k]: '' });99 }).toThrow(re);100 expect(() => {101 prepareOptions({ [k]: [] });102 }).toThrow(re);103 expect(() => {104 prepareOptions({ [k]: {} });105 }).toThrow(re);106 });107 });108 test('potSources - only string, Vinyl or array of those', () => {109 const k = 'potSources';110 const re = reOptionError(k);111 expect(() => {112 prepareOptions({ [k]: null });113 }).toThrow(re);114 expect(() => {115 prepareOptions({ [k]: false });116 }).toThrow(re);117 expect(() => {118 prepareOptions({ [k]: true });119 }).toThrow(re);120 expect(() => {121 prepareOptions({ [k]: 1 });122 }).toThrow(re);123 expect(() => {124 prepareOptions({ [k]: '' });125 }).not.toThrow(re);126 expect(() => {127 prepareOptions({ [k]: [] });128 }).not.toThrow(re);129 expect(() => {130 prepareOptions({ [k]: {} });131 }).toThrow(re);132 expect(() => {133 prepareOptions({ [k]: vinyl_file });134 }).not.toThrow(re);135 expect(() => {136 prepareOptions({ [k]: [vinyl_file] });137 }).not.toThrow(re);138 });139 test('options - only absent, object, glob string or glob array', () => {140 const re = /Options should be an object/;141 expect(() => {142 prepareOptions();143 }).not.toThrow(re);144 expect(() => {145 prepareOptions(undefined);146 }).not.toThrow(re);147 expect(() => {148 prepareOptions(null);149 }).toThrow(re);150 expect(() => {151 prepareOptions(false);152 }).toThrow(re);153 expect(() => {154 prepareOptions(true);155 }).toThrow(re);156 expect(() => {157 prepareOptions(1);158 }).toThrow(re);159 expect(() => {160 prepareOptions('**/*.po');161 }).not.toThrow(re);162 expect(() => {163 prepareOptions([]);164 }).not.toThrow(re);165 expect(() => {166 prepareOptions({});167 }).not.toThrow(re);168 expect(() => {169 prepareOptions([1]);170 }).toThrow(re);171 expect(() => {172 prepareOptions([true]);173 }).toThrow(re);174 expect(() => {175 prepareOptions(['**/*.po']);176 }).not.toThrow(re);177 expect(() => {178 prepareOptions([[]]);179 }).toThrow(re);180 expect(() => {181 prepareOptions([{}]);182 }).toThrow(re);183 });184 test('poSources - if truthy, only string or array of strings', () => {185 const re = reOptionError('poSources');186 expect(() => {187 prepareOptions({ potSources: potSource, poSources: null });188 }).not.toThrow(re);189 expect(() => {190 prepareOptions({ potSources: potSource, poSources: false });191 }).not.toThrow(re);192 expect(() => {193 prepareOptions({ potSources: potSource, poSources: true });194 }).toThrow(re);195 expect(() => {196 prepareOptions({ potSources: potSource, poSources: 1 });197 }).toThrow(re);198 expect(() => {199 prepareOptions({ potSources: potSource, poSources: '**/*.po' });200 }).not.toThrow(re);201 expect(() => {202 prepareOptions({ potSources: potSource, poSources: ['**/*.po'] });203 }).not.toThrow(re);204 expect(() => {205 prepareOptions({ potSources: potSource, poSources: {} });206 }).toThrow(re);207 expect(() => {208 prepareOptions({ potSources: potSource, poSources: [1] });209 }).toThrow(re);210 expect(() => {211 prepareOptions({ potSources: potSource, poSources: [true] });212 }).toThrow(re);213 expect(() => {214 prepareOptions({ potSources: potSource, poSources: [[]] });215 }).toThrow(re);216 expect(() => {217 prepareOptions({ potSources: potSource, poSources: [{}] });218 }).toThrow(re);219 });220 test('writeFiles - default overwrite for gulp plugin', () => {221 expect(prepareOptions({ potSources: '**/*.pot' }, false)).toHaveProperty(222 'writeFiles',223 false224 );225 });226 test('srcDir - no newlines', () => {227 expect(() => {228 prepareOptions({ srcDir: 'some\npath' });229 }).toThrow(reOptionError('srcDir'));230 });231 test('destDir - no newlines', () => {232 expect(() => {233 prepareOptions({ destDir: 'some\npath' });234 }).toThrow(reOptionError('destDir'));235 });236 test('wrapLength - only positive integer', () => {237 const re = reOptionError('wrapLength');238 expect(() => {239 prepareOptions({ wrapLength: -1 });240 }).toThrow(re);241 expect(() => {242 prepareOptions({ wrapLength: 0 });243 }).toThrow(re);244 });245});246describe('options.js - clean & standardize', () => {247 test('potSources - is array of only non-empty strings or Vinyl objects', () => {248 // wraps in array249 expect(prepareOptions({ potSources: '**/*.pot' })).toHaveProperty(250 'potSources',251 ['**/*.pot']252 );253 expect(prepareOptions({ potSources: vinyl_file })).toHaveProperty(254 'potSources',255 [vinyl_file]256 );257 // trims strings and removes empty strings258 const all = ['first', ' ', 'second', '', ' \t third\t '];259 const expected = ['first', 'second', 'third'];260 expect(prepareOptions({ potSources: all })).toHaveProperty(261 'potSources',262 expected263 );264 });265 test('poSources - is array of only non-empty strings', () => {266 // wrap string267 expect(268 prepareOptions({ potSources: potSource, poSources: '**/*.po' })269 ).toHaveProperty('poSources', ['**/*.po']);270 // filter non-strings and (trimmed) empty strings271 const all = ['first', ' ', 'second', '', ' \t third\t '];272 const expected = ['first', 'second', 'third'];273 expect(274 prepareOptions({ potSources: potSource, poSources: all })275 ).toHaveProperty('poSources', expected);276 });277 const directories = ['srcDir', 'destDir'];278 directories.forEach((k) => {279 test(`${k} - trimmed whitespace`, () => {280 expect(prepareOptions({ [k]: ' ' })).toHaveProperty(k, '');281 expect(prepareOptions({ [k]: ' some ' })).toHaveProperty(k, 'some/');282 });283 test(`${k} - only forward slashes`, () => {284 expect(prepareOptions({ [k]: 'some\\' })).toHaveProperty(k, 'some/');285 expect(prepareOptions({ [k]: 'some\\path\\' })).toHaveProperty(286 k,287 'some/path/'288 );289 });290 test(`${k} - only single slashes`, () => {291 expect(prepareOptions({ [k]: 'some\\' })).toHaveProperty(k, 'some/');292 expect(prepareOptions({ [k]: 'some\\\\' })).toHaveProperty(k, 'some/');293 expect(prepareOptions({ [k]: 'some\\/\\/' })).toHaveProperty(k, 'some/');294 expect(prepareOptions({ [k]: 'some\\//\\\\' })).toHaveProperty(295 k,296 'some/'297 );298 });299 test(`${k} - without current directory parts`, () => {300 expect(prepareOptions({ [k]: './some/' })).toHaveProperty(k, 'some/');301 expect(prepareOptions({ [k]: 'some/././.\\path' })).toHaveProperty(302 k,303 'some/path/'304 );305 expect(prepareOptions({ [k]: './../some/.\\path' })).toHaveProperty(306 k,307 '../some/path/'308 );309 });310 test(`${k} - trailing slash`, () => {311 expect(prepareOptions({ [k]: 'some' })).toHaveProperty(k, 'some/');312 expect(prepareOptions({ [k]: 'some/' })).toHaveProperty(k, 'some/');313 expect(prepareOptions({ [k]: 'some/path' })).toHaveProperty(314 k,315 'some/path/'316 );317 });318 test(`${k} - resolve to minimal path`, () => {319 // basic320 expect(prepareOptions({ [k]: 'some/../path' })).toHaveProperty(321 k,322 'path/'323 );324 // nested325 expect(prepareOptions({ [k]: 'some/other/../../path' })).toHaveProperty(326 k,327 'path/'328 );329 // concurrent330 expect(prepareOptions({ [k]: 'some/other/../path/../' })).toHaveProperty(331 k,332 'some/'333 );334 // nested and concurrent335 expect(336 prepareOptions({ [k]: 'some/other/../path/../../' })337 ).toHaveProperty(k, '');338 // leave non-solvables339 expect(prepareOptions({ [k]: './../some/../path' })).toHaveProperty(340 k,341 '../path/'342 );343 // empty if result would be '/'344 expect(prepareOptions({ [k]: ' ./\\//.\\/.\\ ' })).toHaveProperty(k, '');345 // combination346 expect(prepareOptions({ [k]: ' ./some\\other/.\\path ' })).toHaveProperty(347 k,348 'some/other/path/'349 );350 });351 });352 test('wrapLength - ceiled integer', () => {353 expect(prepareOptions({ wrapLength: 0.001 })).toHaveProperty(354 'wrapLength',355 1356 );357 expect(prepareOptions({ wrapLength: 1.2 })).toHaveProperty('wrapLength', 2);358 });359});360describe('options.js - logic', () => {361 test('provide domain if domainInPOPath and not domainFromPOTPath', () => {362 const re = new RegExp('domain should be a non-empty string');363 expect(() => {364 prepareOptions({ domainFromPOTPath: false });365 }).toThrow(re);366 expect(() => {367 prepareOptions({ domainFromPOTPath: false, domain: '' });368 }).toThrow(re);369 expect(() => {370 prepareOptions({ domainFromPOTPath: false, domain: 'some' });371 }).not.toThrow(re);372 expect(() => {373 prepareOptions({ domainFromPOTPath: false, domainInPOPath: true });374 }).toThrow(re);375 expect(() => {376 prepareOptions({ domainFromPOTPath: false, domainInPOPath: false });377 }).not.toThrow(re);378 });379 test('writeFiles must be true if returnPOT is false', () => {380 const re = new RegExp(381 'If option returnPOT is true, option writeFiles must be true'382 );383 expect(() => {384 prepareOptions({ returnPOT: true, writeFiles: false });385 }).toThrow(re);386 expect(() => {387 prepareOptions({ returnPOT: true, writeFiles: true });388 }).not.toThrow(re);389 expect(() => {390 prepareOptions({ returnPOT: false, writeFiles: false });391 }).not.toThrow(re);392 expect(() => {393 prepareOptions({ returnPOT: false, writeFiles: true });394 }).not.toThrow(re);395 });...
attachment.ts
Source:attachment.ts
1import { AbstractBlobStream } from './blob';2import { AbstractClient } from './client';3import { AbstractResultSet } from './resultset';4import { AbstractStatement } from './statement';5import { AbstractTransaction } from './transaction';6import { AbstractEvents } from './events';7import {8 Attachment,9 Blob,10 ExecuteOptions,11 ExecuteQueryOptions,12 Events,13 FetchOptions,14 PrepareOptions,15 TransactionOptions16} from '..';17/** AbstractAttachment implementation. */18export abstract class AbstractAttachment implements Attachment {19 events = new Set<Events>();20 statements = new Set<AbstractStatement>();21 transactions = new Set<AbstractTransaction>();22 /** Default transaction options. */23 defaultTransactionOptions: TransactionOptions;24 /** Default query's prepare options. */25 defaultPrepareOptions: PrepareOptions;26 /** Default query's execute options. */27 defaultExecuteOptions: ExecuteOptions;28 /** Default query's executeQuery options. */29 defaultExecuteQueryOptions: ExecuteQueryOptions;30 /** Default result set's fetch options. */31 defaultFetchOptions: FetchOptions;32 protected constructor(public client?: AbstractClient) {33 }34 /** Disconnects this attachment. */35 async disconnect(): Promise<void> {36 this.check();37 await this.preDispose();38 await this.internalDisconnect();39 await this.postDispose();40 }41 /** Drops the database and release this attachment. */42 async dropDatabase(): Promise<void> {43 this.check();44 await this.preDispose();45 await this.internalDropDatabase();46 await this.postDispose();47 }48 /** Executes a statement that uses the SET TRANSACTION command. Returns the new transaction. */49 async executeTransaction(transaction: AbstractTransaction, sqlStmt: string,50 options?: {51 prepareOptions?: PrepareOptions52 }): Promise<AbstractTransaction> {53 this.check();54 const statement = await this.prepare(transaction, sqlStmt, options && options.prepareOptions);55 try {56 const newTransaction = await statement.executeTransaction(transaction);57 this.transactions.add(newTransaction);58 return newTransaction;59 }60 finally {61 await statement.dispose();62 }63 }64 /** Executes a statement that has no result set. */65 async execute(transaction: AbstractTransaction, sqlStmt: string, parameters?: any[],66 options?: {67 prepareOptions?: PrepareOptions,68 executeOptions?: ExecuteOptions69 }): Promise<void> {70 this.check();71 const statement = await this.prepare(transaction, sqlStmt, options && options.prepareOptions);72 try {73 return await statement.execute(transaction, parameters, options && options.executeOptions);74 }75 finally {76 await statement.dispose();77 }78 }79 /** Executes a statement that returns a single record. */80 async executeSingleton(transaction: AbstractTransaction, sqlStmt: string, parameters?: Array<any>,81 options?: {82 prepareOptions?: PrepareOptions,83 executeOptions?: ExecuteOptions84 }): Promise<Array<any>> {85 this.check();86 const statement = await this.prepare(transaction, sqlStmt, options && options.prepareOptions);87 try {88 return await statement.executeSingleton(transaction, parameters, options && options.executeOptions);89 }90 finally {91 await statement.dispose();92 }93 }94 /** Executes a statement that returns a single record in object form. */95 async executeSingletonAsObject<T extends object>(transaction: AbstractTransaction, sqlStmt: string, parameters?: any[],96 options?: {97 prepareOptions?: PrepareOptions,98 executeOptions?: ExecuteOptions99 }): Promise<T> {100 this.check();101 const statement = await this.prepare(transaction, sqlStmt, options && options.prepareOptions);102 try {103 return await statement.executeSingletonAsObject(transaction, parameters, options && options.executeOptions);104 }105 finally {106 await statement.dispose();107 }108 }109 /** Executes a statement that returns a single record. */110 async executeReturning(transaction: AbstractTransaction, sqlStmt: string, parameters?: Array<any>,111 options?: {112 prepareOptions?: PrepareOptions,113 executeOptions?: ExecuteOptions114 }): Promise<Array<any>> {115 return await this.executeSingleton(transaction, sqlStmt, parameters, options);116 }117 /** Executes a statement that returns a single record in object form. */118 async executeReturningAsObject<T extends object>(transaction: AbstractTransaction, sqlStmt: string, parameters?: any[],119 options?: {120 prepareOptions?: PrepareOptions,121 executeOptions?: ExecuteOptions122 }): Promise<T> {123 return await this.executeSingletonAsObject<T>(transaction, sqlStmt, parameters, options);124 }125 /** Executes a statement that has result set. */126 async executeQuery(transaction: AbstractTransaction, sqlStmt: string, parameters?: any[],127 options?: {128 prepareOptions?: PrepareOptions,129 executeOptions?: ExecuteQueryOptions130 }): Promise<AbstractResultSet> {131 this.check();132 const statement = await this.prepare(transaction, sqlStmt, options && options.prepareOptions);133 try {134 const resultSet = await statement.executeQuery(transaction, parameters, options && options.executeOptions);135 resultSet.diposeStatementOnClose = true;136 return resultSet;137 }138 catch (e) {139 await statement.dispose();140 throw e;141 }142 }143 async queueEvents(names: string[], callBack: (counters: [string, number][]) => Promise<void>): Promise<Events> {144 this.check();145 const trimmedNames = names.map(name => {146 const trimmedName = name.trimRight();147 if (Buffer.from(trimmedName).byteLength > 255)148 throw new Error(`Invalid event name: ${name}.`);149 return trimmedName;150 });151 const events = await this.internalQueueEvents(trimmedNames, callBack);152 this.events.add(events);153 return events;154 }155 async createBlob(transaction: AbstractTransaction): Promise<AbstractBlobStream> {156 return await this.internalCreateBlob(transaction);157 }158 async openBlob(transaction: AbstractTransaction, blob: Blob): Promise<AbstractBlobStream> {159 return await this.internalOpenBlob(transaction, blob);160 }161 /** Starts a new transaction. */162 async startTransaction(options?: TransactionOptions): Promise<AbstractTransaction> {163 this.check();164 const transaction = await this.internalStartTransaction(165 options || this.defaultTransactionOptions || this.client!.defaultTransactionOptions);166 this.transactions.add(transaction);167 return transaction;168 }169 /** Prepares a query. */170 async prepare(transaction: AbstractTransaction, sqlStmt: string, options?: PrepareOptions): Promise<AbstractStatement> {171 this.check();172 const statement = await this.internalPrepare(transaction, sqlStmt,173 options || this.defaultPrepareOptions || this.client!.defaultPrepareOptions);174 this.statements.add(statement);175 return statement;176 }177 get isValid(): boolean {178 return !!this.client;179 }180 private check() {181 if (!this.isValid)182 throw new Error('Attachment is already disconnected.');183 }184 private async preDispose() {185 try {186 await Promise.all(Array.from(this.events).map(events => events.cancel()));187 await Promise.all(Array.from(this.statements).map(statement => statement.dispose()));188 await Promise.all(Array.from(this.transactions).map(transaction => transaction.rollback()));189 }190 finally {191 this.events.clear();192 this.statements.clear();193 this.transactions.clear();194 }195 }196 private async postDispose() {197 this.client!.attachments.delete(this);198 this.client = undefined;199 }200 protected abstract internalDisconnect(): Promise<void>;201 protected abstract internalDropDatabase(): Promise<void>;202 protected abstract internalCreateBlob(transaction: AbstractTransaction): Promise<AbstractBlobStream>;203 protected abstract internalOpenBlob(transaction: AbstractTransaction, blob: Blob): Promise<AbstractBlobStream>;204 protected abstract internalPrepare(transaction: AbstractTransaction, sqlStmt: string, options?: PrepareOptions):205 Promise<AbstractStatement>;206 protected abstract internalStartTransaction(options?: TransactionOptions): Promise<AbstractTransaction>;207 protected abstract internalQueueEvents(names: string[], callBack: (counters: [string, number][]) => Promise<void>):208 Promise<AbstractEvents>;...
sheet.ts
Source:sheet.ts
...10 .sort((first, second) => first.item.level - second.item.level);11 return {12 ...data,13 items,14 rarities: this.prepareOptions(CONFIG.PF2E.rarityTraits, { value: [itemData.data.traits.rarity.value] }),15 skills: CONFIG.PF2E.skills,16 proficiencyChoices: CONFIG.PF2E.proficiencyLevels,17 selectedKeyAbility: this.getLocalizedAbilities(itemData.data.keyAbility),18 ancestryTraits: this.prepareOptions(CONFIG.PF2E.ancestryItemTraits, itemData.data.traits),19 trainedSkills: this.prepareOptions(CONFIG.PF2E.skills, itemData.data.trainedSkills),20 ancestryFeatLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.ancestryFeatLevels),21 classFeatLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.classFeatLevels),22 generalFeatLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.generalFeatLevels),23 skillFeatLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.skillFeatLevels),24 skillIncreaseLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.skillIncreaseLevels),25 abilityBoostLevels: this.prepareOptions(CONFIG.PF2E.levels, itemData.data.abilityBoostLevels),26 };27 }...
Using AI Code Generation
1import { prepareOptions } from '@redwoodjs/api'2export const handler = async (event, context) => {3 const options = prepareOptions(event, context)4 return {5 body: JSON.stringify({6 }),7 }8}9export const handler = async (event, context) => {10 return {11 body: JSON.stringify({12 }),13 }14}15export default prepareHandler(handler)16import { prepareContext } from '@redwoodjs/api'17export const handler = async (event, context) => {18 const context = prepareContext(event, context)19 return {20 body: JSON.stringify({21 }),22 }23}24import { getUserId } from '@redwoodjs/api'25export const handler = async (event, context) => {26 const userId = getUserId(context)27 return {28 body: JSON.stringify({29 }),30 }31}32import { requireAuth } from '@redwoodjs/api'33export const handler = async (event, context) => {34 requireAuth({ context })35 return {36 body: JSON.stringify({
Using AI Code Generation
1import { db } from 'src/lib/db'2import { requireAuth } from 'src/lib/auth'3import { logger } from 'src/lib/logger'4export const beforeResolver = (rules) => {5 rules.add(requireAuth)6 rules.skip((_parent, _args, context) => {
Using AI Code Generation
1import { prepareOptions } from '@redwoodjs/api'2export const handler = async (event, context) => {3 const options = prepareOptions(event, context, {4 })5 return new Response('Hello world', options)6}7We welcome contributions from the community! Please read our [Contributing Guide](
Using AI Code Generation
1const redwood = require('@redwoodjs/api')2const options = redwood.prepareOptions({3 db: {4 },5})6const context = redwood.prepareContext({7 context: {8 db: redwood.getDbDriver(options),9 },10})11const db = redwood.db(context)12const result = await db.query('SELECT * FROM users')13console.log(result)14Please see our [contributing guidelines](
Using AI Code Generation
1const prepareOptions = require('@redwoodjs/api/dist/functions/prepareOptions').default2let options = {3 headers: { 'Content-Type': 'application/json' },4}5const preparedOptions = prepareOptions(options)6console.log(preparedOptions)7const prepareRequest = require('@redwoodjs/api/dist/functions/prepareRequest').default8console.log(request)9const prepareResponse = require('@redwoodjs/api/dist/functions/prepareResponse').default10const response = prepareResponse(request, {11 headers: {12 },13})14console.log(response)
Using AI Code Generation
1var redwood = require('redwood');2var options = redwood.prepareOptions({3});4var redwood = require('redwood');5var options = redwood.prepareOptions({6});7* [API](docs/api.md)8* [Examples](docs/examples.md)9* [FAQ](docs/faq.md)10* [Release Notes](docs/release-notes.md)11[MIT](LICENSE)
Using AI Code Generation
1const { prepareOptions } = require('@redwoodjs/internal/dist/webpack')2module.exports = (webpackConfig, options) => {3 const { dev, target } = options4 const redwoodOptions = prepareOptions({ target, dev })5}6const { getPaths } = require('@redwoodjs/internal/dist/paths')7const paths = getPaths('/path/to/base')8const { getConfig } = require('@redwoodjs/internal/dist/config')9const config = getConfig('/path/to/base')10const { getWebPaths } = require('@redwoodjs/internal/dist/paths')11const webPaths = getWebPaths('/path/to/base')12const { getApiPaths } = require('@redwoodjs/internal/dist/paths')13const apiPaths = getApiPaths('/path/to/base')
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!