Skip to content

Commit

Permalink
Initial version
Browse files Browse the repository at this point in the history
  • Loading branch information
erickoledadevrel committed Sep 23, 2024
1 parent 05c5eb6 commit 7ea99bb
Show file tree
Hide file tree
Showing 5 changed files with 182 additions and 0 deletions.
3 changes: 3 additions & 0 deletions json5/.coda-pack.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"packId": 34513
}
135 changes: 135 additions & 0 deletions json5/pack.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import * as coda from "@codahq/packs-sdk";
import JSON5 from "json5";

const OneDaySecs = 24 * 60 * 60;

export const pack = coda.newPack();

const JSON5Param = coda.makeParameter({
type: coda.ParameterType.String,
name: "json5",
description: "The JSON5 contents as a string.",
});

const SpacesParam = coda.makeParameter({
type: coda.ParameterType.Number,
name: "spaces",
description: "The number of spaces to indent by. Default: no indenting.",
optional: true,
});

pack.addFormula({
name: "FormatJSON5",
description: "Formats JSON5 content using the options provided.",
parameters: [
JSON5Param,
SpacesParam,
coda.makeParameter({
type: coda.ParameterType.String,
name: "quote",
description: "Which quote to use around strings. Default: single quote (').",
optional: true,
autocomplete: [
{ display: `Single quote (')`, value: `'` },
{ display: `Double quote (")`, value: `"` },
],
}),
],
resultType: coda.ValueType.String,
cacheTtlSecs: OneDaySecs,
examples: [
{ params: [`{a: 1, b: "foo"}`], result: `{a:1,b:'foo'}` },
{
params: [`{a: 1, b: "foo"}`, 2],
result: trimIndent(`
{
a: 1,
b: 'foo',
}
`),
},
{ params: [`{a: 1, b: "foo"}`, 0, '"'], result: `{a:1,b:"foo"}` },
],
execute: async function (args, context) {
let [json5, space, quote] = args;
let value = parse(json5);
return JSON5.stringify(value, {space, quote});
},
});

pack.addFormula({
name: "IsValidJSON5",
description: "Returns true if the content is valid JSON5, false otherwise.",
parameters: [
JSON5Param,
],
resultType: coda.ValueType.Boolean,
cacheTtlSecs: OneDaySecs,
examples: [
{ params: [`{a: 1}`], result: true },
{ params: [`{a: 1`, ], result: false },
],
execute: async function (args, context) {
let [json5] = args;
try {
JSON5.parse(json5);
} catch (e) {
if (e.toString().startsWith("SyntaxError")) {
return false;
}
throw e;
}
return true;
},
});

pack.addFormula({
name: "ToJSON",
description: "Converts a JSON5 string to JSON.",
parameters: [
JSON5Param,
SpacesParam,
],
resultType: coda.ValueType.String,
cacheTtlSecs: OneDaySecs,
examples: [
{ params: [`{a: 1, b:'foo'}`], result: `{"a":1,"b":"foo"}` },
{
params: [`{a:1,b:'foo'}`, 2],
result: trimIndent(`
{
"a": 1,
"b": "foo"
}
`)
},
],
execute: async function (args, context) {
let [json5, spaces] = args;
let value = parse(json5);
return JSON.stringify(value, null, spaces);
},
});

function parse(json5: string) {
try {
return JSON5.parse(json5);
} catch (e) {
if (e.toString().startsWith("SyntaxError")) {
throw new coda.UserVisibleError(e);
}
throw e;
}
}

function trimIndent(str: string) {
let lines = str.split("\n");
if (lines[0] == "") {
lines = lines.slice(1);
}
if (lines.at(-1) == "") {
lines = lines.slice(0, -1);
}
let indent = lines[0].match(/^\s*/)[0].length;
return lines.map(line => line.substring(indent)).join("\n").trim();
}
26 changes: 26 additions & 0 deletions json5/tests/pack_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {executeFormulaFromPackDef} from '@codahq/packs-sdk/dist/development';
import {pack} from '../pack';
import * as chai from "chai";
import {assert} from "chai";
import {describe} from "mocha";
import {it} from "mocha";
import chaiAsPromised from "chai-as-promised";
chai.use(chaiAsPromised);
chai.should();

describe("Examples", () => {
for (let formula of pack.formulas) {
describe(formula.name, () => {
for (let [i, example] of formula.examples.entries()) {
it(`Example ${i}`, async () => {
const result = await executeFormulaFromPackDef(pack, formula.name, example.params as any);
if (typeof example.result == "object") {
assert.deepEqual(result, example.result);
} else {
assert.equal(result, example.result);
}
});
}
});
}
});
17 changes: 17 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"hsl-to-hex": "^1.0.0",
"hue-colors": "^0.5.4",
"ical-generator": "^6.0.1",
"json5": "^2.2.3",
"jsrsasign": "^10.8.6",
"jszip": "^3.10.1",
"lodash": "^4.17.21",
Expand Down

0 comments on commit 7ea99bb

Please sign in to comment.