diff --git a/examples/content/markdown/authors/tony.md b/examples/content/markdown/authors/tony.md index 416dd8b..d96c098 100644 --- a/examples/content/markdown/authors/tony.md +++ b/examples/content/markdown/authors/tony.md @@ -10,9 +10,10 @@ friend: 40s3 image: tony.svg date_joined: 2021-02-25T16:41:59.558Z skills: - sitting: 204 + sitting: 69 breathing: 7.07 - liquid_consumption: 100 + liquid_consumption: 420 existence: simulation sports: -2 --- + diff --git a/examples/nextjs/flatbread.config.ts b/examples/nextjs/flatbread.config.ts index 1d1aa89..d2ae978 100644 --- a/examples/nextjs/flatbread.config.ts +++ b/examples/nextjs/flatbread.config.ts @@ -19,21 +19,21 @@ export default defineConfig({ content: [ { path: 'content/markdown/posts', - collection: 'Post', + name: 'Post', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/[category]/[slug].md', - collection: 'PostCategory', + name: 'PostCategory', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/**/*.md', - collection: 'PostCategoryBlob', + name: 'PostCategoryBlob', refs: { authors: 'Author', }, diff --git a/examples/sveltekit/flatbread.config.js b/examples/sveltekit/flatbread.config.js index 39c65f2..e1af1d4 100644 --- a/examples/sveltekit/flatbread.config.js +++ b/examples/sveltekit/flatbread.config.js @@ -16,31 +16,41 @@ const transformerConfig = { export default defineConfig({ source: sourceFilesystem(), transformer: [transformerMarkdown(transformerConfig), transformerYaml()], + + collectionResolvers: [ + function fakeResolver(schemaComposer, args) { + const { name } = args; + + schemaComposer.Query.addFields({ + [`fake${name}`]: { + type: 'String', + description: `fake resolver`, + resolve() { + return `fake ${name}!`; + }, + }, + }); + }, + ], + content: [ { path: 'content/markdown/posts', - collection: 'Post', + name: 'Post', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/[category]/[slug].md', - collection: 'PostCategory', - refs: { - authors: 'Author', - }, - }, - { - path: 'content/markdown/posts/**/*.md', - collection: 'PostCategoryBlob', + name: 'PostCategory', refs: { authors: 'Author', }, }, { path: 'content/markdown/authors', - collection: 'Author', + name: 'Author', refs: { friend: 'Author', }, @@ -48,26 +58,24 @@ export default defineConfig({ createSvImgField('image', { inputDir: 'static/authorImages', outputDir: 'static/g', - srcGenerator: (path) => '/g/' + path, + srcGenerator: (path) => 'http://localhost:5174/g/' + path, }), ], }, { path: 'content/yaml/authors', - collection: 'YamlAuthor', + name: 'YamlAuthor', refs: { friend: 'YamlAuthor', }, }, { path: 'content/markdown/deeply-nested', - collection: 'OverrideTest', + name: 'OverrideTest', overrides: [ { field: 'deeply.nested', type: 'String', - test: undefined, - test2: null, resolve: (source) => String(source).toUpperCase(), }, { diff --git a/examples/sveltekit/src/routes/index.svelte b/examples/sveltekit/src/routes/index.svelte index 67cd7ec..14ba30f 100644 --- a/examples/sveltekit/src/routes/index.svelte +++ b/examples/sveltekit/src/routes/index.svelte @@ -3,9 +3,13 @@ const query = ` query PostCategory { allPostCategories (sortBy: "title", order: DESC) { - _collection - _filename - _slug + _metadata { + sourceContext { + filename + slug + } + collection + } id title category @@ -18,7 +22,11 @@ timeToRead } authors { - _slug + _metadata { + sourceContext { + slug + } + } id name entity @@ -99,9 +107,7 @@
-
+    
       
         {JSON.stringify(data, null, 2)}
       
diff --git a/packages/core/package.json b/packages/core/package.json
index b49d91f..446e7d9 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -35,6 +35,7 @@
     "lodash-es": "4.17.21",
     "lru-cache": "7.13.2",
     "matcher": "5.0.0",
+    "nanoid": "4.0.0",
     "plur": "5.1.0"
   },
   "devDependencies": {
diff --git a/packages/core/src/cache/cache.ts b/packages/core/src/cache/cache.ts
index 6d40d38..fe8fc54 100644
--- a/packages/core/src/cache/cache.ts
+++ b/packages/core/src/cache/cache.ts
@@ -1,8 +1,7 @@
 import { GraphQLSchema } from 'graphql';
 import LRU from 'lru-cache';
-import { createHash } from 'node:crypto';
 import { LoadedFlatbreadConfig } from '../types';
-import { anyToString } from '../utils/stringUtils';
+import createShaHash from '../utils/createShaHash';
 
 type SchemaCacheKey = string;
 
@@ -29,7 +28,7 @@ export function cacheSchema(
   config: LoadedFlatbreadConfig,
   schema: GraphQLSchema
 ) {
-  const schemaHashKey = getSchemaHash(config);
+  const schemaHashKey = createShaHash(config);
   cache.schema.set(schemaHashKey, schema);
 }
 
@@ -39,13 +38,6 @@ export function cacheSchema(
 export function checkCacheForSchema(
   config: LoadedFlatbreadConfig
 ): GraphQLSchema | undefined {
-  const schemaHashKey = getSchemaHash(config);
+  const schemaHashKey = createShaHash(config);
   return cache.schema.get(schemaHashKey);
 }
-
-/**
- * Generates a hash key for a given Flatbread config.
- */
-export function getSchemaHash(config: LoadedFlatbreadConfig) {
-  return createHash('md5').update(anyToString(config)).digest('hex');
-}
diff --git a/packages/core/src/generators/collectionMutations.ts b/packages/core/src/generators/collectionMutations.ts
new file mode 100644
index 0000000..f66dab2
--- /dev/null
+++ b/packages/core/src/generators/collectionMutations.ts
@@ -0,0 +1,105 @@
+import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
+import { get, merge } from 'lodash-es';
+import { CollectionContext, CollectionResolverArgs, EntryNode } from '../types';
+
+export default function addCollectionMutations(
+  schemaComposer: SchemaComposer,
+  args: CollectionResolverArgs
+) {
+  const { name, objectTypeComposer, updateCollectionRecord, collectionEntry } =
+    args;
+
+  async function update(
+    payload: Record,
+    existing: EntryNode
+  ) {
+    // remove _metadata to prevent injection
+    const { _metadata, ...update } = payload?.[name];
+
+    const targetRecord = objectTypeComposer
+      .getResolver('findById')
+      .resolve({ args: update });
+
+    // remove supplied key (might not be required)
+    delete update[targetRecord._metadata.referenceField];
+    const newRecord = merge(targetRecord, update);
+
+    await updateCollectionRecord(collectionEntry, newRecord);
+
+    return newRecord;
+  }
+
+  async function create(source: unknown, payload: Record) {
+    collectionEntry.creationRequiredFields.forEach((field) => {
+      if (!payload[name].hasOwnProperty(field))
+        throw new Error(
+          `field ${field} is required when creating a new ${name}`
+        );
+    });
+
+    const record = merge(payload[name], {
+      _metadata: {
+        referenceField: collectionEntry.referenceField ?? 'id',
+        collection: name,
+        transformedBy: collectionEntry?.defaultTransformer,
+        sourcedBy: collectionEntry?.defaultSource,
+      } as CollectionContext,
+    });
+
+    return await updateCollectionRecord(collectionEntry, record);
+  }
+
+  schemaComposer.Mutation.addFields({
+    [`update${name}`]: {
+      type: objectTypeComposer,
+      args: {
+        [name]: objectTypeComposer
+          .getInputTypeComposer()
+          .makeFieldNonNull(collectionEntry.creationRequiredFields),
+      },
+      description: `Update a ${name}`,
+      async resolve(source: unknown, payload: Record) {
+        const { _metadata, ...args } = payload?.[name];
+
+        const existingRecord = objectTypeComposer
+          .getResolver('findById')
+          .resolve({ args });
+
+        if (!existingRecord)
+          throw new Error(
+            `${name} with ${collectionEntry.referenceField} of ${get(
+              args,
+              collectionEntry.referenceField
+            )} not found`
+          );
+        return update(payload, existingRecord);
+      },
+    },
+    [`create${name}`]: {
+      type: objectTypeComposer,
+      args: {
+        [name]: objectTypeComposer
+          .getInputTypeComposer()
+          .clone(`${name}CreateInput`)
+          .removeField('id')
+          .makeFieldNonNull(collectionEntry.creationRequiredFields),
+      },
+      description: `Create a ${name}`,
+      resolve: create,
+    },
+    [`upsert${name}`]: {
+      type: objectTypeComposer,
+      args: { [name]: objectTypeComposer.getInputTypeComposer() },
+      async resolve(source: unknown, payload: Record) {
+        const { _metadata, ...args } = payload?.[name];
+
+        const existingRecord = objectTypeComposer
+          .getResolver('findById')
+          .resolve({ args });
+
+        if (existingRecord) return update(payload, existingRecord);
+        create(source, payload);
+      },
+    },
+  });
+}
diff --git a/packages/core/src/generators/collectionQueries.ts b/packages/core/src/generators/collectionQueries.ts
new file mode 100644
index 0000000..dd4fa88
--- /dev/null
+++ b/packages/core/src/generators/collectionQueries.ts
@@ -0,0 +1,82 @@
+import resolveQueryArgs from '../resolvers/arguments';
+
+import { SchemaComposer } from 'graphql-compose';
+import { cloneDeep } from 'lodash-es';
+import {
+  generateArgsForAllItemQuery,
+  generateArgsForManyItemQuery,
+  generateArgsForSingleItemQuery,
+} from '../generators/arguments';
+import { CollectionResolverArgs, EntryNode } from '../types';
+
+export default function addCollectionQueries(
+  schemaComposer: SchemaComposer,
+  args: CollectionResolverArgs & { allContentNodesJSON: Record }
+) {
+  const { name, pluralName, config, objectTypeComposer, allContentNodesJSON } =
+    args;
+
+  const pluralTypeQueryName = 'all' + pluralName;
+
+  objectTypeComposer.addResolver({
+    name: 'findById',
+    type: () => objectTypeComposer,
+    description: `Find one ${name} by its ID`,
+    args: generateArgsForSingleItemQuery(),
+    resolve: (rp: Record) =>
+      cloneDeep(
+        allContentNodesJSON[name].find(
+          (node: EntryNode) => node.id === rp.args.id
+        )
+      ),
+  });
+
+  objectTypeComposer.addResolver({
+    name: 'findMany',
+    type: () => [objectTypeComposer],
+    description: `Find many ${pluralName} by their IDs`,
+    args: generateArgsForManyItemQuery(pluralName),
+    resolve: (rp: Record) => {
+      const idsToFind = rp.args.ids ?? [];
+      const matches =
+        cloneDeep(allContentNodesJSON[name])?.filter((node: EntryNode) =>
+          idsToFind?.includes(node.id)
+        ) ?? [];
+      return resolveQueryArgs(matches, rp.args, config, {
+        type: {
+          name: name,
+          pluralName: pluralName,
+          pluralQueryName: pluralTypeQueryName,
+        },
+      });
+    },
+  });
+
+  objectTypeComposer.addResolver({
+    name: 'all',
+    args: generateArgsForAllItemQuery(pluralName),
+    type: () => [objectTypeComposer],
+    description: `Return a set of ${pluralName}`,
+    resolve: (rp: Record) => {
+      const nodes = cloneDeep(allContentNodesJSON[name]);
+      return resolveQueryArgs(nodes, rp.args, config, {
+        type: {
+          name: name,
+          pluralName: pluralName,
+          pluralQueryName: pluralTypeQueryName,
+        },
+      });
+    },
+  });
+
+  schemaComposer.Query.addFields({
+    /**
+     * Add find by ID to each content type
+     */
+    [name]: objectTypeComposer.getResolver('findById'),
+    /**
+     * Add find 'many' to each content type
+     */
+    [pluralTypeQueryName]: objectTypeComposer.getResolver('all'),
+  });
+}
diff --git a/packages/core/src/generators/generateCollection.ts b/packages/core/src/generators/generateCollection.ts
index d939fba..afd262b 100644
--- a/packages/core/src/generators/generateCollection.ts
+++ b/packages/core/src/generators/generateCollection.ts
@@ -19,7 +19,7 @@ export function generateCollection({
   return transformKeys(
     defaultsDeep(
       {},
-      getFieldOverrides(collection, config),
+      getFieldOverrides(collection, config.content),
       ...nodes.map((node) => merge({}, node, preknownSchemaFragments))
     ),
     config.fieldNameTransform
diff --git a/packages/core/src/generators/schema.ts b/packages/core/src/generators/schema.ts
index 72dba8a..1e448a7 100644
--- a/packages/core/src/generators/schema.ts
+++ b/packages/core/src/generators/schema.ts
@@ -1,28 +1,25 @@
 import { schemaComposer } from 'graphql-compose';
 import { composeWithJson } from 'graphql-compose-json';
-import { cloneDeep, merge } from 'lodash-es';
+import { defaultsDeep, get, merge, set } from 'lodash-es';
 import plur from 'plur';
 import { VFile } from 'vfile';
 import { cacheSchema, checkCacheForSchema } from '../cache/cache';
+
 import {
-  generateArgsForAllItemQuery,
-  generateArgsForManyItemQuery,
-  generateArgsForSingleItemQuery,
-} from '../generators/arguments';
-import resolveQueryArgs from '../resolvers/arguments';
-import {
+  CollectionEntry,
   ConfigResult,
   EntryNode,
+  LoadedCollectionEntry,
   LoadedFlatbreadConfig,
+  Source,
   Transformer,
 } from '../types';
-import { map } from '../utils/map';
+import { createUniqueId } from '../utils/createUniqueId';
+import { getFieldOverrides } from '../utils/fieldOverrides';
 import { generateCollection } from './generateCollection';
-
-interface RootQueries {
-  maybeReturnsSingleItem: string[];
-  maybeReturnsList: string[];
-}
+import { map } from '../utils/map';
+import addCollectionMutations from './collectionMutations';
+import addCollectionQueries from './collectionQueries';
 
 /**
  * Generates a GraphQL schema from content nodes.
@@ -48,7 +45,53 @@ export async function generateSchema(
   config.source.initialize?.(config);
 
   // Invoke the content source resolver to retrieve the content nodes
-  const allContentNodes = await config.source.fetch(config.content);
+  let allContentNodes: Record = {};
+
+  let collectionEntriesByName = Object.fromEntries(
+    config.content.map((collection: LoadedCollectionEntry) => [
+      collection.name,
+      collection,
+    ])
+  );
+
+  const addRecord =
+    (sourceId: string) =>
+    (
+      collection: LoadedCollectionEntry,
+      record: EntryNode,
+      context: Ctx
+    ) => {
+      allContentNodes[collection.name] = allContentNodes[collection.name] ?? [];
+
+      const newRecord = {
+        record,
+        context: {
+          sourceContext: context,
+          sourcedBy: sourceId,
+          collection: collection.name,
+          referenceField: collection.referenceField ?? 'id',
+        },
+      };
+
+      allContentNodes[collection.name].push(newRecord);
+      return newRecord;
+    };
+
+  function addCreationRequiredFields(
+    collection: CollectionEntry,
+    fields: string[]
+  ): void {
+    if (!collectionEntriesByName[collection.name])
+      throw new Error(`Couldn't find collection ${collection.name}`);
+    collectionEntriesByName?.[collection.name]?.creationRequiredFields?.push(
+      ...fields
+    );
+  }
+
+  await config.source.fetch(config.content, {
+    addRecord: addRecord(config.source.id as string),
+    addCreationRequiredFields,
+  });
 
   // Transform the content nodes to the expected JSON format if needed
   const allContentNodesJSON = optionallyTransformContentNodes(
@@ -80,28 +123,65 @@ export async function generateSchema(
     ])
   );
 
-  /**
-   * @todo potentially able to remove this
-   **/
-  let queries: RootQueries = {
-    maybeReturnsSingleItem: [],
-    maybeReturnsList: [],
+  const transformersById = {
+    ...Object.fromEntries(
+      config.transformer.map((transformer) => [transformer.id, transformer])
+    ),
+    // this will be the default for collections that aren't already `transformedBy` anything
+    undefined: config.transformer[0],
   };
 
+  async function updateCollectionRecord(
+    collection: CollectionEntry,
+    entry: EntryNode & { _metadata: any }
+  ) {
+    const ctx = entry._metadata;
+    const {
+      serialize,
+      extensions,
+      id: transformerId,
+    } = transformersById[ctx.transformedBy];
+
+    if (ctx.reference) {
+      const index = allContentNodesJSON[ctx.collection].findIndex(
+        (c) => get(c, ctx.referenceField) === ctx.reference
+      );
+
+      if (index < 0) throw new Error('Failed to find record to update');
+      // replace in memory representation of record
+      allContentNodesJSON[ctx.collection][index] = entry;
+    } else {
+      entry._metadata.reference = createUniqueId();
+      set(entry, entry._metadata.referenceField, entry._metadata.reference);
+      entry._metadata.transformedBy = transformerId;
+      entry._metadata.extension = extensions?.[0];
+      allContentNodesJSON[ctx.collection].push(entry);
+    }
+
+    const { _metadata, ...record } = entry;
+    const file = await serialize(record, ctx.transformContext);
+    await config?.source.put(file, ctx.sourceContext, {
+      parentContext: ctx,
+      collection,
+      record,
+    });
+
+    return entry;
+  }
+
   // Main builder loop - iterate through each content type and generate query resolvers + relationships for it
-  for (const [type, schema] of Object.entries(schemaArray)) {
-    const pluralType = plur(type, 2);
-    const pluralTypeQueryName = 'all' + pluralType;
+  for (const [name, objectTypeComposer] of Object.entries(schemaArray)) {
+    const pluralName = plur(name, 2);
 
     //
     /// Global meta fields
     //
 
-    schema.addFields({
+    objectTypeComposer.addFields({
       _collection: {
         type: 'String',
         description: 'The collection name',
-        resolve: () => type,
+        resolve: () => name,
       },
     });
 
@@ -109,77 +189,46 @@ export async function generateSchema(
     /// Query resolvers
     //
 
-    schema.addResolver({
-      name: 'findById',
-      type: () => schema,
-      description: `Find one ${type} by its ID`,
-      args: generateArgsForSingleItemQuery(),
-      resolve: (rp: Record) =>
-        cloneDeep(allContentNodesJSON[type]).find(
-          (node: EntryNode) => node.id === rp.args.id
-        ),
-    });
+    // TODO: add a new type of plugin that can add resolvers to each collection, they should be called here
 
-    schema.addResolver({
-      name: 'findMany',
-      type: () => [schema],
-      description: `Find many ${pluralType} by their IDs`,
-      args: generateArgsForManyItemQuery(pluralType),
-      resolve: (rp: Record) => {
-        const idsToFind = rp.args.ids ?? [];
-        const matches =
-          cloneDeep(allContentNodesJSON[type])?.filter((node: EntryNode) =>
-            idsToFind?.includes(node.id)
-          ) ?? [];
-        return resolveQueryArgs(matches, rp.args, config, {
-          type: {
-            name: type,
-            pluralName: pluralType,
-            pluralQueryName: pluralTypeQueryName,
-          },
-        });
-      },
-    });
+    const collectionEntry = collectionEntriesByName[name];
 
-    schema.addResolver({
-      name: 'all',
-      args: generateArgsForAllItemQuery(pluralType),
-      type: () => [schema],
-      description: `Return a set of ${pluralType}`,
-      resolve: (rp: Record) => {
-        const nodes = cloneDeep(allContentNodesJSON[type]);
-        return resolveQueryArgs(nodes, rp.args, config, {
-          type: {
-            name: type,
-            pluralName: pluralType,
-            pluralQueryName: pluralTypeQueryName,
-          },
-        });
-      },
+    addCollectionQueries(schemaComposer, {
+      name,
+      pluralName,
+      allContentNodesJSON,
+      updateCollectionRecord,
+      objectTypeComposer,
+      config,
+      collectionEntry,
     });
 
-    schemaComposer.Query.addFields({
-      /**
-       * Add find by ID to each content type
-       */
-      [type]: schema.getResolver('findById'),
-      /**
-       * Add find 'many' to each content type
-       */
-      [pluralTypeQueryName]: schema.getResolver('all'),
+    addCollectionMutations(schemaComposer, {
+      name,
+      pluralName,
+      objectTypeComposer,
+      updateCollectionRecord,
+      config,
+      collectionEntry,
     });
 
-    /**
-     * Separate the queries by return type for later use when wrapping the query resolvers
-     * @todo potentially able to remove this
-     **/
-    queries.maybeReturnsSingleItem.push(type);
-    queries.maybeReturnsList.push(pluralTypeQueryName);
+    await Promise.all(
+      config.collectionResolvers.map((collectionResolver) =>
+        collectionResolver(schemaComposer, {
+          name,
+          pluralName,
+          objectTypeComposer,
+          updateCollectionRecord,
+          config,
+          collectionEntry,
+        })
+      )
+    );
   }
 
   // Create map of references on each content node
-  for (const { collection, refs } of config.content) {
-    const typeTC = schemaComposer.getOTC(collection);
+  for (const { name, refs } of config.content) {
+    const typeTC = schemaComposer.getOTC(name);
 
     if (!refs) continue;
 
@@ -196,7 +245,7 @@ export async function generateSchema(
           description: `All ${plur(
             String(refType),
             2
-          )} that are referenced by this ${collection}`,
+          )} that are referenced by this ${name}`,
           resolver: () => refTypeTC.getResolver('findMany'),
           prepareArgs: {
             ids: (source) => source[refField],
@@ -206,7 +255,7 @@ export async function generateSchema(
       } else {
         // If the reference field has a single node
         typeTC.addRelation(refField, {
-          description: `The ${refType} referenced by this ${collection}`,
+          description: `The ${refType} referenced by this ${name}`,
           resolver: () => refTypeTC.getResolver('findById'),
           prepareArgs: {
             id: (source) => source[refField],
@@ -242,11 +291,9 @@ const fetchPreknownSchemaFragments = (
 
 function getTransformerExtensionMap(transformer: Transformer[]) {
   const transformerMap = new Map();
-  transformer.forEach((t) => {
-    t.extensions.forEach((extension) => {
-      transformerMap.set(extension, t);
-    });
-  });
+  transformer.forEach((t) =>
+    t.extensions.forEach((extension) => transformerMap.set(extension, t))
+  );
   return transformerMap;
 }
 
@@ -272,14 +319,20 @@ const optionallyTransformContentNodes = (
      * @todo if this becomes a performance bottleneck, consider overloading the source plugin API to accept a transform function so we can avoid mapping through the content nodes twice
      * */
 
-    return map(allContentNodes, (node: VFile) => {
-      const transformer = transformerMap.get(node.extname);
+    return map(allContentNodes, (node: { record: VFile; context: any }) => {
+      const transformer = transformerMap.get(node.record.extname);
       if (!transformer?.parse) {
-        throw new Error(`no transformer found for ${node.path}`);
+        throw new Error(`no transformer found for ${node.record.path}`);
       }
-      return transformer.parse(node);
+      const { record: doc, context } = transformer.parse(node.record);
+      doc._metadata = node.context;
+      doc._metadata.transformedBy = transformer.id;
+      doc._metadata.transformContext = context;
+      doc._metadata.reference = get(doc, node.context.referenceField);
+      return doc;
     });
   }
 
+  // TODO: might need to map this to attach metadata here
   return allContentNodes;
 };
diff --git a/packages/core/src/providers/test/base.test.ts b/packages/core/src/providers/test/base.test.ts
index 145c2f4..0ca5ff8 100644
--- a/packages/core/src/providers/test/base.test.ts
+++ b/packages/core/src/providers/test/base.test.ts
@@ -1,11 +1,15 @@
-import test from 'ava';
-import filesystem from '@flatbread/source-filesystem';
 import markdownTransformer from '@flatbread/transformer-markdown';
+import test from 'ava';
+import { SourceVirtual } from '../../sources/virtual';
 import { FlatbreadProvider } from '../base';
+import { mockData } from './mockData';
+import { CollectionResolverArgs } from '../../types';
+
+const sourceVirtual = new SourceVirtual(mockData);
 
 function basicProject() {
   return new FlatbreadProvider({
-    source: filesystem(),
+    source: sourceVirtual,
     transformer: markdownTransformer({
       markdown: {
         gfm: true,
@@ -16,7 +20,7 @@ function basicProject() {
     content: [
       {
         path: 'examples/content/markdown/authors',
-        collection: 'Author',
+        name: 'Author',
         refs: {
           friend: 'Author',
         },
@@ -25,6 +29,47 @@ function basicProject() {
   });
 }
 
+test('create custom collection resolver', async (t) => {
+  const flatbread = await new FlatbreadProvider({
+    source: sourceVirtual,
+    transformer: markdownTransformer({
+      markdown: {
+        gfm: true,
+        externalLinks: true,
+      },
+    }),
+
+    collectionResolvers: [
+      function fakeResolver(schemaComposer, args) {
+        const { name } = args;
+
+        schemaComposer.Query.addFields({
+          [`fake${name}`]: {
+            type: 'String',
+            description: `fake resolver`,
+            resolve() {
+              return `fake ${name}!`;
+            },
+          },
+        });
+      },
+    ],
+
+    content: [
+      {
+        path: 'examples/content/markdown/authors',
+        name: 'Author',
+        refs: {
+          friend: 'Author',
+        },
+      },
+    ],
+  });
+
+  const result: any = await flatbread.query({ source: `{ fakeAuthor }` });
+  t.is(result.data.fakeAuthor, 'fake Author!');
+});
+
 test('basic query', async (t) => {
   const flatbread = basicProject();
 
@@ -48,7 +93,7 @@ test('relational filter query', async (t) => {
   const result = await flatbread.query({
     source: `
     query AllAuthors {
-      allAuthors(filter: {friend: {name: {eq: "Eva"}}}) {
+      allAuthors(filter: {friend: {name: {wildcard: "Ev*"}}}) {
         name
         enjoys
       }
@@ -58,3 +103,74 @@ test('relational filter query', async (t) => {
 
   t.snapshot(result);
 });
+
+test('update collection record', async (t) => {
+  const flatbread = basicProject();
+  const sitting = (Math.random() * 100) | 0;
+  const result: any = await flatbread.query({
+    variableValues: { author: { id: '2a3e', skills: { sitting } } },
+    source: `
+      mutation UpdateAuthor($author: AuthorInput){
+        updateAuthor(Author: $author) {
+          id
+          skills {
+            sitting
+          }
+        }
+      }
+    `,
+  });
+
+  t.is(result.data.updateAuthor.skills.sitting, sitting);
+
+  const updated: any = await flatbread.query({
+    source: `
+      query  {
+        Author(id: "2a3e") {
+          id
+          skills {
+            sitting
+          }
+        }
+      }
+    `,
+  });
+
+  t.is(updated.data.Author.skills.sitting, sitting);
+});
+
+test('create collection record', async (t) => {
+  const flatbread = basicProject();
+  const sitting = 69;
+  const result: any = await flatbread.query({
+    variableValues: { test: { skills: { sitting } } },
+    source: `
+      mutation CreateAuthor($test: AuthorCreateInput){
+        createAuthor(Author: $test) {
+          id
+          skills {
+            sitting
+          }
+        }
+      }
+    `,
+  });
+
+  t.is(result.data.createAuthor.skills.sitting, sitting);
+
+  const updated: any = await flatbread.query({
+    variableValues: { id: result.data.createAuthor.id },
+    source: `
+      query QueryAuthor($id: String)  {
+        Author(id: $id) {
+          id
+          skills {
+            sitting
+          }
+        }
+      }
+    `,
+  });
+
+  t.is(updated.data.Author.skills.sitting, sitting);
+});
diff --git a/packages/core/src/providers/test/mockData.ts b/packages/core/src/providers/test/mockData.ts
new file mode 100644
index 0000000..4418044
--- /dev/null
+++ b/packages/core/src/providers/test/mockData.ts
@@ -0,0 +1,75 @@
+import { VFile } from 'vfile';
+
+export const mockData = {
+  Author: [
+    new VFile({
+      path: '/content/authors/eva.md',
+      extname: '.md',
+      value: `---
+    id: 40s3
+    name: Eva
+    entity: Cat
+    enjoys:
+      - sitting
+      - standing
+      - mow mow
+      - sleepy time
+      - attention
+    friend: 2a3e
+    image: eva.svg
+    date_joined: 2002-02-25T16:41:59.558Z
+    skills:
+      sitting: 100000
+      breathing: 4.7
+      liquid_consumption: 10
+      existence: funky
+      sports: -200
+---
+    `,
+    }),
+    new VFile({
+      path: '/content/authors/tony.md',
+      extname: '.md',
+      value: `---
+    name: Tony
+    id: 2a3e
+    friend: ab2c
+    enjoys:
+      - cats
+      - tea
+      - making this
+    date_joined: 2021-02-25T16:41:59.558Z
+    skills:
+      sitting: 71
+      breathing: 7.07
+      liquid_consumption: 100
+      existence: simulation
+      sports: -2
+      cat_pat: 1500
+---
+    `,
+    }),
+    new VFile({
+      path: '/content/authors/daes.md',
+      extname: '.md',
+      value: `---
+      id: ab2c
+      name: Daes
+      entity: Human
+      enjoys:
+        - cats
+        - coffee
+        - design
+      friend: 40s3
+      date_joined: 2021-04-22T16:41:59.558Z
+      skills:
+        sitting: 304
+        breathing: 1.034234
+        liquid_consumption: -100
+        existence: etheral
+        sports: 3
+---   
+    `,
+    }),
+  ],
+};
diff --git a/packages/core/src/providers/test/snapshots/base.test.ts.md b/packages/core/src/providers/test/snapshots/base.test.ts.md
index 8229fe4..74f150e 100644
--- a/packages/core/src/providers/test/snapshots/base.test.ts.md
+++ b/packages/core/src/providers/test/snapshots/base.test.ts.md
@@ -13,21 +13,9 @@ Generated by [AVA](https://avajs.dev).
         allAuthors: [
           {
             enjoys: [
-              'cats',
-              'coffee',
-              'design',
-            ],
-            name: 'Daes',
-          },
-          {
-            enjoys: [
-              'sitting',
-              'standing',
-              'mow mow',
-              'sleepy time',
-              'attention',
+              'apples',
             ],
-            name: 'Eva',
+            name: 'Another User',
           },
           {
             enjoys: [
@@ -37,23 +25,6 @@ Generated by [AVA](https://avajs.dev).
             ],
             name: 'Tony',
           },
-          {
-            enjoys: [
-              'peeing in the cat tower',
-              'being shaped like an egg',
-              'violence',
-            ],
-            name: 'Ushi',
-          },
-          {
-            enjoys: [
-              'talking',
-              'encroaching upon personal space',
-              'being concerned',
-              'smooth jazz',
-            ],
-            name: 'Yoshi',
-          },
         ],
       },
     }
@@ -65,21 +36,13 @@ Generated by [AVA](https://avajs.dev).
     {
       data: {
         allAuthors: [
-          {
-            enjoys: [
-              'cats',
-              'coffee',
-              'design',
-            ],
-            name: 'Daes',
-          },
           {
             enjoys: [
               'cats',
               'tea',
               'making this',
             ],
-            name: 'Tony',
+            name: 'Daes',
           },
         ],
       },
diff --git a/packages/core/src/providers/test/snapshots/base.test.ts.snap b/packages/core/src/providers/test/snapshots/base.test.ts.snap
index 7b8489b..61d815b 100644
Binary files a/packages/core/src/providers/test/snapshots/base.test.ts.snap and b/packages/core/src/providers/test/snapshots/base.test.ts.snap differ
diff --git a/packages/core/src/sources/virtual.ts b/packages/core/src/sources/virtual.ts
new file mode 100644
index 0000000..d2be745
--- /dev/null
+++ b/packages/core/src/sources/virtual.ts
@@ -0,0 +1,55 @@
+import { cloneDeep } from 'lodash-es';
+import { VFile } from 'vfile';
+import {
+  FlatbreadArgs,
+  LoadedCollectionEntry,
+  LoadedFlatbreadConfig,
+  Source,
+} from '../types';
+
+interface MemContext {
+  id: string;
+  collectionName: string;
+}
+
+export class SourceVirtual implements Source {
+  private data: Record = {};
+
+  public id = '@flatbread/sourceMemory';
+
+  constructor(data: Record) {
+    this.data = data;
+  }
+
+  initialize(config: LoadedFlatbreadConfig) {}
+
+  async fetch(
+    entries: LoadedCollectionEntry[],
+    { addRecord }: FlatbreadArgs
+  ) {
+    for (const entry of entries) {
+      if (!this.data[entry.name])
+        throw new Error(`can't find collection ${entry.name}`);
+      for (const record of this.data[entry.name]) {
+        addRecord(entry, cloneDeep(record), {
+          id: record.path,
+          collectionName: entry.name,
+        });
+      }
+    }
+  }
+
+  async put(doc: VFile, context: MemContext, { parentContext }: any) {
+    const record = this.data[parentContext.collection].find(
+      (entry) => entry.path === parentContext.reference
+    );
+
+    if (record) {
+      record.value = doc.value;
+    } else {
+      this.data[parentContext.collection].push(doc);
+    }
+
+    return { doc, context };
+  }
+}
diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts
index 39237b2..336bde1 100644
--- a/packages/core/src/types.ts
+++ b/packages/core/src/types.ts
@@ -1,4 +1,5 @@
 import { GraphQLFieldConfigArgumentMap, GraphQLInputType } from 'graphql';
+import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
 import { Maybe } from 'graphql/jsutils/Maybe';
 import type { VFile } from 'vfile';
 
@@ -21,16 +22,35 @@ export type ContentNode = BaseContentNode & {
  * @todo This needs to be typed more strictly.
  */
 export interface FlatbreadConfig {
-  source: Source;
+  source: Source;
   transformer?: Transformer | Transformer[];
-  content: Content;
+  content: CollectionEntry[];
   fieldNameTransform?: (field: string) => string;
+  collectionResolvers?: CollectionResolver[];
 }
 
+export interface CollectionResolverArgs {
+  name: string;
+  pluralName: string;
+  config: LoadedFlatbreadConfig;
+  objectTypeComposer: ObjectTypeComposer;
+  collectionEntry: LoadedCollectionEntry;
+  updateCollectionRecord: (
+    collection: CollectionEntry,
+    entry: EntryNode & { _metadata: CollectionContext }
+  ) => Promise;
+}
+
+export type CollectionResolver = (
+  schemaComposer: SchemaComposer,
+  args: CollectionResolverArgs
+) => void | Promise;
+
 export interface LoadedFlatbreadConfig {
-  source: Source;
+  source: Source;
   transformer: Transformer[];
-  content: Content;
+  content: LoadedCollectionEntry[];
+  collectionResolvers: CollectionResolver[];
   fieldNameTransform: (field: string) => string;
   loaded: {
     extensions: string[];
@@ -53,8 +73,10 @@ export interface Transformer {
    * @param input Node to transform
    */
   parse?: (input: VFile) => EntryNode;
+  id?: string;
   preknownSchemaFragments?: () => Record;
   inspect: (input: EntryNode) => string;
+  serialize: (input: EntryNode, ctx: CollectionContext) => VFile;
   extensions: string[];
 }
 
@@ -69,15 +91,36 @@ export type EntryNode = Record;
  * The result of an invoked `Source` plugin which contains methods on how to retrieve content nodes in
  * their raw (if coupled with a `Transformer` plugin) or processed form.
  */
-export interface Source {
+
+export interface FlatbreadArgs {
+  addRecord(
+    collection: LoadedCollectionEntry,
+    record: EntryNode,
+    context?: Context
+  ): void;
+  addCreationRequiredFields(
+    collection: LoadedCollectionEntry,
+    fields: string[]
+  ): void;
+}
+
+export interface Source {
   initialize?: (flatbreadConfig: LoadedFlatbreadConfig) => void;
-  fetchByType?: (path: string) => Promise;
+  id?: string;
+  put: (
+    source: VFile,
+    ctx: Context,
+    opts: { parentContext: any; collection: CollectionEntry; record: any }
+  ) => Promise<{ doc: VFile; context: Context }>;
   fetch: (
-    allContentTypes: Record[]
-  ) => Promise>;
+    allContentTypes: LoadedCollectionEntry[],
+    flatbread: FlatbreadArgs
+  ) => Promise;
 }
 
-export type SourcePlugin = (sourceConfig?: Record) => Source;
+export type SourcePlugin = (
+  sourceConfig?: Record
+) => Source;
 
 /**
  * An override can be used to declare a custom resolve for a field in content
@@ -94,13 +137,35 @@ export interface Override {
   ) => any;
 }
 
+export interface CollectionContext {
+  referenceField: string;
+  collection: string;
+  filename: string;
+  path: string;
+  slug: string;
+  sourcedBy: string;
+  transformedBy: string;
+  reference: string;
+}
+
 /**
- * An array of content descriptions which can be used to retrieve content nodes.
+ * A collection entry which can be used to retrieve content nodes.
  *
  * This is paired with a `Source` (and, *optionally*, a `Transformer`) plugin.
  */
-export type Content = {
-  collection: string;
+
+export interface CollectionEntry {
+  name: string;
+  path: string;
   overrides?: Override[];
-  [key: string]: any;
-}[];
+  refs?: Record;
+  referenceField?: string;
+  creationRequiredFields?: string[];
+  defaultTransformer?: string;
+  defaultSource?: string;
+}
+
+export interface LoadedCollectionEntry extends CollectionEntry {
+  referenceField: string;
+  creationRequiredFields: string[];
+}
diff --git a/packages/core/src/utils/createShaHash.ts b/packages/core/src/utils/createShaHash.ts
new file mode 100644
index 0000000..a194072
--- /dev/null
+++ b/packages/core/src/utils/createShaHash.ts
@@ -0,0 +1,6 @@
+import { anyToString } from './stringUtils';
+import { createHash } from 'crypto';
+
+export default function createShaHash(content: any) {
+  return createHash('sha256').update(anyToString(content)).digest('hex');
+}
diff --git a/packages/core/src/utils/createUniqueId.ts b/packages/core/src/utils/createUniqueId.ts
new file mode 100644
index 0000000..c860ed0
--- /dev/null
+++ b/packages/core/src/utils/createUniqueId.ts
@@ -0,0 +1,8 @@
+import { customAlphabet } from 'nanoid';
+
+// only use lower case letters and numbers to avoid issues with windows ignoring case on filenames
+const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789');
+
+export function createUniqueId() {
+  return nanoid();
+}
diff --git a/packages/core/src/utils/fieldOverrides.ts b/packages/core/src/utils/fieldOverrides.ts
index f3106bb..5122ea1 100644
--- a/packages/core/src/utils/fieldOverrides.ts
+++ b/packages/core/src/utils/fieldOverrides.ts
@@ -1,20 +1,24 @@
-import { FlatbreadConfig, Override } from '../types';
 import { get, set } from 'lodash-es';
+import { CollectionEntry } from '../../dist';
+import { Override } from '../types';
 
 /**
  * Get an object containing functions nested in an object structure
  * aligning to the listed overrides in the config
  *
- * @param collection the collection string referenced in the config
- * @param config the flatbread config object
+ * @param collectionName the collection string referenced in the config
+ * @param entries the flatbread config object
  * @returns an object in the shape of the json schema
  */
-export function getFieldOverrides(collection: string, config: FlatbreadConfig) {
-  const content = config.content.find(
-    (content) => content.collection === collection
+export function getFieldOverrides(
+  collectionName: string,
+  entries: CollectionEntry[]
+) {
+  const collectionEntry = entries.find(
+    (entry) => entry.name === collectionName
   );
-  if (!content?.overrides) return {};
-  const overrides = content.overrides;
+  if (!collectionEntry?.overrides) return {};
+  const overrides = collectionEntry.overrides;
 
   return overrides.reduce((fields: any, override: Override) => {
     const { field, type, ...rest } = override;
diff --git a/packages/core/src/utils/initializeConfig.ts b/packages/core/src/utils/initializeConfig.ts
index 8513e31..d569711 100644
--- a/packages/core/src/utils/initializeConfig.ts
+++ b/packages/core/src/utils/initializeConfig.ts
@@ -1,6 +1,9 @@
-import { cloneDeep } from 'lodash-es';
+import { cloneDeep, defaultsDeep } from 'lodash-es';
+import { LoadedCollectionEntry } from '../types';
 import { FlatbreadConfig, LoadedFlatbreadConfig, Transformer } from '../types';
 import { toArray } from './arrayUtils';
+import createShaHash from './createShaHash';
+import { anyToString } from './stringUtils';
 import camelCase from './camelCase';
 
 /**
@@ -10,11 +13,23 @@ export function initializeConfig(
   rawConfig: FlatbreadConfig
 ): LoadedFlatbreadConfig {
   const config = cloneDeep(rawConfig);
-  const transformer = toArray(config.transformer ?? []);
+  const transformer = toArray(config.transformer ?? []).map((t) => {
+    t.id = t.id ?? createShaHash(t);
+    return t;
+  });
+
+  config.source.id = config.source.id ?? createShaHash(config.source);
 
   return {
     fieldNameTransform: camelCase,
     ...config,
+    collectionResolvers: config.collectionResolvers || [],
+    content: config.content?.map((content: Partial) =>
+      defaultsDeep(content, {
+        referenceField: 'id',
+        creationRequiredFields: [],
+      })
+    ),
     transformer,
     loaded: {
       extensions: transformer
diff --git a/packages/core/src/utils/tests/fieldOverrides.test.ts b/packages/core/src/utils/tests/fieldOverrides.test.ts
index fca200e..bb93fdf 100644
--- a/packages/core/src/utils/tests/fieldOverrides.test.ts
+++ b/packages/core/src/utils/tests/fieldOverrides.test.ts
@@ -1,8 +1,9 @@
 import test from 'ava';
+import { LoadedCollectionEntry } from '../../types';
 import { getFieldOverrides } from '../fieldOverrides.js';
 
-function getProps(overrides: any[]): [string, any] {
-  return ['t', { content: [{ collection: 't', overrides }] }];
+function getProps(overrides: any[]): [string, LoadedCollectionEntry[]] {
+  return ['t', [{ name: 't', overrides, referenceField: 'id' }]];
 }
 
 test('basic override', (t) => {
diff --git a/packages/editor/.eslintignore b/packages/editor/.eslintignore
new file mode 100644
index 0000000..3897265
--- /dev/null
+++ b/packages/editor/.eslintignore
@@ -0,0 +1,13 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
+
+# Ignore files for PNPM, NPM and YARN
+pnpm-lock.yaml
+package-lock.json
+yarn.lock
diff --git a/packages/editor/.eslintrc.cjs b/packages/editor/.eslintrc.cjs
new file mode 100644
index 0000000..3ccf435f
--- /dev/null
+++ b/packages/editor/.eslintrc.cjs
@@ -0,0 +1,20 @@
+module.exports = {
+	root: true,
+	parser: '@typescript-eslint/parser',
+	extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
+	plugins: ['svelte3', '@typescript-eslint'],
+	ignorePatterns: ['*.cjs'],
+	overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
+	settings: {
+		'svelte3/typescript': () => require('typescript')
+	},
+	parserOptions: {
+		sourceType: 'module',
+		ecmaVersion: 2020
+	},
+	env: {
+		browser: true,
+		es2017: true,
+		node: true
+	}
+};
diff --git a/packages/editor/.flatbread/schemas/author.yaml b/packages/editor/.flatbread/schemas/author.yaml
new file mode 100644
index 0000000..82f623e
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author.yaml
@@ -0,0 +1,53 @@
+name: Author
+kind: OBJECT
+fields:
+  - label: Name
+    name: name
+    component: string
+  - label: Date joined
+    name: date_joined
+    component: date
+  - label: Entity
+    name: entity
+    component: string
+  - label: Enjoys
+    name: enjoys
+    component: list
+  - label: Friend
+    name: friend
+    description: The Author referenced by this Author
+    component: object
+    collection: Author
+  - label: Image
+    name: image
+    component: svimg
+    collection: Svimg
+  - label: Skills
+    name: skills
+    component: object
+    collection: Author_Skills
+  - label: Collection
+    name: _collection
+    description: The collection name
+    disabled: true
+    component: string
+  - label: Id
+    name: id
+    disabled: true
+    component: string
+  - label: Content
+    name: _content
+    disabled: true
+    component: object
+    collection: Author__content
+  - label: Metadata
+    name: _metadata
+    disabled: true
+    component: object
+    collection: Author__metadata
+component: object
+label: Author
+pluralName: Authors
+referenceField: name
+meta:
+  hash: wJ/UxraDtoG3TPy2ZtymmKmFHJA=
diff --git a/packages/editor/.flatbread/schemas/author_-skills.yaml b/packages/editor/.flatbread/schemas/author_-skills.yaml
new file mode 100644
index 0000000..0ac9463
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author_-skills.yaml
@@ -0,0 +1,23 @@
+name: Author_Skills
+kind: OBJECT
+fields:
+  - label: Breathing
+    name: breathing
+    component: float
+  - label: Existence
+    name: existence
+    component: string
+  - label: Liquid consumption
+    name: liquid_consumption
+    component: float
+  - label: Sitting
+    name: sitting
+    component: float
+  - label: Sports
+    name: sports
+    component: float
+component: object
+label: Author_ Skills
+referenceField: id
+meta:
+  hash: Blv5+KF1qwWNDdU3K6uCT40U6HU=
diff --git a/packages/editor/.flatbread/schemas/author__content.yaml b/packages/editor/.flatbread/schemas/author__content.yaml
new file mode 100644
index 0000000..71bee95
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__content.yaml
@@ -0,0 +1,23 @@
+name: Author__content
+kind: OBJECT
+fields:
+  - label: Excerpt
+    name: excerpt
+    description: A plaintext excerpt taken from the main content
+    component: string
+  - label: Html
+    name: html
+    description: The content as HTML
+    component: string
+  - label: Raw
+    name: raw
+    component: string
+  - label: Timetoread
+    name: timeToRead
+    description: How long (in minutes) it would take an average reader to read the main content.
+    component: int
+component: object
+label: Author__content
+referenceField: id
+meta:
+  hash: 8+fJdGTuCY8ij7xoqxZI8xCos80=
diff --git a/packages/editor/.flatbread/schemas/author__metadata.yaml b/packages/editor/.flatbread/schemas/author__metadata.yaml
new file mode 100644
index 0000000..2e6fa2b
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__metadata.yaml
@@ -0,0 +1,30 @@
+name: Author__metadata
+kind: OBJECT
+fields:
+  - label: Collection
+    name: collection
+    component: string
+  - label: Reference
+    name: reference
+    component: string
+  - label: Referencefield
+    name: referenceField
+    component: string
+  - label: Sourcedby
+    name: sourcedBy
+    component: string
+  - label: Transformcontext
+    name: transformContext
+    component: json
+  - label: Transformedby
+    name: transformedBy
+    component: string
+  - label: Sourcecontext
+    name: sourceContext
+    component: object
+    collection: Author__metadata_SourceContext
+component: object
+label: Author__metadata
+referenceField: id
+meta:
+  hash: wy+YFVDu46TK+9c6m4ysZq+xhUU=
diff --git a/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml
new file mode 100644
index 0000000..7479817
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: Author__metadata_SourceContext
+kind: OBJECT
+fields:
+  - label: Filename
+    name: filename
+    component: string
+  - label: Path
+    name: path
+    component: string
+  - label: Slug
+    name: slug
+    component: string
+component: object
+label: Author__metadata_ Source Context
+referenceField: id
+meta:
+  hash: gSsmwSPcdxtWn3jegimd00XqCo8=
diff --git a/packages/editor/.flatbread/schemas/mutation.yaml b/packages/editor/.flatbread/schemas/mutation.yaml
new file mode 100644
index 0000000..72a0f93
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/mutation.yaml
@@ -0,0 +1,78 @@
+name: Mutation
+kind: OBJECT
+fields:
+  - label: Createauthor
+    name: createAuthor
+    description: Create a Author
+    component: object
+    collection: Author
+  - label: Createoverridetest
+    name: createOverrideTest
+    description: Create a OverrideTest
+    component: object
+    collection: OverrideTest
+  - label: Createpost
+    name: createPost
+    description: Create a Post
+    component: object
+    collection: Post
+  - label: Createpostcategory
+    name: createPostCategory
+    description: Create a PostCategory
+    component: object
+    collection: PostCategory
+  - label: Createyamlauthor
+    name: createYamlAuthor
+    description: Create a YamlAuthor
+    component: object
+    collection: YamlAuthor
+  - label: Updateauthor
+    name: updateAuthor
+    description: Update a Author
+    component: object
+    collection: Author
+  - label: Updateoverridetest
+    name: updateOverrideTest
+    description: Update a OverrideTest
+    component: object
+    collection: OverrideTest
+  - label: Updatepost
+    name: updatePost
+    description: Update a Post
+    component: object
+    collection: Post
+  - label: Updatepostcategory
+    name: updatePostCategory
+    description: Update a PostCategory
+    component: object
+    collection: PostCategory
+  - label: Updateyamlauthor
+    name: updateYamlAuthor
+    description: Update a YamlAuthor
+    component: object
+    collection: YamlAuthor
+  - label: Upsertauthor
+    name: upsertAuthor
+    component: object
+    collection: Author
+  - label: Upsertoverridetest
+    name: upsertOverrideTest
+    component: object
+    collection: OverrideTest
+  - label: Upsertpost
+    name: upsertPost
+    component: object
+    collection: Post
+  - label: Upsertpostcategory
+    name: upsertPostCategory
+    component: object
+    collection: PostCategory
+  - label: Upsertyamlauthor
+    name: upsertYamlAuthor
+    component: object
+    collection: YamlAuthor
+component: object
+label: Mutation
+referenceField: id
+meta:
+  hash: NhJ1i1yQcPoJu/n0bLd/kDItWXs=
diff --git a/packages/editor/.flatbread/schemas/override-test.yaml b/packages/editor/.flatbread/schemas/override-test.yaml
new file mode 100644
index 0000000..2f1bb08
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test.yaml
@@ -0,0 +1,44 @@
+name: OverrideTest
+kind: OBJECT
+fields:
+  - label: Title
+    name: title
+    component: string
+  - label: Array
+    name: array
+    component: list
+  - label: Array2
+    name: array2
+    component: list
+  - label: Array3
+    name: array3
+    component: list
+  - label: Deeply
+    name: deeply
+    component: object
+    collection: OverrideTest_Deeply
+  - label: Collection
+    name: _collection
+    description: The collection name
+    disabled: true
+    component: string
+  - label: Id
+    name: id
+    disabled: true
+    component: string
+  - label: Content
+    name: _content
+    disabled: true
+    component: object
+    collection: OverrideTest__content
+  - label: Metadata
+    name: _metadata
+    disabled: true
+    component: object
+    collection: OverrideTest__metadata
+component: object
+label: Override Test
+pluralName: Override Tests
+referenceField: title
+meta:
+  hash: J7yZu464rDAR0+xgyPOQKdKdRH0=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array2.yaml b/packages/editor/.flatbread/schemas/override-test_-array2.yaml
new file mode 100644
index 0000000..d0dd070
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array2.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Array2
+kind: OBJECT
+fields:
+  - label: Obj
+    name: obj
+    component: string
+component: object
+label: Override Test_ Array2
+referenceField: id
+meta:
+  hash: qKSJky1zrZ5je3dtuAaQug5kAeE=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array3.yaml b/packages/editor/.flatbread/schemas/override-test_-array3.yaml
new file mode 100644
index 0000000..6807653
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array3.yaml
@@ -0,0 +1,12 @@
+name: OverrideTest_Array3
+kind: OBJECT
+fields:
+  - label: Obj
+    name: obj
+    component: object
+    collection: OverrideTest_Array3_Obj
+component: object
+label: Override Test_ Array3
+referenceField: id
+meta:
+  hash: 34791d5i8uHnVwwh6lXB/MVzq4I=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml b/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml
new file mode 100644
index 0000000..d3f89a4
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Array3_Obj
+kind: OBJECT
+fields:
+  - label: Test
+    name: test
+    component: string
+component: object
+label: Override Test_ Array3_ Obj
+referenceField: id
+meta:
+  hash: 7OMtizm7p4QC4GG9n5dL+L/uiM0=
diff --git a/packages/editor/.flatbread/schemas/override-test_-deeply.yaml b/packages/editor/.flatbread/schemas/override-test_-deeply.yaml
new file mode 100644
index 0000000..4ce06f1
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-deeply.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Deeply
+kind: OBJECT
+fields:
+  - label: Nested
+    name: nested
+    component: string
+component: object
+label: Override Test_ Deeply
+referenceField: id
+meta:
+  hash: JPYpOfi5x9JdHEush+FzeoW2Ybs=
diff --git a/packages/editor/.flatbread/schemas/override-test__content.yaml b/packages/editor/.flatbread/schemas/override-test__content.yaml
new file mode 100644
index 0000000..e274889
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__content.yaml
@@ -0,0 +1,23 @@
+name: OverrideTest__content
+kind: OBJECT
+fields:
+  - label: Excerpt
+    name: excerpt
+    description: A plaintext excerpt taken from the main content
+    component: string
+  - label: Html
+    name: html
+    description: The content as HTML
+    component: string
+  - label: Raw
+    name: raw
+    component: string
+  - label: Timetoread
+    name: timeToRead
+    description: How long (in minutes) it would take an average reader to read the main content.
+    component: int
+component: object
+label: Override Test__content
+referenceField: id
+meta:
+  hash: vuNQhfGHdxZdWDR+JoDUvw9iWoY=
diff --git a/packages/editor/.flatbread/schemas/override-test__metadata.yaml b/packages/editor/.flatbread/schemas/override-test__metadata.yaml
new file mode 100644
index 0000000..7625bde
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__metadata.yaml
@@ -0,0 +1,30 @@
+name: OverrideTest__metadata
+kind: OBJECT
+fields:
+  - label: Collection
+    name: collection
+    component: string
+  - label: Reference
+    name: reference
+    component: string
+  - label: Referencefield
+    name: referenceField
+    component: string
+  - label: Sourcedby
+    name: sourcedBy
+    component: string
+  - label: Transformcontext
+    name: transformContext
+    component: json
+  - label: Transformedby
+    name: transformedBy
+    component: string
+  - label: Sourcecontext
+    name: sourceContext
+    component: object
+    collection: OverrideTest__metadata_SourceContext
+component: object
+label: Override Test__metadata
+referenceField: id
+meta:
+  hash: KixWfqfskAAu42t6siU5TWzQ1Jg=
diff --git a/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml
new file mode 100644
index 0000000..aa9bd11
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: OverrideTest__metadata_SourceContext
+kind: OBJECT
+fields:
+  - label: Filename
+    name: filename
+    component: string
+  - label: Path
+    name: path
+    component: string
+  - label: Slug
+    name: slug
+    component: string
+component: object
+label: Override Test__metadata_ Source Context
+referenceField: id
+meta:
+  hash: iYdBWS63mqNZRr7IFEPmfogd2tw=
diff --git a/packages/editor/.flatbread/schemas/post-category.yaml b/packages/editor/.flatbread/schemas/post-category.yaml
new file mode 100644
index 0000000..d0e2d9b
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category.yaml
@@ -0,0 +1,44 @@
+name: PostCategory
+kind: OBJECT
+fields:
+  - label: Title
+    name: title
+    component: string
+  - label: Category
+    name: category
+    component: string
+  - label: Rating
+    name: rating
+    component: float
+  - label: Slug
+    name: slug
+    component: string
+  - label: Authors
+    name: authors
+    description: All Authors that are referenced by this PostCategory
+    component: list
+  - label: Collection
+    name: _collection
+    description: The collection name
+    disabled: true
+    component: string
+  - label: Id
+    name: id
+    disabled: true
+    component: string
+  - label: Content
+    name: _content
+    disabled: true
+    component: object
+    collection: PostCategory__content
+  - label: Metadata
+    name: _metadata
+    disabled: true
+    component: object
+    collection: PostCategory__metadata
+component: object
+label: Post Category
+pluralName: Post Categories
+referenceField: title
+meta:
+  hash: tcwprbAYH9iqUyH8YR9c7zBOdPI=
diff --git a/packages/editor/.flatbread/schemas/post-category__content.yaml b/packages/editor/.flatbread/schemas/post-category__content.yaml
new file mode 100644
index 0000000..df69bc4
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__content.yaml
@@ -0,0 +1,23 @@
+name: PostCategory__content
+kind: OBJECT
+fields:
+  - label: Excerpt
+    name: excerpt
+    description: A plaintext excerpt taken from the main content
+    component: string
+  - label: Html
+    name: html
+    description: The content as HTML
+    component: string
+  - label: Raw
+    name: raw
+    component: string
+  - label: Timetoread
+    name: timeToRead
+    description: How long (in minutes) it would take an average reader to read the main content.
+    component: int
+component: object
+label: Post Category__content
+referenceField: id
+meta:
+  hash: 0WeMO01dh/WzfHFXy1myQ/oF5f0=
diff --git a/packages/editor/.flatbread/schemas/post-category__metadata.yaml b/packages/editor/.flatbread/schemas/post-category__metadata.yaml
new file mode 100644
index 0000000..165e3ac
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__metadata.yaml
@@ -0,0 +1,30 @@
+name: PostCategory__metadata
+kind: OBJECT
+fields:
+  - label: Collection
+    name: collection
+    component: string
+  - label: Reference
+    name: reference
+    component: string
+  - label: Referencefield
+    name: referenceField
+    component: string
+  - label: Sourcedby
+    name: sourcedBy
+    component: string
+  - label: Transformcontext
+    name: transformContext
+    component: json
+  - label: Transformedby
+    name: transformedBy
+    component: string
+  - label: Sourcecontext
+    name: sourceContext
+    component: object
+    collection: PostCategory__metadata_SourceContext
+component: object
+label: Post Category__metadata
+referenceField: id
+meta:
+  hash: ohMlDKpJ3ab37oMAGyO1/HM6c5c=
diff --git a/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml
new file mode 100644
index 0000000..be5d2d7
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: PostCategory__metadata_SourceContext
+kind: OBJECT
+fields:
+  - label: Filename
+    name: filename
+    component: string
+  - label: Path
+    name: path
+    component: string
+  - label: Slug
+    name: slug
+    component: string
+component: object
+label: Post Category__metadata_ Source Context
+referenceField: id
+meta:
+  hash: C5VfOGT28XiLb1SnWyM/XJIEGfE=
diff --git a/packages/editor/.flatbread/schemas/post.yaml b/packages/editor/.flatbread/schemas/post.yaml
new file mode 100644
index 0000000..effe61c
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post.yaml
@@ -0,0 +1,38 @@
+name: Post
+kind: OBJECT
+fields:
+  - label: Title
+    name: title
+    component: string
+  - label: Rating
+    name: rating
+    component: float
+  - label: Authors
+    name: authors
+    description: All Authors that are referenced by this Post
+    component: list
+  - label: Collection
+    name: _collection
+    description: The collection name
+    disabled: true
+    component: string
+  - label: Id
+    name: id
+    disabled: true
+    component: string
+  - label: Content
+    name: _content
+    disabled: true
+    component: object
+    collection: Post__content
+  - label: Metadata
+    name: _metadata
+    disabled: true
+    component: object
+    collection: Post__metadata
+component: object
+label: Post
+pluralName: Posts
+referenceField: title
+meta:
+  hash: LllYynCtbVNDF8wA8Gj5NcR/ypY=
diff --git a/packages/editor/.flatbread/schemas/post__content.yaml b/packages/editor/.flatbread/schemas/post__content.yaml
new file mode 100644
index 0000000..cc82d3e
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__content.yaml
@@ -0,0 +1,23 @@
+name: Post__content
+kind: OBJECT
+fields:
+  - label: Excerpt
+    name: excerpt
+    description: A plaintext excerpt taken from the main content
+    component: string
+  - label: Html
+    name: html
+    description: The content as HTML
+    component: string
+  - label: Raw
+    name: raw
+    component: string
+  - label: Timetoread
+    name: timeToRead
+    description: How long (in minutes) it would take an average reader to read the main content.
+    component: int
+component: object
+label: Post__content
+referenceField: id
+meta:
+  hash: KC6ZT6xj6NEQ80UolzqR3W8mJo8=
diff --git a/packages/editor/.flatbread/schemas/post__metadata.yaml b/packages/editor/.flatbread/schemas/post__metadata.yaml
new file mode 100644
index 0000000..2e31b39
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__metadata.yaml
@@ -0,0 +1,30 @@
+name: Post__metadata
+kind: OBJECT
+fields:
+  - label: Collection
+    name: collection
+    component: string
+  - label: Reference
+    name: reference
+    component: string
+  - label: Referencefield
+    name: referenceField
+    component: string
+  - label: Sourcedby
+    name: sourcedBy
+    component: string
+  - label: Transformcontext
+    name: transformContext
+    component: json
+  - label: Transformedby
+    name: transformedBy
+    component: string
+  - label: Sourcecontext
+    name: sourceContext
+    component: object
+    collection: Post__metadata_SourceContext
+component: object
+label: Post__metadata
+referenceField: id
+meta:
+  hash: MkLyV6C1rG2QFAFpCQkQfgEZK7o=
diff --git a/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml
new file mode 100644
index 0000000..67cb509
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: Post__metadata_SourceContext
+kind: OBJECT
+fields:
+  - label: Filename
+    name: filename
+    component: string
+  - label: Path
+    name: path
+    component: string
+  - label: Slug
+    name: slug
+    component: string
+component: object
+label: Post__metadata_ Source Context
+referenceField: id
+meta:
+  hash: fGr5kTUqwaMCcB0DWKZtfsEGUhg=
diff --git a/packages/editor/.flatbread/schemas/query.yaml b/packages/editor/.flatbread/schemas/query.yaml
new file mode 100644
index 0000000..2b2c640
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/query.yaml
@@ -0,0 +1,73 @@
+name: Query
+kind: OBJECT
+fields:
+  - label: Fakeauthor
+    name: fakeAuthor
+    description: fake resolver
+    component: string
+  - label: Fakeoverridetest
+    name: fakeOverrideTest
+    description: fake resolver
+    component: string
+  - label: Fakepost
+    name: fakePost
+    description: fake resolver
+    component: string
+  - label: Fakepostcategory
+    name: fakePostCategory
+    description: fake resolver
+    component: string
+  - label: Fakeyamlauthor
+    name: fakeYamlAuthor
+    description: fake resolver
+    component: string
+  - label: Allauthors
+    name: allAuthors
+    description: Return a set of Authors
+    component: list
+  - label: Alloverridetests
+    name: allOverrideTests
+    description: Return a set of OverrideTests
+    component: list
+  - label: Allpostcategories
+    name: allPostCategories
+    description: Return a set of PostCategories
+    component: list
+  - label: Allposts
+    name: allPosts
+    description: Return a set of Posts
+    component: list
+  - label: Allyamlauthors
+    name: allYamlAuthors
+    description: Return a set of YamlAuthors
+    component: list
+  - label: Author
+    name: Author
+    description: Find one Author by its ID
+    component: object
+    collection: Author
+  - label: Overridetest
+    name: OverrideTest
+    description: Find one OverrideTest by its ID
+    component: object
+    collection: OverrideTest
+  - label: Post
+    name: Post
+    description: Find one Post by its ID
+    component: object
+    collection: Post
+  - label: Postcategory
+    name: PostCategory
+    description: Find one PostCategory by its ID
+    component: object
+    collection: PostCategory
+  - label: Yamlauthor
+    name: YamlAuthor
+    description: Find one YamlAuthor by its ID
+    component: object
+    collection: YamlAuthor
+component: object
+label: Query
+referenceField: id
+meta:
+  hash: iqYXAmXfI7xEPRotyw5ZH37w2L4=
diff --git a/packages/editor/.flatbread/schemas/svimg.yaml b/packages/editor/.flatbread/schemas/svimg.yaml
new file mode 100644
index 0000000..1c1ea54
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/svimg.yaml
@@ -0,0 +1,33 @@
+name: Svimg
+description: An Image Optimized by Svimg
+kind: OBJECT
+fields:
+  - label: Aspectratio
+    name: aspectratio
+    description: Aspect ratio of image
+    component: float
+  - label: Placeholder
+    name: placeholder
+    description: 'inline blurred placeholder image -- returns null if disabled via skipPlaceholder: true in config'
+    component: string
+  - label: Raw
+    name: raw
+    description: The raw value supplied from config
+    component: string
+  - label: Srcset
+    name: srcset
+    description: Responsive images and widths
+    component: string
+  - label: Srcsetavif
+    name: srcsetavif
+    description: 'Responsive Avif images and widths -- returns null if disabled via avif: false in config'
+    component: string
+  - label: Srcsetwebp
+    name: srcsetwebp
+    description: 'Responsive WebP images and widths -- returns null if disabled via webp: false in config'
+    component: string
+component: object
+label: Svimg
+referenceField: id
+meta:
+  hash: GnCxN+wFSZ8m4KacYt/7Yoaw/xk=
diff --git a/packages/editor/.flatbread/schemas/yaml-author.yaml b/packages/editor/.flatbread/schemas/yaml-author.yaml
new file mode 100644
index 0000000..c3211d0
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author.yaml
@@ -0,0 +1,46 @@
+name: YamlAuthor
+kind: OBJECT
+fields:
+  - label: Name
+    name: name
+    component: string
+  - label: Date joined
+    name: date_joined
+    component: date
+  - label: Enjoys
+    name: enjoys
+    component: list
+  - label: Friend
+    name: friend
+    description: The YamlAuthor referenced by this YamlAuthor
+    component: object
+    collection: YamlAuthor
+  - label: Skills
+    name: skills
+    component: object
+    collection: YamlAuthor_Skills
+  - label: Collection
+    name: _collection
+    description: The collection name
+    disabled: true
+    component: string
+  - label: Id
+    name: id
+    disabled: true
+    component: string
+  - label: Content
+    name: _content
+    disabled: true
+    component: object
+    collection: YamlAuthor__content
+  - label: Metadata
+    name: _metadata
+    disabled: true
+    component: object
+    collection: YamlAuthor__metadata
+component: object
+label: Yaml Author
+pluralName: Yaml Authors
+referenceField: name
+meta:
+  hash: 6Qoac76cYXfo2rmktr9sRMg7bbU=
diff --git a/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml b/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml
new file mode 100644
index 0000000..a7e1995
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml
@@ -0,0 +1,26 @@
+name: YamlAuthor_Skills
+kind: OBJECT
+fields:
+  - label: Breathing
+    name: breathing
+    component: float
+  - label: Cat pat
+    name: cat_pat
+    component: float
+  - label: Existence
+    name: existence
+    component: string
+  - label: Liquid consumption
+    name: liquid_consumption
+    component: float
+  - label: Sitting
+    name: sitting
+    component: float
+  - label: Sports
+    name: sports
+    component: float
+component: object
+label: Yaml Author_ Skills
+referenceField: id
+meta:
+  hash: MUOpWQ0pjfaKHhaaOYZsP7fQFsA=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__content.yaml b/packages/editor/.flatbread/schemas/yaml-author__content.yaml
new file mode 100644
index 0000000..c5a3921
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__content.yaml
@@ -0,0 +1,20 @@
+name: YamlAuthor__content
+kind: OBJECT
+fields:
+  - label: Excerpt
+    name: excerpt
+    description: A plaintext excerpt taken from the main content
+    component: string
+  - label: Html
+    name: html
+    description: The content as HTML
+    component: string
+  - label: Timetoread
+    name: timeToRead
+    description: How long (in minutes) it would take an average reader to read the main content.
+    component: int
+component: object
+label: Yaml Author__content
+referenceField: id
+meta:
+  hash: JYC+GoUaXhIhwx/Fokj49mFJq6o=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml b/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml
new file mode 100644
index 0000000..4cc57eb
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml
@@ -0,0 +1,30 @@
+name: YamlAuthor__metadata
+kind: OBJECT
+fields:
+  - label: Collection
+    name: collection
+    component: string
+  - label: Reference
+    name: reference
+    component: string
+  - label: Referencefield
+    name: referenceField
+    component: string
+  - label: Sourcedby
+    name: sourcedBy
+    component: string
+  - label: Transformcontext
+    name: transformContext
+    component: json
+  - label: Transformedby
+    name: transformedBy
+    component: string
+  - label: Sourcecontext
+    name: sourceContext
+    component: object
+    collection: YamlAuthor__metadata_SourceContext
+component: object
+label: Yaml Author__metadata
+referenceField: id
+meta:
+  hash: 4Bt4Y6vbWdX6IdRXkAHRQnAaTbY=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml
new file mode 100644
index 0000000..a5048ad
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: YamlAuthor__metadata_SourceContext
+kind: OBJECT
+fields:
+  - label: Filename
+    name: filename
+    component: string
+  - label: Path
+    name: path
+    component: string
+  - label: Slug
+    name: slug
+    component: string
+component: object
+label: Yaml Author__metadata_ Source Context
+referenceField: id
+meta:
+  hash: oysLojANVjgNVlOII6KL9GlsTYw=
diff --git a/packages/editor/.gitignore b/packages/editor/.gitignore
new file mode 100644
index 0000000..f4401a3
--- /dev/null
+++ b/packages/editor/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
diff --git a/packages/editor/.npmrc b/packages/editor/.npmrc
new file mode 100644
index 0000000..b6f27f1
--- /dev/null
+++ b/packages/editor/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/packages/editor/.prettierignore b/packages/editor/.prettierignore
new file mode 100644
index 0000000..3897265
--- /dev/null
+++ b/packages/editor/.prettierignore
@@ -0,0 +1,13 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
+
+# Ignore files for PNPM, NPM and YARN
+pnpm-lock.yaml
+package-lock.json
+yarn.lock
diff --git a/packages/editor/.prettierrc b/packages/editor/.prettierrc
new file mode 100644
index 0000000..ff2677e
--- /dev/null
+++ b/packages/editor/.prettierrc
@@ -0,0 +1,6 @@
+{
+	"useTabs": true,
+	"singleQuote": true,
+	"trailingComma": "none",
+	"printWidth": 100
+}
diff --git a/packages/editor/README.md b/packages/editor/README.md
new file mode 100644
index 0000000..5c91169
--- /dev/null
+++ b/packages/editor/README.md
@@ -0,0 +1,38 @@
+# create-svelte
+
+Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
+
+## Creating a project
+
+If you're seeing this, you've probably already done this step. Congrats!
+
+```bash
+# create a new project in the current directory
+npm create svelte@latest
+
+# create a new project in my-app
+npm create svelte@latest my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+To create a production version of your app:
+
+```bash
+npm run build
+```
+
+You can preview the production build with `npm run preview`.
+
+> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
diff --git a/packages/editor/app.html b/packages/editor/app.html
new file mode 100644
index 0000000..5b53ef7
--- /dev/null
+++ b/packages/editor/app.html
@@ -0,0 +1,12 @@
+
+
+	
+		
+		
+		
+		%sveltekit.head%
+	
+	
+		
%sveltekit.body%
+ + diff --git a/packages/editor/package.json b/packages/editor/package.json new file mode 100644 index 0000000..958beda --- /dev/null +++ b/packages/editor/package.json @@ -0,0 +1,45 @@ +{ + "name": "@flatbread/editor", + "version": "0.0.1", + "types": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "package": "svelte-kit package", + "preview": "vite preview", + "prepare": "svelte-kit sync", + "check": "svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check --plugin-search-dir=. . && eslint .", + "format": "prettier --write --plugin-search-dir=. ." + }, + "devDependencies": { + "@sveltejs/adapter-auto": "next", + "@sveltejs/kit": "next", + "@typescript-eslint/eslint-plugin": "^5.31.0", + "@typescript-eslint/parser": "^5.31.0", + "eslint": "^8.20.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-svelte3": "^4.0.0", + "prettier": "^2.7.1", + "prettier-plugin-svelte": "^2.7.0", + "sass": "^1.54.0", + "svelte": "^3.49.0", + "svelte-check": "^2.8.0", + "svelte-preprocess": "^4.10.7", + "tslib": "^2.4.0", + "typescript": "^4.7.4", + "vite": "^3.0.3" + }, + "type": "module", + "dependencies": { + "@picocss/pico": "^1.5.3", + "@types/js-yaml": "^4.0.5", + "@types/lodash-es": "^4.17.6", + "js-yaml": "^4.1.0", + "lodash-es": "^4.17.21", + "node-fetch": "^3.2.9", + "svimg": "3.1.0", + "wretch": "^1.7.10" + } +} diff --git a/packages/editor/pnpm-lock.yaml b/packages/editor/pnpm-lock.yaml new file mode 100644 index 0000000..e4ec314 --- /dev/null +++ b/packages/editor/pnpm-lock.yaml @@ -0,0 +1,1965 @@ +lockfileVersion: 5.4 + +specifiers: + '@sveltejs/adapter-auto': next + '@sveltejs/kit': next + '@typescript-eslint/eslint-plugin': ^5.27.0 + '@typescript-eslint/parser': ^5.27.0 + eslint: ^8.16.0 + eslint-config-prettier: ^8.3.0 + eslint-plugin-svelte3: ^4.0.0 + prettier: ^2.6.2 + prettier-plugin-svelte: ^2.7.0 + svelte: ^3.44.0 + svelte-check: ^2.7.1 + svelte-preprocess: ^4.10.6 + tslib: ^2.3.1 + typescript: ^4.7.4 + vite: ^3.0.0 + +devDependencies: + '@sveltejs/adapter-auto': 1.0.0-next.64 + '@sveltejs/kit': 1.0.0-next.396_svelte@3.49.0+vite@3.0.3 + '@typescript-eslint/eslint-plugin': 5.31.0_d5zwcxr4bwkhmuo464cb3a2puu + '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa + eslint: 8.20.0 + eslint-config-prettier: 8.5.0_eslint@8.20.0 + eslint-plugin-svelte3: 4.0.0_piwa6j2njmnknm35bh3wz5v52y + prettier: 2.7.1 + prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi + svelte: 3.49.0 + svelte-check: 2.8.0_svelte@3.49.0 + svelte-preprocess: 4.10.7_uslzfc62di2n2otc2tvfklnwji + tslib: 2.4.0 + typescript: 4.7.4 + vite: 3.0.3 + +packages: + + /@cloudflare/workers-types/3.14.1: + resolution: {integrity: sha512-B1/plF62pt+H2IJHvApK8fdOJAVsvojvacuac8x8s+JIyqbropMyqNqHTKLm3YD8ZFLGwYeFTudU+PQ7vGvBdA==} + dev: true + + /@eslint/eslintrc/1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.2 + globals: 13.17.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@iarna/toml/2.2.5: + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@mapbox/node-pre-gyp/1.0.9: + resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.7 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.3.7 + tar: 6.1.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@sveltejs/adapter-auto/1.0.0-next.64: + resolution: {integrity: sha512-Q8DwcS6wl1GovzS9JJzaD/WL/Lfk1ur4nAF1HtmsUvZDpsPBVDqnK2AhYU4G3oFNiuHstrjAogMy5th8ptSFGw==} + dependencies: + '@sveltejs/adapter-cloudflare': 1.0.0-next.31 + '@sveltejs/adapter-netlify': 1.0.0-next.71 + '@sveltejs/adapter-vercel': 1.0.0-next.66 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@sveltejs/adapter-cloudflare/1.0.0-next.31: + resolution: {integrity: sha512-HhEFZP72GJ8AZGgFECKIiayDcLaAWi65pI0AnBfiNhCifYSlH/mPNWNVD4AWRDnXnH6XU+FLwhGDnIDwytTyYg==} + dependencies: + '@cloudflare/workers-types': 3.14.1 + esbuild: 0.14.50 + worktop: 0.8.0-next.14 + dev: true + + /@sveltejs/adapter-netlify/1.0.0-next.71: + resolution: {integrity: sha512-la1CGtWO1xul1L3zEoFAoc4EX2uxZjrZcOMS3tkKB8drxhbQsNbnTE6fmSSMFiZXhxaikczrBgQwqIaDkLTmZg==} + dependencies: + '@iarna/toml': 2.2.5 + esbuild: 0.14.50 + set-cookie-parser: 2.5.1 + tiny-glob: 0.2.9 + dev: true + + /@sveltejs/adapter-vercel/1.0.0-next.66: + resolution: {integrity: sha512-s3Hcxu9nCG/rR3C3cFbdQGjTa5W4K2kRcc6S5Xefx7itbrw+4v3KpO8ZPB6qM55XDwVxuG7260NMHVI6MUGmSA==} + dependencies: + '@vercel/nft': 0.21.0 + esbuild: 0.14.50 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@sveltejs/kit/1.0.0-next.396_svelte@3.49.0+vite@3.0.3: + resolution: {integrity: sha512-bKFpuzp9QxPkOIOEIeNeedvxEMORNqBPxUmoJXDP/Se7MrSfcxYiamjBcKrG+bgGNWmV39nD3EvUox+CXno/Ig==} + engines: {node: '>=16.9'} + hasBin: true + peerDependencies: + svelte: ^3.44.0 + vite: ^3.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.3 + chokidar: 3.5.3 + sade: 1.8.1 + svelte: 3.49.0 + vite: 3.0.3 + transitivePeerDependencies: + - diff-match-patch + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.3: + resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^3.0.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.2.2 + kleur: 4.1.5 + magic-string: 0.26.2 + svelte: 3.49.0 + svelte-hmr: 0.14.12_svelte@3.49.0 + vite: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/node/18.6.1: + resolution: {integrity: sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg==} + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/sass/1.43.1: + resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} + dependencies: + '@types/node': 18.6.1 + dev: true + + /@typescript-eslint/eslint-plugin/5.31.0_d5zwcxr4bwkhmuo464cb3a2puu: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa + '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa + debug: 4.3.4 + eslint: 8.20.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.31.0_he2ccbldppg44uulnyq4rwocfa: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4 + debug: 4.3.4 + eslint: 8.20.0 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.31.0: + resolution: {integrity: sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 + dev: true + + /@typescript-eslint/type-utils/5.31.0_he2ccbldppg44uulnyq4rwocfa: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa + debug: 4.3.4 + eslint: 8.20.0 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.31.0: + resolution: {integrity: sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.31.0_typescript@4.7.4: + resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.31.0_he2ccbldppg44uulnyq4rwocfa: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4 + eslint: 8.20.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.20.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.31.0: + resolution: {integrity: sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.31.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vercel/nft/0.21.0: + resolution: {integrity: sha512-hFCAETfI5cG8l5iAiLhMC2bReC5K7SIybzrxGorv+eGspIbIFsVw7Vg85GovXm/LxA08pIDrAlrhR6GN36XB/Q==} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.9 + acorn: 8.8.0 + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + node-gyp-build: 4.5.0 + resolve-from: 5.0.0 + rollup-pluginutils: 2.8.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.0 + dev: true + + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /async-sema/3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /es6-promise/3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild-android-64/0.14.50: + resolution: {integrity: sha512-H7iUEm7gUJHzidsBlFPGF6FTExazcgXL/46xxLo6i6bMtPim6ZmXyTccS8yOMpy6HAC6dPZ/JCQqrkkin69n6Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.14.50: + resolution: {integrity: sha512-NFaoqEwa+OYfoYVpQWDMdKII7wZZkAjtJFo1WdnBeCYlYikvUhTnf2aPwPu5qEAw/ie1NYK0yn3cafwP+kP+OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.14.50: + resolution: {integrity: sha512-gDQsCvGnZiJv9cfdO48QqxkRV8oKAXgR2CGp7TdIpccwFdJMHf8hyIJhMW/05b/HJjET/26Us27Jx91BFfEVSA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.14.50: + resolution: {integrity: sha512-36nNs5OjKIb/Q50Sgp8+rYW/PqirRiFN0NFc9hEvgPzNJxeJedktXwzfJSln4EcRFRh5Vz4IlqFRScp+aiBBzA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.14.50: + resolution: {integrity: sha512-/1pHHCUem8e/R86/uR+4v5diI2CtBdiWKiqGuPa9b/0x3Nwdh5AOH7lj+8823C6uX1e0ufwkSLkS+aFZiBCWxA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.14.50: + resolution: {integrity: sha512-iKwUVMQztnPZe5pUYHdMkRc9aSpvoV1mkuHlCoPtxZA3V+Kg/ptpzkcSY+fKd0kuom+l6Rc93k0UPVkP7xoqrw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.14.50: + resolution: {integrity: sha512-sWUwvf3uz7dFOpLzYuih+WQ7dRycrBWHCdoXJ4I4XdMxEHCECd8b7a9N9u7FzT6XR2gHPk9EzvchQUtiEMRwqw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.14.50: + resolution: {integrity: sha512-u0PQxPhaeI629t4Y3EEcQ0wmWG+tC/LpP2K7yDFvwuPq0jSQ8SIN+ARNYfRjGW15O2we3XJvklbGV0wRuUCPig==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.14.50: + resolution: {integrity: sha512-VALZq13bhmFJYFE/mLEb+9A0w5vo8z+YDVOWeaf9vOTrSC31RohRIwtxXBnVJ7YKLYfEMzcgFYf+OFln3Y0cWg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.14.50: + resolution: {integrity: sha512-ZyfoNgsTftD7Rp5S7La5auomKdNeB3Ck+kSKXC4pp96VnHyYGjHHXWIlcbH8i+efRn9brszo1/Thl1qn8RqmhQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.14.50: + resolution: {integrity: sha512-ygo31Vxn/WrmjKCHkBoutOlFG5yM9J2UhzHb0oWD9O61dGg+Hzjz9hjf5cmM7FBhAzdpOdEWHIrVOg2YAi6rTw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.14.50: + resolution: {integrity: sha512-xWCKU5UaiTUT6Wz/O7GKP9KWdfbsb7vhfgQzRfX4ahh5NZV4ozZ4+SdzYG8WxetsLy84UzLX3Pi++xpVn1OkFQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.14.50: + resolution: {integrity: sha512-0+dsneSEihZTopoO9B6Z6K4j3uI7EdxBP7YSF5rTwUgCID+wHD3vM1gGT0m+pjCW+NOacU9kH/WE9N686FHAJg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.14.50: + resolution: {integrity: sha512-tVjqcu8o0P9H4StwbIhL1sQYm5mWATlodKB6dpEZFkcyTI8kfIGWiWcrGmkNGH2i1kBUOsdlBafPxR3nzp3TDA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.14.50: + resolution: {integrity: sha512-0R/glfqAQ2q6MHDf7YJw/TulibugjizBxyPvZIcorH0Mb7vSimdHy0XF5uCba5CKt+r4wjax1mvO9lZ4jiAhEg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.14.50: + resolution: {integrity: sha512-7PAtmrR5mDOFubXIkuxYQ4bdNS6XCK8AIIHUiZxq1kL8cFIH5731jPcXQ4JNy/wbj1C9sZ8rzD8BIM80Tqk29w==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.14.50: + resolution: {integrity: sha512-gBxNY/wyptvD7PkHIYcq7se6SQEXcSC8Y7mE0FJB+CGgssEWf6vBPfTTZ2b6BWKnmaP6P6qb7s/KRIV5T2PxsQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.14.50: + resolution: {integrity: sha512-MOOe6J9cqe/iW1qbIVYSAqzJFh0p2LBLhVUIWdMVnNUNjvg2/4QNX4oT4IzgDeldU+Bym9/Tn6+DxvUHJXL5Zw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.14.50: + resolution: {integrity: sha512-r/qE5Ex3w1jjGv/JlpPoWB365ldkppUlnizhMxJgojp907ZF1PgLTuW207kgzZcSCXyquL9qJkMsY+MRtaZ5yQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.14.50: + resolution: {integrity: sha512-EMS4lQnsIe12ZyAinOINx7eq2mjpDdhGZZWDwPZE/yUTN9cnc2Ze/xUTYIAyaJqrqQda3LnDpADKpvLvol6ENQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.14.50: + resolution: {integrity: sha512-SbC3k35Ih2IC6trhbMYW7hYeGdjPKf9atTKwBUHqMCYFZZ9z8zhuvfnZihsnJypl74FjiAKjBRqFkBkAd0rS/w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.50 + esbuild-android-arm64: 0.14.50 + esbuild-darwin-64: 0.14.50 + esbuild-darwin-arm64: 0.14.50 + esbuild-freebsd-64: 0.14.50 + esbuild-freebsd-arm64: 0.14.50 + esbuild-linux-32: 0.14.50 + esbuild-linux-64: 0.14.50 + esbuild-linux-arm: 0.14.50 + esbuild-linux-arm64: 0.14.50 + esbuild-linux-mips64le: 0.14.50 + esbuild-linux-ppc64le: 0.14.50 + esbuild-linux-riscv64: 0.14.50 + esbuild-linux-s390x: 0.14.50 + esbuild-netbsd-64: 0.14.50 + esbuild-openbsd-64: 0.14.50 + esbuild-sunos-64: 0.14.50 + esbuild-windows-32: 0.14.50 + esbuild-windows-64: 0.14.50 + esbuild-windows-arm64: 0.14.50 + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier/8.5.0_eslint@8.20.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.20.0 + dev: true + + /eslint-plugin-svelte3/4.0.0_piwa6j2njmnknm35bh3wz5v52y: + resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} + peerDependencies: + eslint: '>=8.0.0' + svelte: ^3.2.0 + dependencies: + eslint: 8.20.0 + svelte: 3.49.0 + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.20.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.20.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.20.0: + resolution: {integrity: sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.0 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.20.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.2 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.17.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.3.2: + resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.0 + acorn-jsx: 5.3.2_acorn@8.8.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker/0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.6 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalyzer/0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.11 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /minipass/3.3.4: + resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + yallist: 4.0.0 + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp-build/4.5.0: + resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} + hasBin: true + dev: true + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi: + resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==} + peerDependencies: + prettier: ^1.16.4 || ^2.0.0 + svelte: ^3.2.0 + dependencies: + prettier: 2.7.1 + svelte: 3.49.0 + dev: true + + /prettier/2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regexparam/2.0.1: + resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} + engines: {node: '>=8'} + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-pluginutils/2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup/2.77.1: + resolution: {integrity: sha512-GhutNJrvTYD6s1moo+kyq7lD9DeR5HDyXo4bDFlDSkepC9kVKY+KK/NSZFzCmeXeia3kEzVuToQmHRdugyZHxw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /sander/0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-cookie-parser/2.5.1: + resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /sorcery/0.10.0: + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.6 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check/2.8.0_svelte@3.49.0: + resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.14 + chokidar: 3.5.3 + fast-glob: 3.2.11 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.49.0 + svelte-preprocess: 4.10.7_uslzfc62di2n2otc2tvfklnwji + typescript: 4.7.4 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.14.12_svelte@3.49.0: + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.49.0 + dev: true + + /svelte-preprocess/4.10.7_uslzfc62di2n2otc2tvfklnwji: + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.43.1 + detect-indent: 6.1.0 + magic-string: 0.25.9 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.49.0 + typescript: 4.7.4 + dev: true + + /svelte/3.49.0: + resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==} + engines: {node: '>= 8'} + dev: true + + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.4 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /tiny-glob/0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true + + /tsutils/3.21.0_typescript@4.7.4: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.7.4 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript/4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /vite/3.0.3: + resolution: {integrity: sha512-sDIpIcl3mv1NUaSzZwiXGEy1ZoWwwC2vkxUHY6yiDacR6zf//ZFuBJrozO62gedpE43pmxnLATNR5IYUdAEkMQ==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.14.50 + postcss: 8.4.14 + resolve: 1.22.1 + rollup: 2.77.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /worktop/0.8.0-next.14: + resolution: {integrity: sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==} + engines: {node: '>=12'} + dependencies: + mrmime: 1.0.1 + regexparam: 2.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true diff --git a/packages/editor/src/app.d.ts b/packages/editor/src/app.d.ts new file mode 100644 index 0000000..b28d840 --- /dev/null +++ b/packages/editor/src/app.d.ts @@ -0,0 +1,11 @@ +/// + +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +// and what to do when importing types +declare namespace App { + // interface Locals {} + // interface Platform {} + // interface Session {} + // interface Stuff {} +} diff --git a/packages/editor/src/app.html b/packages/editor/src/app.html new file mode 100644 index 0000000..5b53ef7 --- /dev/null +++ b/packages/editor/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/editor/src/hooks.ts b/packages/editor/src/hooks.ts new file mode 100644 index 0000000..95e7641 --- /dev/null +++ b/packages/editor/src/hooks.ts @@ -0,0 +1,46 @@ +import { getGqlTypes } from '$lib/api'; +import { getNameFromLabel } from '$lib/schema'; +import type { QueryCollection, GqlSchema, Schema } from '$lib/types'; + +/** @type {import('@sveltejs/kit').GetSession} */ +export function getSession(event) { + return { + ...event.locals + }; +} + +/** @type {import('@sveltejs/kit').Handle} */ +export async function handle({ event, resolve }) { + if (event.url.pathname.startsWith('/custom')) { + return new Response('custom response'); + } + + // TODO: figure out how to expose config for sub objects like Author_Skills + // maybe merge these types into the parent type under sub types? + // maybe transform all __schema.types into their own schema instead of targeting type Query + + // transform gqlTypes first, then attach schemas + + const { gqlTypes, queryListFields } = await getGqlTypes(); + + const queryTypesList = queryListFields + .map<[string, QueryCollection]>((field) => { + const newField = field as QueryCollection; + newField.schema = gqlTypes.get(newField?.type?.ofType?.name as string) as Schema; + newField.label = getNameFromLabel(newField.name); + return [field.name, newField]; + }) + .sort((a, b) => a[1].schema.pluralName.localeCompare(b[1].schema.pluralName)); + + const queryTypes = new Map(queryTypesList); + + // gqlTypes.set('Query', queryTypes); + + event.locals = { + gqlTypes, + queryTypes + }; + + const response = await resolve(event); + return response; +} diff --git a/packages/editor/src/lib/JsonCrush.ts b/packages/editor/src/lib/JsonCrush.ts new file mode 100644 index 0000000..4b3d63b --- /dev/null +++ b/packages/editor/src/lib/JsonCrush.ts @@ -0,0 +1,10 @@ +// import JSONCrush from 'jsoncrush'; + +// export default class JsonCrush { +// static crush(obj: any) { +// return encodeURIComponent(JSONCrush.crush(JSON.stringify(obj))); +// } +// static parse(str: string) { +// return JSON.parse(JSONCrush.uncrush(str)); +// } +// } diff --git a/packages/editor/src/lib/api.ts b/packages/editor/src/lib/api.ts new file mode 100644 index 0000000..f8fd241 --- /dev/null +++ b/packages/editor/src/lib/api.ts @@ -0,0 +1,157 @@ +import type { GqlSchema, Schema } from '$lib/types'; +import { keyBy } from 'lodash-es'; +import wretch from 'wretch'; +import Config from './config'; +import { transformSchema } from './schema'; + +const api = wretch().url('http://localhost:5057/graphql'); + +export async function getSchema() { + const schema = await api + .post({ + query: ` + query Schema { + __schema { + types { + name + kind + description + } + } + }` + }) + .json(); + return schema.data.__schema; +} + +export async function getCollectionFields(name: string) { + const schema = await api + .post({ + query: ` + query CollectionFields { + __type(name: "${name}") { + name + description + fields { + name + description + type { + kind + name + ofType { + name + kind + } + } + } + } + } + ` + }) + .json(); + return schema.data.__type; +} + +export async function getGqlTypes() { + const result = await api + .post({ + query: `query CollectionFields { + __schema { + types { + name + description + kind + fields { + name + description + type { + kind + name + ofType { + name + kind + } + } + } + } + } + }` + }) + .json(); + + const types: GqlSchema[] = result.data.__schema.types; + const queryListFields = (types.find((t) => t.name === 'Query') as GqlSchema).fields.filter( + (t) => t.type.kind === 'LIST' + ); + const querySchema = keyBy(queryListFields, 'type.ofType.name'); + + const gqlTypes = await Promise.all( + types.map>(async (t) => { + const shouldConfig = !t.name.startsWith('__') && t.kind === 'OBJECT'; + const schema = transformSchema(t, querySchema); + return [t.name, shouldConfig ? await Config.get(t.name, schema) : schema]; + }) + ); + + return { + gqlTypes: new Map(gqlTypes), + queryListFields + }; +} + +interface GetCollectionQueryArgs { + visits?: number; + visited?: Record; + depth?: number; +} + +function getCollectionQuery( + collectionName: string, + gqlTypes: Map, + { visits = 2, depth = Infinity, visited = {} }: GetCollectionQueryArgs +): string { + const collection = gqlTypes.get(collectionName); + + // TODO: fields that exist in schema but not in graphql fail because they don't have field.type + + return ( + collection?.fields + .map((field) => { + if (field.type.kind === 'SCALAR' || field.type.ofType?.kind === 'SCALAR') return field.name; + const kind: string = field.type.kind === 'LIST' ? field.type.ofType.name : field.type.name; + depth--; + if (depth < 0) return ''; + if (visited[kind] > visits) return ''; + visited[kind] = (visited[kind] ?? 0) + 1; + return `${field.name} { ${getCollectionQuery(kind, gqlTypes, { + depth, + visited, + visits + })} }`; + }) + .join(' ') ?? '' + ); +} + +function getFilter(filter: any) { + if (!filter) return ''; + return `(filter: ${filter})`; +} + +interface QueryCollectionArgs extends GetCollectionQueryArgs { + query: string; + collection: string; + filter?: any; +} + +export async function queryCollection(args: QueryCollectionArgs, gqlTypes: Map) { + const { query, collection, filter, ...rest } = args; + const gqlQuery = `{ + ${query}${getFilter(filter)} { + ${getCollectionQuery(collection, gqlTypes, rest)} + } + } + `; + const results = await api.post({ query: gqlQuery }).json(); + return results.data[args.query]; +} diff --git a/packages/editor/src/lib/breadcrumbs.svelte b/packages/editor/src/lib/breadcrumbs.svelte new file mode 100644 index 0000000..86f1cad --- /dev/null +++ b/packages/editor/src/lib/breadcrumbs.svelte @@ -0,0 +1,51 @@ + + +
+ {#if allowBack} + c.path).path} + > + + + + + {/if} + {#each breadcrumbs as crumb} + {#if crumb.path} + {crumb.label} + {:else} + {crumb.label} + {/if} + {/each} +
+ + diff --git a/packages/editor/src/lib/config.ts b/packages/editor/src/lib/config.ts new file mode 100644 index 0000000..5194ace --- /dev/null +++ b/packages/editor/src/lib/config.ts @@ -0,0 +1,86 @@ +import yaml from 'js-yaml'; +import { isArray, isEqual, keyBy, merge, mergeWith } from 'lodash-es'; +import crypto from 'node:crypto'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import type { GqlSchema, Schema } from './types'; + +function replacer(key, value) { + if (key === 'type') return undefined; + if (value === null) return undefined; + if (value === '') return undefined; + if (key === 'disabled' && value === false) return undefined; + return value; +} + +// TODO: capture +interface Field { + label: string; + name: string; + description: string; + component: string; +} + +export default class Config { + static getPath(schema: GqlSchema) { + return path.resolve( + process.cwd(), + '.flatbread', + 'schemas', + `${schema.name + .replace(/([A-Z])/g, '-$1') + .replace(/^\-/, '') + .toLowerCase()}.yaml` + ); + } + static async exists(schema: GqlSchema) { + try { + return await fs.stat(this.getPath(schema)); + } catch (e) { + console.log('does not exist'); + return false; + } + } + + static async get(collectionName: string, schema: Schema) { + let existing; + let filePath = this.getPath(schema); + + //if the file exists load it and merge the fresh graphql schema into it + if (await this.exists(schema)) { + const file = await fs.readFile(filePath, 'utf-8'); + existing = yaml.load(file); + + schema = mergeWith(schema, existing, function (a, b) { + if (isArray(a)) { + const aMap = new Map(a.map((a) => [a.name, a])); + return b + .map((field: Field) => { + const cur = aMap.get(field.name); + if (!cur) return; + aMap.delete(field.name); + return merge(cur, field); + }) + .concat(...aMap.values()); + } + }); + } else { + await fs.mkdir(path.dirname(filePath), { recursive: true }); + } + + // attach a meta tag and get an accurate hash for caching + const meta = schema.meta ?? {}; + schema.meta = undefined; + meta.hash = crypto.createHmac('sha1', JSON.stringify(schema)).digest('base64'); + schema.meta = meta; + + // if the hash doesn't match the file hash, update it + if (!isEqual(existing?.meta?.hash, schema?.meta?.hash)) { + console.log('writing config', collectionName); + + await fs.writeFile(filePath, yaml.dump(schema, { flowLevel: 3, replacer }), 'utf-8'); + } + + return schema; + } +} diff --git a/packages/editor/src/lib/field-component.svelte b/packages/editor/src/lib/field-component.svelte new file mode 100644 index 0000000..e9995c1 --- /dev/null +++ b/packages/editor/src/lib/field-component.svelte @@ -0,0 +1,17 @@ + + +{#if !field.hidden} + +{/if} diff --git a/packages/editor/src/lib/fields/date.svelte b/packages/editor/src/lib/fields/date.svelte new file mode 100644 index 0000000..6f66985 --- /dev/null +++ b/packages/editor/src/lib/fields/date.svelte @@ -0,0 +1,15 @@ + + + diff --git a/packages/editor/src/lib/fields/float.svelte b/packages/editor/src/lib/fields/float.svelte new file mode 100644 index 0000000..87d0edf --- /dev/null +++ b/packages/editor/src/lib/fields/float.svelte @@ -0,0 +1,16 @@ + + + diff --git a/packages/editor/src/lib/fields/int.svelte b/packages/editor/src/lib/fields/int.svelte new file mode 100644 index 0000000..87d0edf --- /dev/null +++ b/packages/editor/src/lib/fields/int.svelte @@ -0,0 +1,16 @@ + + + diff --git a/packages/editor/src/lib/fields/list.svelte b/packages/editor/src/lib/fields/list.svelte new file mode 100644 index 0000000..3853f8a --- /dev/null +++ b/packages/editor/src/lib/fields/list.svelte @@ -0,0 +1,26 @@ + + +
+

{field.label}

+ {#if field.description}{field.description}{/if} +
+ {#each items as value} +
+ +
+ {/each} +
+
diff --git a/packages/editor/src/lib/fields/object.svelte b/packages/editor/src/lib/fields/object.svelte new file mode 100644 index 0000000..018b8fb --- /dev/null +++ b/packages/editor/src/lib/fields/object.svelte @@ -0,0 +1,93 @@ + + + +{#if value} +
+

+ {#if !isRoot} + {#if !inList} + {field?.label} + {:else} + {get(value, collection.referenceField)} + {/if} + {/if} +

+ {#if !inList && field.description}{field.description}{/if} +
+ {#each editableFields as field} + {#if !field.hidden} + {#if field.component === 'object'} + + {:else} + + {/if} + {/if} + {/each} + {#if disabledFields.length > 0} +
+ Show disabled fields +
+ {#each disabledFields as field} + {#if field.component === 'object'} + + {:else} + + {/if} + {/each} +
+
+ {/if} +
+
+{/if} + + diff --git a/packages/editor/src/lib/fields/raw.svelte b/packages/editor/src/lib/fields/raw.svelte new file mode 100644 index 0000000..3598dd8 --- /dev/null +++ b/packages/editor/src/lib/fields/raw.svelte @@ -0,0 +1,22 @@ + + + diff --git a/packages/editor/src/lib/fields/string.svelte b/packages/editor/src/lib/fields/string.svelte new file mode 100644 index 0000000..613b9c3 --- /dev/null +++ b/packages/editor/src/lib/fields/string.svelte @@ -0,0 +1,16 @@ + + + diff --git a/packages/editor/src/lib/fields/svimg.svelte b/packages/editor/src/lib/fields/svimg.svelte new file mode 100644 index 0000000..62ad22b --- /dev/null +++ b/packages/editor/src/lib/fields/svimg.svelte @@ -0,0 +1,28 @@ + + + diff --git a/packages/editor/src/lib/header.svelte b/packages/editor/src/lib/header.svelte new file mode 100644 index 0000000..4579641 --- /dev/null +++ b/packages/editor/src/lib/header.svelte @@ -0,0 +1,63 @@ + + + + + diff --git a/packages/editor/src/lib/preferences.ts b/packages/editor/src/lib/preferences.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/editor/src/lib/schema.ts b/packages/editor/src/lib/schema.ts new file mode 100644 index 0000000..0f3a56e --- /dev/null +++ b/packages/editor/src/lib/schema.ts @@ -0,0 +1,66 @@ +import { capitalize } from 'lodash-es'; +import type { Field, GqlField, GqlSchema, GqlType, Schema } from './types'; + +export function getComponentType(type: GqlType) { + const { kind, name } = type; + if (kind === 'SCALAR') return name.toLowerCase(); + return kind.toLowerCase(); +} + +export function getNameFromLabel(label?: string) { + if (!label) return ''; + return label + .replace(/^all/, '') + .replace(/([A-Z])/g, ' $1') + .trim(); +} + +// sort specific fields higher than the rest, in order +const fieldSortWeights = ['name', 'title']; + +function weightedSort(a: string, b: string) { + const aw = fieldSortWeights.indexOf(a); + const bw = fieldSortWeights.indexOf(b); + if (aw < 0 && bw < 0) return undefined; + return fieldSortWeights.length - aw - (fieldSortWeights.length - bw); +} + +export function transformSchema(schema: GqlSchema, querySchemaFieldMap: Record) { + const fields: Field[] = + schema.fields + ?.map((field: GqlField): Field => { + return { + label: capitalize(field.name.replace(/_+/g, ' ').trim()), + name: field.name, + description: field.description, + type: field.type, + disabled: field.name.startsWith('_') || field.name === 'id', + component: getComponentType(field.type), + collection: field.type.kind === 'OBJECT' ? field.type.name : undefined + }; + }) + .sort((a: Field, b: Field) => { + if (a.disabled && !b.disabled) return 1; + if (!a.disabled && b.disabled) return -1; + if (a.type.kind !== 'SCALAR' && b.type.kind === 'SCALAR') return 1; + if (a.type.kind === 'SCALAR' && b.type.kind !== 'SCALAR') return -1; + + return ( + weightedSort(a.name.toLowerCase(), b.name.toLowerCase()) ?? a.name.localeCompare(b.name) + ); + }) || []; + + const referenceField = + ['name', 'title'].find((fieldName) => fields.find((field) => field.name === fieldName)) ?? 'id'; + + const result: Schema = { + ...schema, + component: schema.kind.toLowerCase(), + label: getNameFromLabel(schema.name), + pluralName: getNameFromLabel(querySchemaFieldMap[schema.name]?.name), + referenceField, + fields + }; + + return result; +} diff --git a/packages/editor/src/lib/schemaStore.ts b/packages/editor/src/lib/schemaStore.ts new file mode 100644 index 0000000..c4fe435 --- /dev/null +++ b/packages/editor/src/lib/schemaStore.ts @@ -0,0 +1,4 @@ +import { writable } from 'svelte/store'; + +export const gqlTypesStore = writable(new Map()); +export const queryTypesStore = writable(new Map()); diff --git a/packages/editor/src/lib/types.ts b/packages/editor/src/lib/types.ts new file mode 100644 index 0000000..02e2d9b --- /dev/null +++ b/packages/editor/src/lib/types.ts @@ -0,0 +1,51 @@ +export interface GqlType { + kind: string; + name: string; +} + +export interface GqlField { + name: string; + description?: string; + type: GqlType & { ofType?: GqlType }; +} + +export interface GqlSchema { + name: string; + pluralName: string; + description?: string; + kind: string; + fields: GqlField[]; +} + +export interface Field extends GqlField { + label: string; + disabled?: boolean; + component: string; + collection?: string; +} + +export interface Schema extends GqlSchema { + fields: Field[]; + pluralName: string; + component: string; + label: string; + referenceField: string; +} + +export interface QueryCollection extends GqlField { + schema: Schema; + label: string; +} + +export interface Session { + queryTypes: Map; + gqlTypes: Map; +} + +export function isField(obj: Field | GqlSchema): obj is Field { + return Object.hasOwn(obj, 'type') && !Object.hasOwn(obj, 'fields'); +} + +export function isGqlSchema(obj: Field | GqlSchema): obj is GqlSchema { + return !Object.hasOwn(obj, 'type') && Object.hasOwn(obj, 'fields'); +} diff --git a/packages/editor/src/lib/utils.ts b/packages/editor/src/lib/utils.ts new file mode 100644 index 0000000..ba3fd31 --- /dev/null +++ b/packages/editor/src/lib/utils.ts @@ -0,0 +1,11 @@ +import { getStores } from '$app/stores'; +import type { Session } from '$lib/types'; +import { get } from 'svelte/store'; + +export function getSession() { + return get(getStores().session) as Session; +} + +export function sanitizeGlobImport([key, value]: [string, any]) { + return [key.replace(/^.*\//, '').replace(/\..*$/, ''), value.default]; +} diff --git a/packages/editor/src/routes/__layout.svelte b/packages/editor/src/routes/__layout.svelte new file mode 100644 index 0000000..cd84a70 --- /dev/null +++ b/packages/editor/src/routes/__layout.svelte @@ -0,0 +1,105 @@ + + + + + + diff --git a/packages/editor/src/routes/collection/[name]/[id].svelte b/packages/editor/src/routes/collection/[name]/[id].svelte new file mode 100644 index 0000000..0c93ee3 --- /dev/null +++ b/packages/editor/src/routes/collection/[name]/[id].svelte @@ -0,0 +1,61 @@ + + + + +
+ +
+
+

Edit {querySchema.schema.label}

+
+ + +
diff --git a/packages/editor/src/routes/collection/[name]/index.svelte b/packages/editor/src/routes/collection/[name]/index.svelte new file mode 100644 index 0000000..fdb827e --- /dev/null +++ b/packages/editor/src/routes/collection/[name]/index.svelte @@ -0,0 +1,79 @@ + + + + +
+ + +
+
+

{collection.pluralName}

+ + + {#each visibleFields as field} + + {/each} + + {#each results as row} + location.assign(`/collection/${querySchema.name}/${row.id}`)} + > + {#each visibleFields as field} + + {/each} + + {/each} +
{field.label}
+
+ + diff --git a/packages/editor/src/routes/collection/[name]/new.svelte b/packages/editor/src/routes/collection/[name]/new.svelte new file mode 100644 index 0000000..72e6c48 --- /dev/null +++ b/packages/editor/src/routes/collection/[name]/new.svelte @@ -0,0 +1,46 @@ + + + + +
+ +
+
+
+ {#each collection.fields as field} + + {/each} + +
diff --git a/packages/editor/src/routes/index.svelte b/packages/editor/src/routes/index.svelte new file mode 100644 index 0000000..6ae23ab --- /dev/null +++ b/packages/editor/src/routes/index.svelte @@ -0,0 +1,22 @@ + + +
+
+

Welcome to Leaven

+ +
diff --git a/packages/editor/static/favicon.png b/packages/editor/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/packages/editor/static/favicon.png differ diff --git a/packages/editor/svelte.config.js b/packages/editor/svelte.config.js new file mode 100644 index 0000000..892f0c4 --- /dev/null +++ b/packages/editor/svelte.config.js @@ -0,0 +1,15 @@ +import adapter from '@sveltejs/adapter-auto'; +import preprocess from 'svelte-preprocess'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: preprocess(), + + kit: { + adapter: adapter() + } +}; + +export default config; diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json new file mode 100644 index 0000000..51c4dc7 --- /dev/null +++ b/packages/editor/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "paths": { + "$lib": ["src/lib"], + "$lib/*": ["src/lib/*"] + } + } +} diff --git a/packages/editor/vite.config.js b/packages/editor/vite.config.js new file mode 100644 index 0000000..8747050 --- /dev/null +++ b/packages/editor/vite.config.js @@ -0,0 +1,8 @@ +import { sveltekit } from '@sveltejs/kit/vite'; + +/** @type {import('vite').UserConfig} */ +const config = { + plugins: [sveltekit()] +}; + +export default config; diff --git a/packages/flatbread/README.md b/packages/flatbread/README.md index 1447a96..54f813c 100644 --- a/packages/flatbread/README.md +++ b/packages/flatbread/README.md @@ -83,6 +83,10 @@ export default defineConfig({ { path: 'content/authors', collection: 'Author', + // the field to use as the primary key, 'id' by default + referenceField: 'id', + // a list of fields that are required when creating a new record (mostly used by plugins) + creationRequiredFields: [] refs: { friend: 'Author', }, diff --git a/packages/flatbread/content/authors/me.md b/packages/flatbread/content/authors/me.md index 408dc67..200f732 100644 --- a/packages/flatbread/content/authors/me.md +++ b/packages/flatbread/content/authors/me.md @@ -8,7 +8,7 @@ enjoys: - making this date_joined: 2021-02-25T16:41:59.558Z skills: - sitting: 204 + sitting: 71 breathing: 7.07 liquid_consumption: 100 existence: simulation diff --git a/packages/resolver-svimg/src/index.ts b/packages/resolver-svimg/src/index.ts index 27fd828..f2008cb 100644 --- a/packages/resolver-svimg/src/index.ts +++ b/packages/resolver-svimg/src/index.ts @@ -24,6 +24,9 @@ type Svimg { """Aspect ratio of image""" aspectratio: Float + + """The raw value supplied from config""" + raw: String }`; /** @@ -37,9 +40,12 @@ export function createSvImgField(field: string, config: Omit) { return { field, type: SVIMG_TYPE, - resolve(src: string) { + async resolve(src: string) { if (!src) return null; - return generateComponentAttributes({ queue, ...config, src }); + return { + ...(await generateComponentAttributes({ queue, ...config, src })), + raw: src, + }; }, }; } diff --git a/packages/source-filesystem/package.json b/packages/source-filesystem/package.json index d8e42de..b124a57 100644 --- a/packages/source-filesystem/package.json +++ b/packages/source-filesystem/package.json @@ -38,6 +38,7 @@ }, "devDependencies": { "@flatbread/core": "workspace:*", + "@sindresorhus/slugify": "^2.1.0", "@types/lodash-es": "4.17.6", "@types/node": "16.11.47", "tsup": "6.2.1", diff --git a/packages/source-filesystem/src/index.test.ts b/packages/source-filesystem/src/index.test.ts new file mode 100644 index 0000000..6af017b --- /dev/null +++ b/packages/source-filesystem/src/index.test.ts @@ -0,0 +1,40 @@ +import test from 'ava'; +import { createPath } from './index'; + +test('create path can correctly populate a path', (t) => { + const path = createPath( + { + name: 'Test', + path: '/[test]/[nested.test]/[blah].md', + }, + { + test: 'first', + nested: { + test: 'second-part', + }, + blah: 'blarghhh', + }, + { extension: '' } + ); + + t.is(path, '/first/second-part/blarghhh.md'); +}); + +test('create path can correctly populate a path without an extension', (t) => { + const path = createPath( + { + name: 'Test', + path: '/[test]/[nested.test]/[blah]', + }, + { + test: 'first', + nested: { + test: 'second-part', + }, + blah: 'blarghhh', + }, + { extension: '.md', reference: 'test-name', referenceField: 'id' } + ); + + t.is(path, '/first/second-part/blarghhh/test-name.md'); +}); diff --git a/packages/source-filesystem/src/index.ts b/packages/source-filesystem/src/index.ts index 461cf0d..b478760 100644 --- a/packages/source-filesystem/src/index.ts +++ b/packages/source-filesystem/src/index.ts @@ -1,7 +1,13 @@ -import { defaultsDeep } from 'lodash-es'; -import { read } from 'to-vfile'; - -import type { LoadedFlatbreadConfig, SourcePlugin } from '@flatbread/core'; +import type { + CollectionEntry, + FlatbreadArgs, + LoadedCollectionEntry, + LoadedFlatbreadConfig, +} from '@flatbread/core'; +import slugify from '@sindresorhus/slugify'; +import { defaultsDeep, get } from 'lodash-es'; +import path, { relative, resolve } from 'path'; +import { read, write } from 'to-vfile'; import type { VFile } from 'vfile'; import type { FileNode, @@ -10,6 +16,12 @@ import type { } from './types'; import gatherFileNodes from './utils/gatherFileNodes'; +interface Context { + filename?: string; + path: string; + slug: string; +} + /** * Get nodes (files) from the directory * @@ -18,17 +30,30 @@ import gatherFileNodes from './utils/gatherFileNodes'; * @returns An array of content nodes */ async function getNodesFromDirectory( - path: string, + collectionEntry: LoadedCollectionEntry, + { addRecord, addCreationRequiredFields }: FlatbreadArgs, config: InitializedSourceFilesystemConfig -): Promise { +): Promise { const { extensions } = config; - const nodes: FileNode[] = await gatherFileNodes(path, { extensions }); + const nodes: FileNode[] = await gatherFileNodes(collectionEntry.path, { + extensions, + }); - return Promise.all( - nodes.map(async (node: FileNode): Promise => { - const file = await read(node.path); - file.data = node.data; - return file; + // collect all the variable path segments [like] [these] + const requiredFields = Array.from( + collectionEntry.path.matchAll(/\[(.*?)\]/g) + ).map((m) => m[1]); + addCreationRequiredFields(collectionEntry, requiredFields); + + await Promise.all( + nodes.map(async (node: FileNode): Promise => { + const doc = await read(node.path); + doc.data = node.data; + addRecord(collectionEntry, doc, { + filename: doc.basename, + path: relative(process.cwd(), doc.path), + slug: slugify(doc.stem ?? ''), + }); }) ); } @@ -40,26 +65,57 @@ async function getNodesFromDirectory( * @returns */ async function getAllNodes( - allContentTypes: Record[], + allCollectionEntries: LoadedCollectionEntry[], + flatbread: FlatbreadArgs, config: InitializedSourceFilesystemConfig -): Promise> { - const nodeEntries = await Promise.all( - allContentTypes.map( +): Promise { + await Promise.all( + allCollectionEntries.map( async (contentType): Promise> => new Promise(async (res) => res([ - contentType.collection, - await getNodesFromDirectory(contentType.path, config), + contentType.name, + await getNodesFromDirectory(contentType, flatbread, config), ]) ) ) ); +} - const nodes = Object.fromEntries( - nodeEntries as Iterable +export function createPath( + collection: CollectionEntry, + record: any, + parentContext: any +): string { + const partialPath = collection.path.replace( + /\[(.*?)\]/g, + (_: any, match: any) => get(record, match) ); - return nodes; + const filename = path.parse(partialPath); + + if (!filename.ext) { + return resolve( + partialPath, + parentContext.reference + parentContext.extension + ); + } + + return partialPath; +} + +async function put( + doc: VFile, + context: Context, + { parentContext, collection, record }: any +) { + const path = context?.path ?? createPath(collection, record, parentContext); + doc.basename = context?.filename ?? parentContext.reference; + doc.path = resolve(process.cwd(), path); + + await write(doc); + + return { doc, context }; } /** @@ -68,7 +124,8 @@ async function getAllNodes( * @param sourceConfig content types config * @returns A function that returns functions which fetch lists of nodes */ -export const source: SourcePlugin = (sourceConfig?: sourceFilesystemConfig) => { + +export function source(sourceConfig?: sourceFilesystemConfig) { let config: InitializedSourceFilesystemConfig; return { @@ -76,10 +133,12 @@ export const source: SourcePlugin = (sourceConfig?: sourceFilesystemConfig) => { const { extensions } = flatbreadConfig.loaded; config = defaultsDeep(sourceConfig ?? {}, { extensions }); }, - fetchByType: (path: string) => getNodesFromDirectory(path, config), - fetch: (allContentTypes: Record[]) => - getAllNodes(allContentTypes, config), + fetch: ( + content: LoadedCollectionEntry[], + flatbread: FlatbreadArgs + ) => getAllNodes(content, flatbread, config), + put, }; -}; +} export default source; diff --git a/packages/source-filesystem/src/utils/gatherFileNodes.ts b/packages/source-filesystem/src/utils/gatherFileNodes.ts index 8f88063..a4bdf66 100644 --- a/packages/source-filesystem/src/utils/gatherFileNodes.ts +++ b/packages/source-filesystem/src/utils/gatherFileNodes.ts @@ -41,6 +41,11 @@ export default async function gatherFileNodes( path: string, { readDirectory = readDir, extensions }: GatherFileNodesOptions = {} ): Promise { + if (path.includes('*')) + throw new Error( + `* wildcards are not supported, only variable named paths like [example]\nPlease change path in config "${path}"` + ); + /** * Prepend a period to the extension if it doesn't have one. * If no extensions are provided, use the default ones. @@ -51,7 +56,7 @@ export default async function gatherFileNodes( ) ?? ['.md', '.mdx', '.markdown']; // gather all the globs in the path ( [capture-groups], **, *) - const [pathPrefix, ...globs] = path.split(/\/(?:\[|\*+)/); + const [pathPrefix, ...globs] = path.split(/\/(?:\[)/); // for each segment - gather names for capture groups // and calculate what to remove from matches ex: [name].md => remove .md from match diff --git a/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts b/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts index e9b2699..67bc313 100644 --- a/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts +++ b/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts @@ -32,20 +32,20 @@ test('basic case', async (t) => { t.snapshot(result2); }); -test('double level recursion', async (t) => { - const result = await gatherFileNodes('deeply/**/*.md', opts); - t.snapshot(result); -}); +// test('double level recursion', async (t) => { +// const result = await gatherFileNodes('deeply/**/*.md', opts); +// t.snapshot(result); +// }); test('double level recursion named', async (t) => { const result = await gatherFileNodes('deeply/[a]/[b].md', opts); t.snapshot(result); }); -test('single level recursion', async (t) => { - const result = await gatherFileNodes('./*.md', opts as any); - t.snapshot(result); -}); +// test('single level recursion', async (t) => { +// const result = await gatherFileNodes('./*.md', opts as any); +// t.snapshot(result); +// }); test('double level recursion named without parent directory', async (t) => { const result = await gatherFileNodes('./[genre]/[title].md', opts); @@ -57,15 +57,15 @@ test('single level named', async (t) => { t.snapshot(result); }); -test('double level first named', async (t) => { - const result = await gatherFileNodes('./[genre]/*.md', opts); - t.snapshot(result); -}); +// test('double level first named', async (t) => { +// const result = await gatherFileNodes('./[genre]/*.md', opts); +// t.snapshot(result); +// }); -test('double level second named', async (t) => { - const result = await gatherFileNodes('./**/[title].md', opts); - t.snapshot(result); -}); +// test('double level second named', async (t) => { +// const result = await gatherFileNodes('./**/[title].md', opts); +// t.snapshot(result); +// }); test('triple level', async (t) => { const result = await gatherFileNodes('./[random]/[name]/[title].md', opts); diff --git a/packages/source-filesystem/tsup.config.ts b/packages/source-filesystem/tsup.config.ts index 24b848e..fa78cb5 100644 --- a/packages/source-filesystem/tsup.config.ts +++ b/packages/source-filesystem/tsup.config.ts @@ -4,7 +4,7 @@ export const tsup: Options = { splitting: false, sourcemap: true, clean: true, - entryPoints: ['src/*'], + entryPoints: ['src/index.ts'], format: ['esm'], target: 'esnext', dts: true, diff --git a/packages/transformer-markdown/package.json b/packages/transformer-markdown/package.json index c97d380..3f6888b 100644 --- a/packages/transformer-markdown/package.json +++ b/packages/transformer-markdown/package.json @@ -32,7 +32,6 @@ "node": "^14.13.1 || >=16.0.0" }, "dependencies": { - "@sindresorhus/slugify": "^2.1.0", "graphql": "16.5.0", "gray-matter": "^4.0.3", "lodash-es": "^4.17.21", diff --git a/packages/transformer-markdown/src/index.ts b/packages/transformer-markdown/src/index.ts index 54d5a01..eb8dd08 100644 --- a/packages/transformer-markdown/src/index.ts +++ b/packages/transformer-markdown/src/index.ts @@ -1,10 +1,14 @@ import matter from 'gray-matter'; -import slugify from '@sindresorhus/slugify'; -import { html, excerpt, timeToRead } from './graphql/schema-helpers'; +import { excerpt, html, timeToRead } from './graphql/schema-helpers'; +import ownPackage from '../package.json' assert { type: 'json' }; +import type { + CollectionContext, + EntryNode, + TransformerPlugin, +} from '@flatbread/core'; +import { VFile } from 'vfile'; import type { MarkdownTransformerConfig } from './types'; -import type { EntryNode, TransformerPlugin } from '@flatbread/core'; -import type { VFile } from 'vfile'; export * from './types'; @@ -20,17 +24,27 @@ export const parse = ( ): EntryNode => { const { data, content } = matter(String(input), config.grayMatter); return { - _filename: input.basename, - _path: input.path, - _slug: slugify(input.stem ?? ''), - ...input.data, - ...data, - _content: { - raw: content, + record: { + ...input.data, + ...data, + _content: { + raw: content, + }, }, }; }; +function serialize( + data: EntryNode, + ctx: CollectionContext, + config: MarkdownTransformerConfig +) { + const { _content, ...rest } = data; + const doc = matter.stringify(_content?.raw ?? '', rest, config.grayMatter); + + return new VFile(doc); +} + /** * Converts markdown files to meaningful data. * @@ -45,6 +59,7 @@ export const transformer: TransformerPlugin = ( ); return { parse: (input: VFile): EntryNode => parse(input, config), + id: ownPackage.name, preknownSchemaFragments: () => ({ _content: { html: html(config), @@ -53,6 +68,8 @@ export const transformer: TransformerPlugin = ( }, }), inspect: (input: EntryNode) => String(input), + serialize: (input: EntryNode, ctx: CollectionContext) => + serialize(input, ctx, config), extensions, }; }; diff --git a/packages/transformer-yaml/package.json b/packages/transformer-yaml/package.json index 761722e..0857c7d 100644 --- a/packages/transformer-yaml/package.json +++ b/packages/transformer-yaml/package.json @@ -32,7 +32,6 @@ "node": "^14.13.1 || >=16.0.0" }, "dependencies": { - "@sindresorhus/slugify": "^2.1.0", "js-yaml": "^4.1.0" }, "devDependencies": { diff --git a/packages/transformer-yaml/src/index.ts b/packages/transformer-yaml/src/index.ts index f5b36ed..b16cf86 100644 --- a/packages/transformer-yaml/src/index.ts +++ b/packages/transformer-yaml/src/index.ts @@ -1,8 +1,12 @@ -import yaml from 'js-yaml'; +import type { + CollectionContext, + EntryNode, + TransformerPlugin, +} from '@flatbread/core'; import type { YAMLException } from 'js-yaml'; -import slugify from '@sindresorhus/slugify'; -import type { EntryNode, TransformerPlugin } from '@flatbread/core'; -import type { VFile } from 'vfile'; +import yaml from 'js-yaml'; +import { VFile } from 'vfile'; +import ownPackage from '../package.json' assert { type: 'json' }; /** * Transforms a yaml file (content node) to JSON. @@ -18,11 +22,10 @@ export const parse = (input: VFile): EntryNode => { if (typeof doc === 'object') { return { - _filename: input.basename, - _path: input.path, - _slug: slugify(input.stem ?? ''), - ...input.data, - ...doc, + record: { + ...input.data, + ...doc, + }, }; } throw new Error( @@ -32,15 +35,22 @@ export const parse = (input: VFile): EntryNode => { ); }; +function serialize(node: EntryNode, ctx: CollectionContext): VFile { + const doc = yaml.dump(node); + return new VFile(doc); +} + /** - * Converts markdown files to meaningful data. + * Converts yaml files to meaningful data. * - * @returns Markdown parser, preknown GraphQL schema fragments, and an EntryNode inspector function. + * @returns yaml parser, preknown GraphQL schema fragments, and an EntryNode inspector function. */ export const transformer: TransformerPlugin = () => { return { parse: (input: VFile): EntryNode => parse(input), inspect: (input: EntryNode) => String(input), + id: ownPackage.name, + serialize, extensions: ['.yaml', '.yml'], }; }; diff --git a/packages/transformer-yaml/src/tests/index.test.ts b/packages/transformer-yaml/src/tests/index.test.ts index ba28b06..5246dee 100644 --- a/packages/transformer-yaml/src/tests/index.test.ts +++ b/packages/transformer-yaml/src/tests/index.test.ts @@ -26,6 +26,6 @@ const transformer = Transformer(); test('it can parse a basic yaml file', async (t) => { const parse = transformer.parse as (input: VFile) => EntryNode; - const node = parse(testFile); - t.snapshot(node); + const { record } = parse(testFile); + t.snapshot(record); }); diff --git a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md index 4174cf4..ee33163 100644 --- a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md +++ b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md @@ -9,9 +9,6 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 { - _filename: undefined, - _path: undefined, - _slug: '', date_joined: Date 2021-02-25 16:41:59 558ms UTC {}, enjoys: [ 'cats', diff --git a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap index 8de1e40..b68787a 100644 Binary files a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap and b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39bf7a9..809041f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,6 +156,7 @@ importers: lodash-es: 4.17.21 lru-cache: 7.13.2 matcher: 5.0.0 + nanoid: 4.0.0 plur: 5.1.0 tsup: 6.2.1 typescript: 4.7.4 @@ -167,6 +168,7 @@ importers: lodash-es: 4.17.21 lru-cache: 7.13.2 matcher: 5.0.0 + nanoid: 4.0.0 plur: 5.1.0 devDependencies: '@types/lodash-es': 4.17.6 @@ -175,6 +177,59 @@ importers: typescript: 4.7.4 vfile: 5.3.4 + packages/editor: + specifiers: + '@picocss/pico': ^1.5.3 + '@sveltejs/adapter-auto': next + '@sveltejs/kit': next + '@types/js-yaml': ^4.0.5 + '@types/lodash-es': ^4.17.6 + '@typescript-eslint/eslint-plugin': ^5.31.0 + '@typescript-eslint/parser': ^5.31.0 + eslint: ^8.20.0 + eslint-config-prettier: ^8.5.0 + eslint-plugin-svelte3: ^4.0.0 + js-yaml: ^4.1.0 + lodash-es: ^4.17.21 + node-fetch: ^3.2.9 + prettier: ^2.7.1 + prettier-plugin-svelte: ^2.7.0 + sass: ^1.54.0 + svelte: ^3.49.0 + svelte-check: ^2.8.0 + svelte-preprocess: ^4.10.7 + svimg: 3.1.0 + tslib: ^2.4.0 + typescript: ^4.7.4 + vite: ^3.0.3 + wretch: ^1.7.10 + dependencies: + '@picocss/pico': 1.5.3 + '@types/js-yaml': 4.0.5 + '@types/lodash-es': 4.17.6 + js-yaml: 4.1.0 + lodash-es: 4.17.21 + node-fetch: 3.2.10 + svimg: 3.1.0 + wretch: 1.7.10 + devDependencies: + '@sveltejs/adapter-auto': 1.0.0-next.64 + '@sveltejs/kit': 1.0.0-next.405_svelte@3.49.0+vite@3.0.4 + '@typescript-eslint/eslint-plugin': 5.33.0_njno5y7ry2l2lcmiu4tywxkwnq + '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq + eslint: 8.21.0 + eslint-config-prettier: 8.5.0_eslint@8.21.0 + eslint-plugin-svelte3: 4.0.0_a7wk4ghvg4hia4trwaglu7p6cq + prettier: 2.7.1 + prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi + sass: 1.54.4 + svelte: 3.49.0 + svelte-check: 2.8.0_sass@1.54.4+svelte@3.49.0 + svelte-preprocess: 4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm + tslib: 2.4.0 + typescript: 4.7.4 + vite: 3.0.4_sass@1.54.4 + packages/flatbread: specifiers: '@apollo/utils.keyvaluecache': ^1.0.1 @@ -251,6 +306,7 @@ importers: packages/source-filesystem: specifiers: '@flatbread/core': workspace:* + '@sindresorhus/slugify': ^2.1.0 '@types/lodash-es': 4.17.6 '@types/node': 16.11.47 lodash-es: ^4.17.21 @@ -265,6 +321,7 @@ importers: unified: 10.1.2 devDependencies: '@flatbread/core': link:../core + '@sindresorhus/slugify': 2.1.0 '@types/lodash-es': 4.17.6 '@types/node': 16.11.47 tsup: 6.2.1_typescript@4.7.4 @@ -274,7 +331,6 @@ importers: packages/transformer-markdown: specifiers: '@flatbread/core': workspace:* - '@sindresorhus/slugify': ^2.1.0 '@types/node': 16.11.47 '@types/sanitize-html': 2.6.2 graphql: 16.5.0 @@ -304,7 +360,6 @@ importers: unified: ^10.1.2 vfile: 5.3.4 dependencies: - '@sindresorhus/slugify': 2.1.0 graphql: 16.5.0 gray-matter: 4.0.3 lodash-es: 4.17.21 @@ -339,7 +394,6 @@ importers: packages/transformer-yaml: specifiers: '@flatbread/core': workspace:* - '@sindresorhus/slugify': ^2.1.0 '@types/js-yaml': 4.0.5 '@types/node': 16.11.47 js-yaml: ^4.1.0 @@ -347,7 +401,6 @@ importers: typescript: 4.7.4 vfile: 5.3.4 dependencies: - '@sindresorhus/slugify': 2.1.0 js-yaml: 4.1.0 devDependencies: '@flatbread/core': link:../core @@ -818,6 +871,10 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@cloudflare/workers-types/3.14.1: + resolution: {integrity: sha512-B1/plF62pt+H2IJHvApK8fdOJAVsvojvacuac8x8s+JIyqbropMyqNqHTKLm3YD8ZFLGwYeFTudU+PQ7vGvBdA==} + dev: true + /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -859,7 +916,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false optional: true /@eslint/eslintrc/0.4.3: @@ -879,6 +935,23 @@ packages: - supports-color dev: true + /@eslint/eslintrc/1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.3 + globals: 13.15.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@graphql-tools/merge/8.3.0_graphql@16.5.0: resolution: {integrity: sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA==} peerDependencies: @@ -922,6 +995,17 @@ packages: tslib: 2.4.0 dev: false + /@humanwhocodes/config-array/0.10.4: + resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -933,10 +1017,18 @@ packages: - supports-color dev: true + /@humanwhocodes/gitignore-to-minimatch/1.0.2: + resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} + dev: true + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@iarna/toml/2.2.5: + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + dev: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1165,6 +1257,24 @@ packages: type-detect: 4.0.8 dev: true + /@mapbox/node-pre-gyp/1.0.9: + resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.7 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.3.7 + tar: 6.1.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@next/env/12.2.3: resolution: {integrity: sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q==} dev: false @@ -1464,6 +1574,10 @@ packages: typescript: 4.7.4 dev: true + /@picocss/pico/1.5.3: + resolution: {integrity: sha512-ZdZOxjlmj0BkpGpYo/ODgAcFpqIgpAACqEmIgpFtxHkam06ITfUfcj9+mPcd+Ti8Dh0KCSvHpmSnJA3+tOStlQ==} + dev: false + /@protobufjs/aspromise/1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -1552,7 +1666,7 @@ packages: dependencies: '@sindresorhus/transliterate': 1.5.0 escape-string-regexp: 5.0.0 - dev: false + dev: true /@sindresorhus/transliterate/1.5.0: resolution: {integrity: sha512-/sfSkoNelLq5riqNRp5uBjHIKBi1MWZk9ubRT1WiBQuTfmDf7BeQkph2DJzRB83QagMPHk2VDjuvpy0VuwyzdA==} @@ -1560,7 +1674,7 @@ packages: dependencies: escape-string-regexp: 5.0.0 lodash.deburr: 4.1.0 - dev: false + dev: true /@sinonjs/commons/1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} @@ -1574,10 +1688,48 @@ packages: '@sinonjs/commons': 1.8.3 dev: true + /@sveltejs/adapter-auto/1.0.0-next.64: + resolution: {integrity: sha512-Q8DwcS6wl1GovzS9JJzaD/WL/Lfk1ur4nAF1HtmsUvZDpsPBVDqnK2AhYU4G3oFNiuHstrjAogMy5th8ptSFGw==} + dependencies: + '@sveltejs/adapter-cloudflare': 1.0.0-next.31 + '@sveltejs/adapter-netlify': 1.0.0-next.71 + '@sveltejs/adapter-vercel': 1.0.0-next.66 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@sveltejs/adapter-cloudflare/1.0.0-next.31: + resolution: {integrity: sha512-HhEFZP72GJ8AZGgFECKIiayDcLaAWi65pI0AnBfiNhCifYSlH/mPNWNVD4AWRDnXnH6XU+FLwhGDnIDwytTyYg==} + dependencies: + '@cloudflare/workers-types': 3.14.1 + esbuild: 0.14.53 + worktop: 0.8.0-next.14 + dev: true + + /@sveltejs/adapter-netlify/1.0.0-next.71: + resolution: {integrity: sha512-la1CGtWO1xul1L3zEoFAoc4EX2uxZjrZcOMS3tkKB8drxhbQsNbnTE6fmSSMFiZXhxaikczrBgQwqIaDkLTmZg==} + dependencies: + '@iarna/toml': 2.2.5 + esbuild: 0.14.53 + set-cookie-parser: 2.5.1 + tiny-glob: 0.2.9 + dev: true + /@sveltejs/adapter-static/1.0.0-next.39: resolution: {integrity: sha512-EeD39H6iEe0UEKnKxLFTZFZpi/FcX5xfbAvsMQ+B09aDZccpQmkJBSIo+4kq1JsQGSjwi/+J3aE9bR67R6CIyQ==} dev: true + /@sveltejs/adapter-vercel/1.0.0-next.66: + resolution: {integrity: sha512-s3Hcxu9nCG/rR3C3cFbdQGjTa5W4K2kRcc6S5Xefx7itbrw+4v3KpO8ZPB6qM55XDwVxuG7260NMHVI6MUGmSA==} + dependencies: + '@vercel/nft': 0.21.0 + esbuild: 0.14.53 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@sveltejs/kit/1.0.0-next.405_svelte@3.49.0+vite@3.0.4: resolution: {integrity: sha512-jHSa74F7k+hC+0fof75g/xm/+1M5sM66Qt6v8eLLMSgjkp36Lb5xOioBhbl6w0NYoE5xysLsBWuu+yHytfvCBA==} engines: {node: '>=16.9'} @@ -1592,7 +1744,7 @@ packages: sade: 1.8.1 svelte: 3.49.0 tiny-glob: 0.2.9 - vite: 3.0.4 + vite: 3.0.4_sass@1.54.4 transitivePeerDependencies: - diff-match-patch - supports-color @@ -1616,7 +1768,7 @@ packages: magic-string: 0.26.2 svelte: 3.49.0 svelte-hmr: 0.14.12_svelte@3.49.0 - vite: 3.0.4 + vite: 3.0.4_sass@1.54.4 transitivePeerDependencies: - supports-color dev: true @@ -1765,7 +1917,6 @@ packages: /@types/js-yaml/4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: true /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} @@ -1779,11 +1930,9 @@ packages: resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==} dependencies: '@types/lodash': 4.14.182 - dev: true /@types/lodash/4.14.182: resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} - dev: true /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} @@ -1959,6 +2108,33 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin/5.33.0_njno5y7ry2l2lcmiu4tywxkwnq: + resolution: {integrity: sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/scope-manager': 5.33.0 + '@typescript-eslint/type-utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq + debug: 4.3.4 + eslint: 8.21.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/experimental-utils/4.33.0_hxadhbs2xogijvk7vq4t2azzbu: resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2017,6 +2193,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.33.0 + '@typescript-eslint/types': 5.33.0 + '@typescript-eslint/typescript-estree': 5.33.0_typescript@4.7.4 + debug: 4.3.4 + eslint: 8.21.0 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/4.33.0: resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -2033,6 +2229,33 @@ packages: '@typescript-eslint/visitor-keys': 5.30.7 dev: true + /@typescript-eslint/scope-manager/5.33.0: + resolution: {integrity: sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.33.0 + '@typescript-eslint/visitor-keys': 5.33.0 + dev: true + + /@typescript-eslint/type-utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq + debug: 4.3.4 + eslint: 8.21.0 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types/4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -2043,6 +2266,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types/5.33.0: + resolution: {integrity: sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/4.33.0_typescript@4.7.4: resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2085,6 +2313,45 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree/5.33.0_typescript@4.7.4: + resolution: {integrity: sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.33.0 + '@typescript-eslint/visitor-keys': 5.33.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.33.0 + '@typescript-eslint/types': 5.33.0 + '@typescript-eslint/typescript-estree': 5.33.0_typescript@4.7.4 + eslint: 8.21.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.21.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys/4.33.0: resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -2101,10 +2368,42 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@typescript-eslint/visitor-keys/5.33.0: + resolution: {integrity: sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.33.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vercel/nft/0.21.0: + resolution: {integrity: sha512-hFCAETfI5cG8l5iAiLhMC2bReC5K7SIybzrxGorv+eGspIbIFsVw7Vg85GovXm/LxA08pIDrAlrhR6GN36XB/Q==} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.9 + acorn: 8.8.0 + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + node-gyp-build: 4.5.0 + resolve-from: 5.0.0 + rollup-pluginutils: 2.8.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2128,6 +2427,14 @@ packages: acorn: 7.4.1 dev: true + /acorn-jsx/5.3.2_acorn@8.8.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.0 + dev: true + /acorn-node/1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: @@ -2384,6 +2691,18 @@ packages: - encoding dev: false + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: true + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -2488,6 +2807,10 @@ packages: retry: 0.13.1 dev: false + /async-sema/3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: true + /async/3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true @@ -2670,6 +2993,12 @@ packages: engines: {node: '>=8'} dev: true + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: true + /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -2948,6 +3277,11 @@ packages: /chownr/1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + /chunkd/2.0.1: resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} dev: true @@ -3083,6 +3417,11 @@ packages: color-name: 1.1.4 simple-swizzle: 0.2.2 + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + /color/4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -3136,6 +3475,10 @@ packages: well-known-symbols: 2.0.0 dev: true + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -3247,6 +3590,11 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /data-uri-to-buffer/4.0.0: + resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} + engines: {node: '>= 12'} + dev: false + /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} @@ -3369,6 +3717,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + /depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -3644,7 +3996,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false optional: true /esbuild-android-arm64/0.13.15: @@ -3679,7 +4030,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /esbuild-darwin-64/0.13.15: @@ -3714,7 +4064,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /esbuild-darwin-arm64/0.13.15: @@ -3749,7 +4098,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /esbuild-freebsd-64/0.13.15: @@ -3784,7 +4132,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true /esbuild-freebsd-arm64/0.13.15: @@ -3819,7 +4166,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false optional: true /esbuild-linux-32/0.13.15: @@ -3854,7 +4200,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-64/0.13.15: @@ -3889,7 +4234,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-arm/0.13.15: @@ -3924,7 +4268,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-arm64/0.13.15: @@ -3959,7 +4302,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-mips64le/0.13.15: @@ -3994,7 +4336,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-ppc64le/0.13.15: @@ -4029,7 +4370,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-riscv64/0.14.48: @@ -4056,7 +4396,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-linux-s390x/0.14.48: @@ -4083,7 +4422,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false optional: true /esbuild-netbsd-64/0.13.15: @@ -4118,7 +4456,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false optional: true /esbuild-openbsd-64/0.13.15: @@ -4153,7 +4490,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false optional: true /esbuild-sunos-64/0.13.15: @@ -4188,7 +4524,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false optional: true /esbuild-windows-32/0.13.15: @@ -4223,7 +4558,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /esbuild-windows-64/0.13.15: @@ -4258,7 +4592,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /esbuild-windows-arm64/0.13.15: @@ -4293,7 +4626,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /esbuild/0.13.15: @@ -4403,7 +4735,6 @@ packages: esbuild-windows-32: 0.14.53 esbuild-windows-64: 0.14.53 esbuild-windows-arm64: 0.14.53 - dev: false /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -4479,6 +4810,15 @@ packages: eslint: 7.32.0 dev: true + /eslint-config-prettier/8.5.0_eslint@8.21.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.21.0 + dev: true + /eslint-import-resolver-node/0.3.6: resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: @@ -4629,6 +4969,16 @@ packages: svelte: 3.49.0 dev: true + /eslint-plugin-svelte3/4.0.0_a7wk4ghvg4hia4trwaglu7p6cq: + resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} + peerDependencies: + eslint: '>=8.0.0' + svelte: ^3.2.0 + dependencies: + eslint: 8.21.0 + svelte: 3.49.0 + dev: true + /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -4637,6 +4987,14 @@ packages: estraverse: 4.3.0 dev: true + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -4654,6 +5012,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils/3.0.0_eslint@8.21.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.21.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -4682,36 +5050,84 @@ packages: cross-spawn: 7.0.3 debug: 4.3.4 doctrine: 3.0.0 - enquirer: 2.3.6 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.15.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.7 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.0 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint/8.21.0: + resolution: {integrity: sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.0 + '@humanwhocodes/config-array': 0.10.4 + '@humanwhocodes/gitignore-to-minimatch': 1.0.2 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.21.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.3 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 + find-up: 5.0.0 functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 + glob-parent: 6.0.2 globals: 13.15.0 - ignore: 4.0.6 + globby: 11.1.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 3.14.1 + js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 - progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.7 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.8.0 text-table: 0.2.0 v8-compile-cache: 2.3.0 transitivePeerDependencies: @@ -4734,6 +5150,15 @@ packages: eslint-visitor-keys: 1.3.0 dev: true + /espree/9.3.3: + resolution: {integrity: sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.0 + acorn-jsx: 5.3.2_acorn@8.8.0 + eslint-visitor-keys: 3.3.0 + dev: true + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -4763,6 +5188,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker/0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true @@ -4983,6 +5412,14 @@ packages: bser: 2.1.1 dev: true + /fetch-blob/3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + /figures/3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -5005,6 +5442,10 @@ packages: flat-cache: 3.0.4 dev: true + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + /filelist/1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -5053,6 +5494,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + /find-up/6.3.0: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5091,6 +5540,13 @@ packages: engines: {node: '>=0.4.x'} dev: false + /formdata-polyfill/4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -5117,6 +5573,13 @@ packages: universalify: 2.0.0 dev: true + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -5154,6 +5617,21 @@ packages: resolution: {integrity: sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==} dev: true + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5209,7 +5687,7 @@ packages: dev: true /github-from-package/0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} /github-slugger/1.4.0: resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} @@ -5328,6 +5806,10 @@ packages: tinygradient: 1.1.5 dev: false + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + /graphql-compose-json/6.2.0_graphql-compose@9.0.8: resolution: {integrity: sha512-EfY6VPu6/Rah8xCEXa7WT1W/Hyd+wJZ08HFRDtEsZx3z/WRguDXDGi0kppGXWNQDc66PtEMfWvhDDsM/J8kiRQ==} peerDependencies: @@ -5418,6 +5900,10 @@ packages: has-symbols: 1.0.3 dev: true + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -5641,6 +6127,10 @@ packages: engines: {node: '>= 4'} dev: true + /immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + dev: true + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -6582,6 +7072,13 @@ packages: p-locate: 4.1.0 dev: true + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /locate-path/7.1.1: resolution: {integrity: sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6594,7 +7091,7 @@ packages: /lodash.deburr/4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} - dev: false + dev: true /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -7225,6 +7722,21 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + /minipass/3.3.4: + resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + yallist: 4.0.0 + dev: true + /mkdirp-classic/0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -7235,10 +7747,21 @@ packages: minimist: 1.2.6 dev: true + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -7276,6 +7799,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid/4.0.0: + resolution: {integrity: sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + /napi-build-utils/1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -7346,6 +7875,11 @@ packages: /node-addon-api/5.0.0: resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==} + /node-domexception/1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-emoji/1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: @@ -7362,6 +7896,14 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + + /node-fetch/3.2.10: + resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.0 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 dev: false /node-gyp-build/4.5.0: @@ -7388,6 +7930,14 @@ packages: engines: {node: '>=12.19'} dev: true + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -7418,6 +7968,15 @@ packages: path-key: 3.1.1 dev: true + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + /nth-check/2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -7635,6 +8194,13 @@ packages: p-try: 2.2.0 dev: true + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + /p-limit/4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7655,6 +8221,13 @@ packages: p-limit: 2.3.0 dev: true + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + /p-locate/6.0.0: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7946,6 +8519,16 @@ packages: svelte: 3.49.0 dev: true + /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi: + resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==} + peerDependencies: + prettier: ^1.16.4 || ^2.0.0 + svelte: ^3.2.0 + dependencies: + prettier: 2.7.1 + svelte: 3.49.0 + dev: true + /prettier/2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} @@ -8137,6 +8720,11 @@ packages: functions-have-names: 1.2.3 dev: true + /regexparam/2.0.1: + resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} + engines: {node: '>=8'} + dev: true + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -8398,6 +8986,12 @@ packages: glob: 7.2.3 dev: true + /rollup-pluginutils/2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + /rollup/2.75.7: resolution: {integrity: sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==} engines: {node: '>=10.0.0'} @@ -8466,6 +9060,16 @@ packages: postcss: 8.4.14 dev: false + /sass/1.54.4: + resolution: {integrity: sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.1.0 + source-map-js: 1.0.2 + dev: true + /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -8553,6 +9157,14 @@ packages: - supports-color dev: false + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-cookie-parser/2.5.1: + resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + dev: true + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false @@ -8946,6 +9558,34 @@ packages: - sugarss dev: true + /svelte-check/2.8.0_sass@1.54.4+svelte@3.49.0: + resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.14 + chokidar: 3.5.3 + fast-glob: 3.2.11 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.49.0 + svelte-preprocess: 4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm + typescript: 4.7.4 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + /svelte-hmr/0.14.12_svelte@3.49.0: resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} engines: {node: ^12.20 || ^14.13.1 || >= 16} @@ -8955,6 +9595,58 @@ packages: svelte: 3.49.0 dev: true + /svelte-preprocess/4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm: + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.43.1 + detect-indent: 6.1.0 + magic-string: 0.25.9 + sass: 1.54.4 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.49.0 + typescript: 4.7.4 + dev: true + /svelte-preprocess/4.10.7_bgntxiihuqhg5mwaa7nczjwpga: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} @@ -9032,7 +9724,6 @@ packages: p-queue: 6.6.2 sharp: 0.30.7 string-replace-async: 2.0.0 - dev: true /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -9103,6 +9794,18 @@ packages: inherits: 2.0.4 readable-stream: 3.6.0 + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.4 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + /temp-dir/2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -9246,7 +9949,6 @@ packages: /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false /tr46/1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -9723,6 +10425,34 @@ packages: fsevents: 2.3.2 dev: true + /vite/3.0.4_sass@1.54.4: + resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.14.49 + postcss: 8.4.14 + resolve: 1.22.1 + rollup: 2.75.7 + sass: 1.54.4 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /w3c-hr-time/1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: @@ -9752,9 +10482,13 @@ packages: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false + /web-streams-polyfill/3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -9795,7 +10529,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -9832,11 +10565,25 @@ packages: isexe: 2.0.0 dev: true + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true + /worktop/0.8.0-next.14: + resolution: {integrity: sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==} + engines: {node: '>=12'} + dependencies: + mrmime: 1.0.1 + regexparam: 2.0.1 + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9858,6 +10605,10 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /wretch/1.7.10: + resolution: {integrity: sha512-UgF2o63bZRsz3LoOxaxzAUdFdlIJzVYbCHHhQ+LNMSBD1FeFJn8ADaekopJclHUm6sN8Lhu0DQFGQloliS0Twg==} + dev: false + /write-file-atomic/3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: @@ -9946,6 +10697,11 @@ packages: engines: {node: '>=6'} dev: true + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + /yocto-queue/1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} diff --git a/tsconfig.json b/tsconfig.json index 2de15ee..ed99ee0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,5 +24,9 @@ ] } }, + //https://github.com/avajs/ava/discussions/3036#discussioncomment-2928239 + "ts-node": { + "transpileOnly": true + }, "exclude": ["**/dist/**", "**/node_modules/**"] }